Notacja BNF podzbioru języka C++ zaimplementowanego przez CPPreter.

 

W notacji posługujemy się następującymi formami zapisu:

 

symbol znaczenie
::==
przypisanie
[]
element może wystąpić 0 lub 1 raz (co najwyżej 1)
{}
wybierz jeden z elementów występujących (dokładnie 1 raz)
{}*
element może wystąpić 0 lub więcej razy (1 lub więcej razy)
{}+
element musi wystąpić co najmniej 1 raz (1 lub więcej razy)

 

<crlf> ::= CR LF

<cyfra_bez_zera> ::= "1" | "2" | ... | "9"

<cyfra> ::= "0" | <cyfra_bez_zera>

<liczba> ::= <liczba_calkowita> | <liczba_naturalna> | <liczba_rzeczywista>

<liczba_calkowita> ::= ["-"] <cyfra> | <cyfra_bez_zero> {<cyfra>}*

<liczba_naturalna> ::= <cyfra_bez_zero> {<cyfra>}*

<liczba_rzeczywista> ::= <liczba_calkowita> "," {<zero>}* <liczba_naturalna>

 

<litera> ::= <litera_mala> | <litera_duza>

<litera_mala> ::= "a" | "b" | ... | "z"

<litera_duza> ::= "A" | "B" | ... | "Z"

<znak> ::= <litera> | <cyfra> | "_"

<lancuch_znakowy> ::= {<znak>}*

 

<komentarz> ::= <komentarz_jednowierszowy> | <komentarz_wielowierszowy>

<komentarz_jednowierszowy> ::= "//" {<lancuch_znakowy>}* <crlf>

<komentarz_wielowierszowy> ::= "/*" {<lancuch_znakowy> <crlf>}* "*/"

<separator> ::= ";"

<identyfikator> ::= <litera> {<znak>}*

<wartosc> ::= <wartosc_rzeczywista> | <wartosc_calkowita> | <wartosc_char> | <wartosc_boolean> | <wartosc_wskaznik> | <wartosc_string> | <wartosc_tablica>

<zmienna> ::= <identyfikator>

<deklaracja_zmiennej> ::= <typ_danych> <zmienna> [<operator_przypisania> <wartosc>] <separator>

 

<typ_danych> ::= <prosty_typ_danych> | <zlozony_typ_danych>

<prosty_typ_danych> ::= <typ_calkowity> | <typ_rzeczywisty> | <typ_znakowy> | <typ_logiczny> | <typ_wskaźnikowy>

<typ_calkowity> ::= int

<wartosc_calkowita> ::= <liczba_calkowita> | <zmienna>

<typ_rzeczywisty> ::= float

<wartosc_rzeczywista> ::= <liczba_rzeczywista> | <zmienna>

<typ_znakowy> ::= char

<wartosc_char> ::= | "'"<znak>"'" | <zmienna>

<typ_logiczny> ::= bool

<wartosc_boolean>::= true | false | <zmienna>

<typ_wskaźnikowy> ::= {<typ_calkowity> | <typ_rzeczywisty> | <typ_znakowy>} <operator_wskaznik>

<wartosc_wskaznik> ::= [<operator_wskaznik>] <zmienna>

<wskaznik> ::= [<operator_adresu>] <zmienna>

<zlozony_typ_danych>::= <typ_tablicowy> | <typ_string>

<typ_tablicowy> ::= {<typ_calkowity> | <typ_rzeczywisty> | <typ_znakowy>} { "[" [<liczba_naturalna>] "]"}+

<wartosc_tablica> ::= <zmienna> [ {"[" <liczba_naturalna> "]"}+ ]

<typ_string> ::= string

<wartosc_string> ::= """ <ciag_znakow> """ | <zmienna>

 

<operator> ::= <operator_przypisania> | <operator_przypisania_złożony> | <operator_arytmetyczny> | <operator_logiczny> | <operator_indexowania> | <operator_wskaznik> | <operator_adresu> | <operator_wejscia> | <operator_wyjscia>

<operator_przypisania> ::= "="

<operator_przypisania_złożony> ::= "+=" | "-=" | "*=" | "/="

<operator_arytmetyczny> ::= <operator_arytmetyczny_dwuargumentowy> | <operator_addytywny_jednoargumentowy>

<operator_arytmetyczny_dwuargumentowy> ::= <operator_addytywny_dwuargumentowy> | <operator_multiplikatywny>

<operator_addytywny_dwuargumentowy> ::= "+" | "-"

<operator_addytywny_jednoargumentowy> ::= "++" | "--"

<operator_multiplikatywny> ::= "*" | "/" | "%"

<operator_logiczny> ::= <operator_negacji> | <operator_porównania> | <operator_boolowski>

<operator_porównania> ::= ">=" | "<=" | ">" | "<" | <operator_rownosci>

<operator_rownosci> ::= "==" | "!="

<operator_boolowski> ::= "&&" | "||"

<operator_negacji> ::= "!"

<operator_indexowania>::="[" | "]"

<operator_wskaznik> ::= "*"

<operator_adresu> ::= "&"

<operator_wejscia> ::= "cin>>"

<operator_wyjscia> ::= "cout<<"

 

<skladnik> ::= <zmienna> | <liczba>

<wyrazenie> ::= <wyrazenie_arytmetyczne> | <wyrazenie_logiczne>

<wyrazenie_arytmetyczne> ::= {"("}* <skladnik> {")"}* { <operator_arytmetyczny_dwuargumentowy> {"("}* <skladnik> }+ {")"}*

<wyrazenie_boolowskie> ::= {<operator_negacji>}* {"true" | "false"}

<wyrazenie_porownania> ::= {"(" | <operator_negacji>}* <wyrazenie_rownosci> | { {<wyrazenie_arytmetyczne> | <skladnik>} {")"}* <operator_porownania> {"("}* {<wyrazenie_arytmetyczne> | <skladnik>} }+ {")"}*

<wyrazenie_rownosci> ::= {<wyrazenie_boolowskie> | <zmienna>} {")"}* <operator_rownosci> {<operator_negacji> | "("}* {<wyrazenie_boolowskie> | <zmienna>}

<wyrazenie_logiczne> ::= {"(" | <operator_negacji>}* {<wyrazenie_porownania> | <wyrazenie_boolowskie> | <zmienna>} {")"}* {<operator_boolowski> {"(" | <operator_negacji>}* {<wyrazenie_porownania> | <wyrazenie_bolowskie> | <zmienna>} }+ {")"}*

 

<instrukcja> ::= {<deklaracja_zmiennej> | <instrukcja_przypisania> | <instrukcja_wej_wyj> | <instrukcja_petli> | <instrukcja_warunkowa> | <instrukcja_return> <separator>} | <instrukcja_nop>

<instrukcja_petli> ::= <instrukcja_for> | <instrukcja_while>

<instrukcja_for> ::= "for" "(" [<deklaracja_zmiennej> | <instrukcja_przypisania>] <separator> [<wyrazenie_logiczne>] <separator> [<instrukcja_przypisania_zlozona>] ")" <blok_instrukcji>

<instrukcja_while> ::= "while" "(" <wyrazenie_logiczne> ")" <blok_instrukcji>

<instrukcja_warunkowa> ::= "if" "(" <wyrazenie_logiczne> ")" <blok_instrukcji> ["else" <blok_instrukcji>]

<instrukcja_przypisania> ::= <zmienna> <operator_przypisania> {<wartosc> | <zmienna> | <wyrazenie>}

<instrukcja_przypisania_zlozona> ::= <zmienna> <operator_addytywny_jednoargumentowy> | <zmienna> <operator_przypisania_zlozony> {<zmienna> | <wartosc> | <wyrazenie_arytmetyczne>}

<instrukcja_return> ::= "return" [<wartosc>]

<instrukcja_wej_wyj> ::= {<operator_wejscia> <zmienna> | <operator_wyjscia> {<wyrazenie> | <lancuch_znakowy>}}

<instrukcja_nop> ::= {<separator>}+

 

<blok_instrukcji> ::= "{" {<instrukcja>|<blok_instrukcji>}+ "}"

 

<nazwa_zbioru> ::= {" " " <identyfikator> " " " | "<" <identyfikator> " > "}

<dyrektywa_dolaczenia> ::= "#include" <nazwa_zbioru>

<dyrektywy> ::= <dyrektywa_dolaczenia>

<parametr> ::= <deklaracja_zmiennej>

<program> ::= <dyrektywy> <crlf> <typ_danych> "main(" [ <parametr> { "," <parametr> }* ] ")" [ <crlf> ] <blok_instrukcji>