====== 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ů