Nepovinné else: Porovnání verzí

Smazaný obsah Přidaný obsah
m přidána Kategorie:Operátory za použití HotCat
Oprava formulací
Řádek 19:
== Odstranění nejednoznačnosti beze změny syntaxe ==
 
Při [[konstrukce překladače|konstrukci překladačů]] mnoha jazyků je třeba řešitnutné problém nejednoznačnosti nepovinného else vyřešit, zvláště při současném provádění lexikální a syntaktické analýzy. Obvykle se nepovinné else přiřazuje k nejbližšímu předchozímu if příkazu,<ref name="Bison Manual">[http://www.gnu.org/software/bison/manual/html_node/Shift_002fReduce.html#Shift_002fReduce 5.2 Shift/Reduce Conflicts] z WWW serveru [[GNU Operating System]]</ref>, dovolujícídíky pročemuž jednoznačnýbude bezkontextovýbezkontextová gramatiky,gramatika konkrétnějazyka jednoznačná. Tento přístup používají programovací jazyky jako [[Pascal (programovací jazyk)|Pascal]]<ref>ISO 7185:1990 (Pascal) 6.8.3.4: ''Za podmíněným příkazem if bez else části nesmí bezprostředně následovat slovo else.''</ref>, a[[C (programovací jazyk)|C]]<ref>[http://www.open-std.org/jtc1/sc22/wg14/www/standards ISO 9899]:1999 (C): 6.8.4.1(3): "Else jepatří spojenák slexikálně lexicallynejbližšímu nearest předchozípředchozímu if, které je povolen bysyntaxe syntaxpovoluje.", dostupnýdostupné vna [http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf WG14 N1256], p. 134</ref> a [[Java (programovací jazyk)|Java]]<ref>{{citace elektronické monografie | titul = The Java Language Specification, Java SE 9 Edition, 14.5. Statements | url=https://docs.oracle.com/javase/specs/jls/se9/html/jls-14.html | ref = jls-14.5}}</ref>, takže jejich sémantika neníje v tomto bodě nejednoznačnájednoznačná, přestože použití generátoru syntaktických analyzátorů může vést k nejednoznačné ''gramatice''. VPokud tomtoje případě lzetřeba dosáhnout jiného seskupení, explicitnímlze použitímexplicitně bloků,použít jakobloky například(složené příkazy), např. <code>begin...end</code> v jazyce Pascal<ref>''Pascal,'' Nell Dale a Chip Weems, "Dangling Else", [http://books.google.com/books?id=5x2k4vWwn1wC&pg=PA160 p. 160–161]</ref> nebo <code>{...}</code> v jazyce C.
 
V závislosti na přístupu ke konstrukci překladače lze provést různé korekce, které zabráňujízabraňují nejednoznačnosti:
 
* Pokud je analyzátor vytvořený generátorem SLR, LR(1) nebo LALR [[LR syntaktický analyzátor|syntaktických analyzátorů]], programátor se často spoléhá na to, že generovaný analyzátor dává v případě konfliktu přednost přesunu před redukcí<ref name="Bison Manual"/>. Jinou možností je přepsat gramatiku tak, aby se konflikt odstranil, na úkor zvětšení velikosti gramatiky (viz [[#Odstranění konfliktu v LR analyzátory|níže]]).
* Pokud je analyzátor vytvořený prořezávacím generátorem ({{Vjazyce|en}} {{Cizojazyčně|en|''Pruning and Deep Pruning LR generator''}}), je možné použít direktivy, které nejednoznačnosti zcela vyříznou nejednoznačnosti.<ref name="Pruning in Wormhole">http://www.mightyheave.com/blog/?p=17#more-17</ref>
* Pokud je analyzátor napsaný ručně, programátor může použít ''jednoznačnou'' bezkontextovou gramatiku, případně může použít jinou než bezkontextovou gramatiku nebo [[gramatika pro analýzu výrazů|gramatiku pro analýzu výrazů]].
 
Řádek 36:
* Zakázat, aby za „then“, mohl být příkaz „if“ (tento příkaz však může být uzavřen v příkazových závorkách). Tento přístup používá [[ALGOL 60]]<ref>''4.5.1 Conditional Statements — Syntax'' v P. Nauer (ed.), ''Revised Report on the Algorithmic Language ALGOL 60'', CACM 6,1, 1963 stránky 1-17</ref> a [[Python (programovací jazyk)|Python]]<ref>[https://docs.python.org/reference/grammar.html Python Language Reference, 9. Full Grammar Specification]</ref>.
 
* Požadovat složenýchpoužití závorek (parenthesizing)bloku, pokud „else“ následuje "if".<ref>[http://code.google.com/p/copute/issues/detail?id=21#c1 Nejednoznačnost nepovinného else: vyžaduje složené závorky, když else následuje za if následuje else]</ref>
 
* Požadovat, aby každý "if" byl párován s „else“.