while_stat : "while" "(" expr ")" stat ; if_stat : "if" "(" expr ")" stat ( "elif" "(" expr")" stat )* ( "else" stat )? ; compound_stat : "{" ( stat )* "}" ; simple_stat : expr ";" ; empty_stat : ";" ; stat : while_stat | if_stat | compound_stat | simple_stat | empty_stat ; simple_expr : identifier | number | "(" expr ")" ; mult_expr : simple_expr ( ("*"|"/") simple_expr )* ; add_expr : mult_expr ( ("+"|"-") mult_expr )* ; expr : add_expr ( "," expr )? ;
rule_name : rule_expression ;
Terminální symboly představují klíčová slova nebo oddělovače.
Zapisují se v jednoduchých nebo dvojitých uvozovkách.
"while" "(" ")"
Neterminální symboly zapisujeme pomocí identifikátorů bez uvozovek.
Jsou to jména syntaktických pravidel,
nebo jména “skupinových” lexikálních symbolů (identifier, number, real_number, character_literal, string_literal).
expr
Jednotlivé alternativy oddělujeme svislou čarou |
Alternativa může být i prázdná.
stat : while_stat | if_stat | compound_stat ;
( "*" | "/" )
( "else" stat ) ?
Zavorka s otazníkem ( )? dovoluje opakování 0 nebo 1 krát.
( stat )*
Závorka s hvězičkou ( )* dovoluje opakování 0, 1, 2, … libovolně krát.
( stat )+
Závorka s plusem ( )+ dovoluje opakování 1, 2, … libovolně krát.
( A )? můžeme zapsat pomocí obyčejných závorek a prázdné alternativy.
( A | )
( A )+ nahradíme pomocným symbolem B
B : A | B A ;
( A )* nahradíme pomocným symbolem C
C : | C A ;
C je nic nebo C následované A
Místo kulatých závorem můžeme vždy nadefinovat nějaký pomocný symbol.
A svislou čáru nemusíme používat, pokud dovolíme několik pravidel se stejným jménem před dvojtečkou.
Dva předcházející příklady zapíšeme následovně:
B : A; B : B A ;
C : ; C : C A ;
Tím naše pravidla můžeme převédst na tvar často používaný v literatuře
(místo dvojtečky se používá šipka, jednotlivá pravidla na samostatnou řádku, středník se nepoužívá)
jméno definovaného neterminálu -> posloupnost (i prázdná) terminálních a neterminálních symbolů