cyfra			= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

wielka_litera		= "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | 
			  "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z"

mala_litera		= "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | 
			  "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z"

znak 			= "+" | "-"

slowo_kluczowe 		= main|int|float|bool|cout|cin|while|if|else|true|false|char|string|endl|break

liczba_naturalna	= {cyfra}

liczba_calkowita	= [znak]{cyfra}

liczba_rzeczywista	= [znak]{cyfra}["."{cyfra}]

liczba_logiczna		= ("true" | "false") | ("0" | "1")

liczba			= liczba_naturalna | liczba_calkowita | liczba_rzeczywista

identyfikator		= "_" | wielka_litera | mala_litera {"_" | wielka_litera | mala_litera | cyfra}

typ			= "int" | "float" | "char" | "bool" | "string" | "void"

cudzyslow		= " 

nawias_lewy		= "("

nawias_prawy		= ")"

nawias_lewy_ostry	= "["

nawias_prawy_ostry	= "]"

nawias_lewy_klamrowy	= "{"

nawias_prawy_klamrowy	= "}"

operator_zaprzeczenia	= "!"

operator_logiczny	= "||" | "&&" | "and" | "or"

operator_arytmetyczny	= "+" | "-" | "/" | "*" | "%"  

operator_porownania	= ">" | "<" | ">=" | "<=" | "!=" | "=="

operator_przypisania	= "=" 
				
operator_przyp_aryt	= "+=" | "-=" | "*=" | "%=" | "/="

operator_jednarg	= "++" | "--"

srednik			= ";"

instrukcja_pusta	= 

instrukcja_arytmetyczna = [typ] identyfikator {operator_arytmetyczny (identyfikator | liczba )} srednik

instrukcja_bezarg	= identyfikator operator_jednarg srednik

deklaracja_zmiennej	= typ identyfikator [instrukcja_przypisania{(identyfikator|liczba)[operator_arytmetyczny(identyfikator|liczba)]}] srednik

instrukcja_wypisania	= "cout<<"{cudzyslow identyfikator cudzyslow)|identyfikator|liczba|"<<"|"endl"srednik}srednik

instrukcja_wczytania	= "cin>>"identyfikator srednik

instrukcja_prosta	= instrukcja_pusta | instrukcja_arytmetyczna | instrukcja_bezarg | deklaracja_zmiennej | instrukcja_wypisania |instrukcja_wczytania | instrukcja_pusta

instrukcja_zlozona	= {instrukcja_prosta}

warunek			= nawias_lewy([operator_zaprzeczenia]identyfikator)|liczba[{(operator_logiczny|operator_porownania)(identyfikator|liczba)}] nawias_prawy

instrukcja_warunkowa	= "if" warunek (instrukcja_prosta | nawias_lewy_klamrowy instrukcja_zlozona nawias_prawy_klamrowy | instrukcja_pusta)[{"else if" warunek(instrukcja_prosta|nawias_lewy_klamrowy instrukcja_zlozona nawias_prawy_klamrowy|instrukcja_pusta)}] ["else" warunek (instrukcja_prosta|nawias_lewy_klamrowy instrukcja_zlozona nawias_prawy_klamrowy| 			  			  instrukcja_pusta)]   

petla			= "while" ((warunek nawias_klamrowy_lewy (instrukcja_zlozona|instrukcja_prosta) nawias_klamrowy_prawy)|instrukcja_prosta)

instrukcja 		= instrukcja_prosta | instrukcja_zlozona | instrukcja_warunkowa | petla

blok			= {instrukcja}

program			= "main()" nawias_klamrowy_prawy blok nawias_klamrowy_lewy