LR analyzátor
LR analyzátor je druh analyzátoru pro kontext-uvolnit gramatiky to je velmi běžně používané počítačem programovací jazyk kompilátoři (a jiné sdružené nástroje). LR analyzátory četly jejich vstup od Left spravovat a produkovat Rightmost původ (od této doby LR, vyrovnat se LL analyzátoru). Termín “LR (k) analyzátor” je také používán; tady k se odkazuje na množství unconsumed “pohled dopředu” symboly vstupu, které jsou použity ve výrobě rozebrat rozhodnutí. Obvykle k je 1 a je často vynechán. Kontext-volná gramatika je nazývána LR (k) jestliže tam existuje LR (k) analyzátor pro to.V typickém užívání když my se odkazujeme na LR analyzátor my znamenáme zvláštní analyzátor schopný rozpoznávat zvláštní jazyk specifikovaný kontextem uvolnit gramatiku. To není neobvyklé, nicméně, se odkazovat na LR analyzátor znamenat program řidiče, který může být zásobený vhodným stolem produkovat široké množství různých zvláštních LR analyzátorů.
LR rozebrat má mnoho výhod:
- Doslova všechny programovací jazyky mohou být rozloženy používat LR analyzátor (nebo malá variace thereof).
- LR analyzátory mohou být realizovány velmi efektivně.
- Všech analyzátorů, které snímají jejich vstup zanechal správně, LR analyzátory objeví syntaktické chyby (to je, když jejich vstup neodpovídá gramatice) jak brzy jako to možný dělat.
| Tabulka s obsahem |
| 1 architektura LR analyzátorů 2 budovat LR (0) rozebrat stoly |
Stůl-založený vzestupný analyzátor může být schématicky představován jak v čísle 1.
+ -- - + -- - + -- - + -- - + Vstup: | 1 | + | 1 | $ | + -- - + -- - + -- - + -- - + ^ | Stack: | + -- -- -- -- -- + + -- - + | | | 6 | Výstup + -- - + | | | 3 | + -- -- -- -- -- + + -- - + | | 0 | + -- + -- -- -- -- + + -- - + | | + -- -- -- -- -- + + -- -- -- -- -- + | Akce | | Goto | | stůl | | stůl | + -- -- -- -- -- + + -- -- -- -- -- + |
Číslo 1. architektura stolu-založený vzestupný analyzátor |
- (1) E a rarr; E * B
- (2) E a rarr; E + B
- (3) E a rarr; B
- (4) B a rarr; 0
- (5) B a rarr; 1
Akce a stůl Gota
Dva LR (0) rozebrat stoly pro tento pohled gramatiky takto:
| akce | goto | |||||||
| stát | * | + | 0 | 1 | $ | E | B | |
| 0 | s1 | s2 | 3 | 4 | ||||
| 1 | r4 | r4 | r4 | r4 | r4 | |||
| 2 | r5 | r5 | r5 | r5 | r5 | |||
| 3 | s5 | s6 | acc | |||||
| 4 | r3 | r3 | r3 | r3 | r3 | |||
| 5 | s1 | s2 | 7 | |||||
| 6 | s1 | s2 | 8 | |||||
| 7 | r1 | r1 | r1 | r1 | r1 | |||
| 8 | r2 | r2 | r2 | r2 | r2 | |||
Stůl akce je indexován stavem analyzátoru a terminálem (včetně terminálu speciality $ to ukáže konec potoku vstupu) a obsahuje tři druhy akcí: posun to je psáno jak ' sn ' a ukáže, že příští stát je n, se snížit to je psáno jak ' rm ' a ukáže to redukce s mluvnickým pravidlem m should být vykonáván a přijmout to to je psáno jak ' acc ' a inidcates že analyzátor přijímá řetězec v potoku vstupu.
Goto stůl je indexován stavem analyzátoru a nonterminal a jednoduše ukáže co příští stav analyzátoru bude jestliže to rozpoznalo jistý nonterminal.
LR rozebrat algoritmus nyní pracuje takto:
- Hromada je inicializována s [ 0 ]. Dnešní stav bude vždy být stát, který je nahoře hromady.
- Daný dnešní stav a aktuální terminál na vstupu dělí akce je vyhledána v akční tabulce. Jsou tam čtyři případy:
- posun sn :
- aktuální terminál je odstraněn od potoku vstupu, a
- stát n je tlačil se na hromadě a stane se současným stavem,
- se snížit rm:
- číslo m je psán k potoku výstupu,
- pro každý symbol v pravé straně pravidla m stát je odstraněn od hromady a
- daný stát to je pak nahoře hromady a left-hand strana pravidla m nový stát je vyhledán v goto tabulce a dělal nový dnešní stav tím, že tlačí to na hromadě.
- přijmout to: řetězec je přijímán
- žádná akce: syntaktická chyba je ohlásena
- posun sn :
- Předchozí krok je opakován, než řetězec je přijímán nebo syntaktická chyba je ohlásena.
Vysvětlit to proč tento algoritmus pracuje my teď pokračujeme s představením jak řetězec jako “1 + 1” by byl rozebrán takový analyzátor. Když analyzátor začne to vždy začíná počátečním stavem 0 a následující hromada:
- [ 0 ]
- [ 0 ' 1 ' 2 ]
V stavu 2 stůl akce říká, že kterýkoliv terminál, který my vidíme na potoku vstupu my bychom měli dělat redukci s mluvnickým pravidlem 5. Jestliže stůl je správný pak toto znamená, že analyzátor jen rozpoznal pravou stranu pravidla 5, který je opravdu případ. Tak v tomto případě my píšeme 5 k potoku výstupu, vyjmout jeden stát od hromady a tlak na hromadě stát od buňky v goto stolu pro stát 0 a B, tj., stát 4, na hromadě. Výsledná hromada je:
- [ 0 B 4 ]
- [ 0 E 3 ]
- [ 0 E 3 ' + ' 6 ]
Příští terminál je nyní ' 1 ' a toto znamená, že my vykonáváme posun a jdeme do státu 2:
- [ 0 E 3 ' + ' 6 ' 1 ' 2 ]
- [ 0 E 3 ' + ' 6 B 8 ]
- [ 0 E 3 ]
Konstrukce těchto rozebrat stoly je založený na pojmu LR (0) položka (jednoduše volal položku tady) který být mluvnická pravidla se zvláštní tečkou sčítala někde v pravé straně. Například pravidlo E a rarr; E + B má pokračování čtyři korespondenční položky:
- E a rarr; · E + B
- E a rarr; E · + B
- E a rarr; E + · B
- E a rarr; E + B ·
To je obvykle nemožné charakterizovat stav analyzátoru s jedinou položkou, protože to nemůže vědět to v zálohách, které rozhodnou, že to jde do použití pro redukci. Například jestliže tam je také pravidlo E a rarr; E * B pak položky E a rarr; E · + B a E a rarr; E · * B oba si zažádají po řetězci dopisovat si s E byl čten. Proto my budeme charakterizovat stav analyzátoru souborem položek, v tomto případě soubor {E a rarr; E · + B, E a rarr; E · * B}.
Položka s bodem v předku nonterminal, takový jak E a rarr; E + · B, ukáže, že analyzátor čeká, že rozebere nonterminal B příští. Zajistit položku soubor obsahuje všechna možná pravidla analyzátor může být uprostřed rozebrat, to musí zahrnovat všechny položky popisovat jak B sám bude rozebraný. Toto znamená to jestliže tam jsou pravidla takový jak B a rarr; 1 a B a rarr; 0 pak soubor položky musí také zahrnovat položky B a rarr; · 1 a B a rarr; · 0. Obecně toto může být vytvořeno takto:
- Jestliže tam je položka formy a rarr; v·Bw v položka zapadla a v gramatice je pravidlo formy B a rarr; w ' pak položka B a rarr; · w ' should také být v souboru položky.
Předtím my začneme určovat přechody mezi různými státy, gramatika je vždy rozšířena se zvláštním pravidlem
- (0) S a rarr; E
Pro náš příklad my vezmeme stejnou gramatiku jako dříve a zvýšíme to:
- (0) S a rarr; E
- (1) E a rarr; E * B
- (2) E a rarr; E + B
- (3) E a rarr; B
- (4) B a rarr; 0
- (5) B a rarr; 1
Nacházet dostupné položkové soubory a přechody mezi nimi
První krok budovat stoly sestává z určovat přechody mezi uzavřenými položkovýma soubory. Tyto přechody budou předurčené jak jestliže my zvažujeme konečný automat, který může číst terminály také jako nonterminals. Začít stav tohoto automatu je vždy uzavření první položky většího pravidla: S a rarr; · E:
- Položka zapadla 0
- S a rarr; · E
- + E a rarr; · E * B
- + E a rarr; · E + B
- + E a rarr; · B
- + B a rarr; · 0
- + B a rarr; · 1
Začínat od začít stát my budeme nyní určovat všechny státy, které mohou být podávány od tohoto státu. Možné přechody pro soubor položky mohou být najity tím, že se dívá na symboly (terminály a nonterminals) my objevíme těsně za tečkami; v případě souboru položky 0 tito jsou terminály ' 0 ' a ' 1 ' a nonterminal E a B. To shledá položka dala to symbol x vede k my řídíme se následujícím postupem:
- Vzít soubor všech položek v aktuálním položkovém souboru kde tam je tečka v přední straně x.
- Pohybovat se ve všech těchto položkách pozadí tečky x.
- Zavřete výsledný soubor položek.
- Položka zapadla 1
- B a rarr; 0 ·
- Položka zapadla 2
- B a rarr; 1 ·
- Položka zapadla 3
- S a rarr; E ·
- E a rarr; E · * B
- E a rarr; E · + B
- Položka zapadla 4
- E a rarr; B ·
- Položka zapadla 5
- E a rarr; E * · B
- + B a rarr; · 0
- + B a rarr; · 1
- Položka zapadla 6
- E a rarr; E + · B
- + B a rarr; · 0
- + B a rarr; · 1
- Položka zapadla 7
- E a rarr; E * B ·
- Položka zapadla 8
- E a rarr; E + B ·
| soubor položky | * | + | 0 | 1 | E | B | |
| 0 | 1 | 2 | 3 | 4 | |||
| 1 | |||||||
| 2 | |||||||
| 3 | 5 | 6 | |||||
| 4 | |||||||
| 5 | 1 | 2 | 7 | ||||
| 6 | 1 | 2 | 8 | ||||
| 7 | |||||||
| 8 |
Od tohoto stolu a najitých položkových souborů my vybudujeme děj a goto stůl takto:
- sloupce pro nonterminals jsou kopírovány ke stolu goto
- sloupce pro terminály jsou kopírovány ke stolu akce jako akce posunu
- zvláštní sloupec pro ' $ ' (konec vstupu) je přidán ke stolu akce, který obsahuje acc pro každý soubor položky, který obsahuje S a rarr; E ·.
- jestliže položka zapadla i obsahuje položku formy a rarr; w · a a rarr; w je pravidlo m s m > 0 pak řádek pro stát i při práci stůl je kompletně naplněný s redukovat akci rm.
Poznámka o LR (0) proti SLR a LALR rozebrat
Si všimnout toho se snížit akce produkovaly nad procedurou vždy zabírat celou stolní řadu, vyvolání snížení nastat bez ohledu na příští symbol v potoku vstupu. Toto je proč tito jsou LR (0) rozebrat stoly: oni jsou jen vhodní k gramatikám, které nevyžadují lookahead. Gramatika, která potřebuje, aby lookahead disambiguate redukce by potřebovala řadu stolu obsahovat různý redukovat akce v různých sloupcích, a nahoře procedura není schopná vytvářet takové řady.
Refinements k LR (0) předložit proceduru stavby (jmenovitě SLR, LALR) být schopný postavit redukovat akce, které nezabírají celé řady. Proto, oni jsou schopní vykonávat různé redukce (nebo dokonce se posune) od stejného analyzátorového státu pro různé vstupní symboly, dovolit jim rozebrat gramatiky ne parseable LR (0) stůl.
Konflikty v postavených stolech
Automat, který je postaven je mimochodem to je budováno vždy deterministický automat. Nicméně, když se snížit akce jsou přidány ke stolu akce to může stát se, že stejná buňka je vyplněna s redukovat akci a akci posunu ( posun-redukovat konflikt) nebo s dva různý redukovat akce ( se snížit-redukovat konflikt). Nicméně, to může být ukazováno to když toto se stane gramatika není LL (0) gramatika.
Malý příklad non-LL (0) gramatika s posunem-se snížit konflikt je:
- (1) E a rarr; 1 E
- (2) E a rarr; 1
- Položka zapadla 1
- E a rarr; 1 · E
- E a rarr; 1 ·
- + E a rarr; · 1 E
- + E a rarr; · 1
Malý příklad non-LL (0) gramatika s se snížit-se snížit konflikt je:
- (1) E a rarr; 1
- (2) E a rarr; B 2
- (3) a rarr; 1
- (4) B a rarr; 1
- Položka zapadla 1
- A rarr; 1 ·
- B a rarr; 1 ·
Oba příklady nahoře mohou být řešeny tím, že nechá použití analyzátoru následovat soubor (viz LL analyzátor) nonterminal se rozhodnout jestliže to bude používat jednoho s pravidla pro redukci; to bude jen používat pravidlo a rarr; w pro redukci jestliže příští symbol na potoku vstupu je v následovat soubor . Toto řešení vyústí v takzvané jednoduché LR analyzátory.