====== Gramatika popisující příkazy zjednodušeného jazyka C =====
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 )? ;
=== Syntaktická pravidla ===
rule_name : rule_expression ;
=== Terminální symboly ===
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 ===
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
=== Alternativy ===
Jednotlivé alternativy oddělujeme svislou čarou **|** \\
Alternativa může být i prázdná.
stat : while_stat | if_stat | compound_stat ;
( "*" | "/" )
=== Volitelné sekce ( )? ===
( "else" stat ) ?
Zavorka s otazníkem ** ( )? ** dovoluje opakování **0** nebo **1** krát.
=== Libovolné opakování ( )* ===
( stat )*
Závorka s hvězičkou ** ( )* ** dovoluje opakování **0**, **1**, **2**, … libovolně krát.
=== Opakování alespoň jednou ( )+ ===
( stat )+
Závorka s plusem ** ( )+ ** dovoluje opakování **1**, **2**, … libovolně krát.
=== Poznámka: závorky ( ), ( )*, ( )+ ani ( )? nezbytně nepotřebujeme ===
( **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ů