Zakres funkcjonalny interpretera: 

1) deklaracja zmiennych i stałych globalnych 
2) operacje wejścia - wyjścia: read, write (wczytywanie z klawiatury i wypisywanie na ekran) 
3) proste operacje arytmetyczne: dodawanie, odejmowanie, mnożenie, dzielenie 
4) operacja przypisania: := 
5) operacje porównania: <, >, =, <> 
6) początek/ koniec bloku: begin, end 
7) komentarz: {, } 
8) operacja warunkowa: if then 
9) pętla: for to do
10) dynamiczna alokacja pamięci 

Notacja BNF

::= - przypisanie 
[] - element może wystąpić 0 lub 1 raz (co najwyżej 1 raz) 
{} - wybierz jeden z elementów występujących (dokładnie 1 raz) 
{}+ - element musi wystąpić co najmniej 1 raz (1 lub więcej razy) 
{}* - element może wystąpić 0 lub więcej razy (0 lub więcej razy) 
<> - zostało zdefiniowane wcześniej (lub pózniej)

Akceptowane znaki

cyfra::= {0|1|2|3|4|5|6|7|8|9} 
liczba_calk::= <cyfra> {<cyfra>}* 
liczba_nat::= {0|1|2|3|4|5|6|7|8|9}+ 
liczba_zmiennop::= {<cyfra>}+ <separator_dzies> {<cyfra>}* 
liczba::= {<liczba_calk> | <liczba_zmiennop>
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}
duza_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} 
litera::= {<mala_litera> | <duza_litera>
znak::= {<cyfra> | <litera> | _} 
nazwa::= <litera> {<znak>}* 
spacja::= {" "} 
cudzyslow::= {"} 
ciapek::= {'} 
daszek::= {^}
znak_inny::= {~|!|@|#|$|%|^|&|*|(|)|-|+|=|[|]|{|}|;|:|<|>|,|.|/|?|\|"|"|<spacja>} 
wszystkie::= {<znak> | {<znak_inny>}*} 

Operatory i symbole

op_rowna::= { = }
op_mat::= { +|-|*|/ } 
op_jedno::= { + | - }
op_int::= { +|-|* }
op_plus::= { + }
op_rel::= { <|>|=|>=|<=|<> } 
op_log::= { or | and }
op_przyp::= { := }
nawias_o_o::= { ( }
nawias_o_z::={ ) }
nawias_k_o::={ [ }
nawias_k_z::={ ] } 
klamra_otwierajaca::={ { | (* } 
klamra_zamykajaca::={ } | *) } 
separator_dzies::={ . } 
przecinek::={ , }
sep_zd::= { ; }
sep_dek::= { : }

Słowa kluczowe:

s_program::= { program }
s_begin::= { begin }
s_end::= { end }
s_not::= { not }
s_const::= { const }
s_var::= { var } 
s_if::= { if }
s_then= { then } 
s_else::= { else } 
s_for::= { for } 
s_to::= { to }
s_do::= { do }
s_new::= { new }
zwal_pam::= { dispose }
op_we::= { read | readln }
op_wy::= { write | writeln }
st_tr_fa::= { true | false }

Ad 1

typ_zm::= { integer | real | string | boolean | char }

nazwa_gl::= {<nazwa>}

zm_gl::= <nazwa_gl> <sep_dek> <typ_zm> <sep_zd>
    <nazwa_gl> <sep_dek> <daszek> <typ_zm> <sep_zd> |
    <nazwa_gl> { <przecinek> <nazwa_gl> }*  <sep_dek><typ_zm><sep_zd>

dekl_zmienych::= <s_var> { <zm_gl> }+

st_gl::= <nazwa_gl> <op_rowna> { <liczba> | <st_tr_fa> | <ciapek> { <znak> }* <ciapek> } <sep_zd>
    <nazwa_gl> <sep_dek> <typ_zm> <op_rowna> { <liczba> | <st_tr_fa> | <ciapek> { <znak> }* <ciapek> } <sep_zd>

dekl_stalych::= <s_const> { <st_gl> }+

Ad 2

czyt::= <op_we> <naw_o_o> <nazwa_gl> <naw_o_z> <sep_zd>
pis::= <op_wy> <naw_o_o> { <nazwa_gl> | <liczba> | <st_tr_fa> | <ciapek> { <znak> }* <ciapek> } <naw_o_z> <sep_zd>

Ad 3 

zm_bool::= [ <s_not> ] { <nazwa_gl> | <st_tr_fa>
zm_str::= [ <op_plus>] { <nazwa_gl> | <ciapek> { <znak> }* <ciapek> }
zm_int::= [ <op_jedno> ] { <nazwa_gl> | <liczba_calk> }
zm_rea::= [ <op_jedno> ] { <nazwa_gl> | <liczba_zmiennop> }

oper_bool::= [ <nawias_o_o> ] <zm_bool> <op_log> <zm_bool> [ <nawias_o_z>
    { <op_log> [ <nawias_o_o> ] <zm_bool> <op_log> <zm_bool> [ <nawias_o_z> ] }*

oper_str::= [ <nawias_o_o> ] <zm_str> <op_plus> <zm_str> [ <nawias_o_z>
    { <op_plus> [ <nawias_o_o> ] <zm_str> <op_plus> <zm_str> [ <nawias_o_z> ] }*

oper_int::= [ <nawias_o_o> ] <zm_int> <op_int> <zm_int> [ <nawias_o_z>
    { <op_int> [ <nawias_o_o> ] <zm_int> <op_int> <zm_int> [ <nawias_o_z> ]}*

oper_rea::= [ <nawias_o_o> ] <zm_rea> <op_mat> <zm_rea> [ <nawias_o_z>
    { <op_mat> [ <nawias_o_o> ] <zm_rea> <op_mat> <zm_rea> [ <nawias_o_z> ] }*

operacja_arytm::= <nazwa_gl> <op_przyp> { <oper_bool> | <oper_str> | <oper_int> | <oper_rea> } <sep_zd>

Ad 4

operacja_przyp::= <nazwa_gl> <op_przyp> { <liczba> | <nazwa_gl> | <st_tr_fa> | <ciapek> { <znak> }* <ciapek> } <sep_zd>

Ad 5

por_bool::= <zm_bool> <op_log> <zm_bool> { <op_log> <zm_bool> <op_log> <zm_bool> }*
por_str::= <zm_str> <op_plus> <zm_str> { <op_plus> <zm_str> <op_plus> <zm_str> }*
por_int::= <zm_int> <op_int> <zm_int> { <op_int> <zm_int> <op_int> <zm_int> }*
por_rea::= <zm_rea> <op_mat> <zm_rea> { <op_mat> <zm_rea> <op_mat> <zm_rea> }*

operacja_por::= { <por_bool> <op_rel> <por_bool> | <por_str> <op_rel> <por_str> |
<por_int> <op_rel> <por_int> | <por_rea> <op_rel> <por_rea> }

Ad 6

blok::= <s_begin> <operacje> <s_end> <sep_zd> | <s_begin> <operacje> <s_end> <separator_dzies>

Ad 7

komentarz::= <klamra_otwierajaca> <tekst komentarza> <klamra_zamykajaca>

Ad 8

operacja_warunkowa::= <s_if> <operacja_por> <s_then> <blok>

Ad 9

petla::= <s_for> <operacja_arytm> <s_to> { <nazwa_gl> | <st_tr_fa> | <ciapek> <znak> <ciapek> 
   | <liczba_calk> }+ <s_do> <blok>

Ad 10

zm_dyn::= <s_new> <nawias_o_o> <nazwa_gl> <nawias_o_z> <sep_zd>
pob_zm_dyn::= <zm_gl> <daszek> <sep_zd>
niszcz_zm_dyn = <zwal_pam> <nawias_o> <zm_gl> <nawias_o> <sep_zd>


operacje::= <czyt_pis> | <operacja_arytm> | <operacja_przyp> | <blok> | <komentarz> | <petla> |
    <operacja_warunkowa> | <zm_dyn> | <pob_zm_dyn> | <niszcz_zm_dyn>