LR0) syntaktické analyzátory doc. RNDr. Ľubomír Dedera
Učebné otázky LR0) automat a jeho konštrukcia Konštrukcia tabuliek ACION a GOO LR0) syntaktického analyzátora
LR0) syntaktický analyzátor Sám osebe nemá veľký praktický význam Dá sa skonštruovať len pre veľmi obmedzenú triedu gramatík Dajú sa na ňom vysvetliť princípy používané aj u silnejších typoch LR syntaktických analyzátorov SLR1), LALR1), LR1)) Na rozhodnutie, akú akciu vykonať tabuľka ACION), sa nevyužíva aktuálny vstupný symbol, ale len stav na vrchu zásobníka tzn. história syntaktickej analýzy) Konštrukcia LR0) syntaktického analyzátora: 1. Konštrukcia LR0) automatu 2. Konštrukcia tabuliek ACION a GOO LR0) syntaktického analyzátora na základe vytvoreného LR0) automatu
LR0) automat Alternatívne pomenovania: CFSM Characteristic Finite State Machine), charakteristický automat syntaktického analyzátora Konštruuje sa k zadanej bezkontextovej gramatike G = N,, P, S), ku ktorej chceme zostrojiť LR0) príp. SLR1) alebo aj LALR1)) syntaktický analyzátor Jedná sa o automat, ktorý pomocou svojich stavov rozpoznáva časti pravých strán jednotlivých praviel gramatiky využíva sa na určovanie toho, aké časti ktorých praviel sa nachádzajú na vrchu zásobníka do zásobníka syntaktického analyzátora sa teda ukladajú stavy LR0) automatu pozri predchádzajúcu prednášku)
Stavy LR0) automatu Stavy LR0) automatu obsahujú množiny LR0) položiek LR0) položka je zápis tvaru A X 1... X i X i+1... X j, pričom A X 1... X i X i+1... X j P stav i S ) + ) LR0) položka je vlastne pravlo obsahujúce na niektorej pozícii na pravej strane symbol vyjadruje, aká časť pravej strany príslušného pravla bola príslušným stavom rozpoznaná a nachádza sa na vrchu zásobníka) Špeciálne: na začiatku pravej strany indikuje, že na vrchu zásobníka sa ešte nenachádza ani jeden symbol z pravej strany pravla napr. ) na konci pravej strany pravla indikuje, že na vrchu zásobníka sa nachádza celá pravá strana príslušného pravla, čím prichádza do úvahy redukcia podľa príslušného pravla napr. + ) Každý stav teda vyjadruje potenciálne časti pravých strán všetkých praviel, ktoré sa v danej chvíli môžu nachádzať na vrchu zásobníka
Uzáver množiny LR0) položiek Closure0) Cieľ prať do množiny LR0) položiek tzn. stavu) také položky, ktoré pôvodná množina implicitne obsahuje Nutné realizovať vždy, keď v niektorej položke v stave stojí pred neterminálom: Ak máme ako nasledujúci symbol v pravej strane pravla entifikovať nejaký neterminál A stojí bezprostredne pred neterminálom A), potom najprv musíme rozpoznať niektorú z pravých strán A-praviel, aby sme po následnej redukcii rozpoznali práve neterminál A. Keďže vopred nevieme, o ktorú pravú stranu zo všetkých pravých strán A-praviel pôjde, musíme do množiny položiek prať všetky položky tvaru A, kde reprezentuje pravé strany všetkých A- praviel. Položky je potrebné právať dovtedy, kým môžeme do množiny týmto spôsobom právať nové položky. Pozn. A-pravlo je pravlo s neterminálom A na jeho ľavej strane
Uzáver množiny LR0) položiek - príklad Uvažujme o gramatike s pravlami: 1. S $ 2. + 3. 4. 5. ) Chceme určiť Closure0{ ) }) stav i ) stojí pred neterminálom, musíme teda prať položky + a súčasne si položku ) označíme ako vyriešenú stav i ) + v ďalšej položke opäť stojí pred neterminálom, položky + už v stave máme, takže si len položku označíme ako vyriešenú stav i )
Uzáver množiny LR0) položiek príklad - pokračovanie Uvažujme o gramatike s pravlami: 1. S $ 2. + 3. 4. 5. ) Chceme určiť Closure0 ) ) stav i ) stav i ) stojí pred neterminálom, musíme teda prať položky ) a súčasne si položku označíme ako vyriešenú stav i ) ) keďže u zvyšných nevyriešených položiek stojí pred terminálom, uzáverová operácia je ukončená
Konštrukcia LR0) automatu V automate vytvoríme stav 0, ktorý bude obsahovať položky Closure0{S α$}), kde S je začiatočný symbol gramatiky a $ je posledný terminálny symbol v odvodení napr. koniec súboru) Aby sme mohli akceptovať, potrebujeme rozpoznať pravú stranu S-pravla; Na samotnom začiatku sme ešte z pravej strany S-pravla neentifikovali žiadny symbol, preto stojí na začiatku Uzáverová operácia viď. predch. text Uvažujme o gramatike s pravlami: 1. S $ 2. + 3. 4. 5. ) keďže stojí pred neterminálom, musíme zrealizovať uzáverovú operáciu: stav 0 S $ stav 0 S $
Určenie nasledovníkov stavu Ďalej je potrebné pre stav 0 určiť jeho nasledovníkov, tzn. stavy, do ktorých je možné prejsť na tie terminálne aj neterminálne) symboly, pred ktorými v pôvodnom stave stojí. ieto prechody sa uskutočnia vtedy, ak sa podarí príslušný symbol entifikovať. Nové stavy sa získajú uzáverovými operáciami nad množinami tých položiek pôvodného stavu, kde sa znak presunie za symbol, na ktorý sa prechod uskutočňuje. stav 0 S $ stav 1 S $ + stav 3 stav 2 stav 4 ) v stave 0 označuje, že stav 0 má určených všetkých nasledovníkov Do stavu 4 sa nám priamo dostala len položka ), ostatné pribudli uzáverovou operáciou
Konštrukcia LR0) automatupokračovanie Pokiaľ existuje nejaký stav bez nasledovníkov, budeme opakovať: Vyber stav bez nasledovníkov a urči jeho nasledovníkov Poznámka: Pri vytváraní nasledovníkov musíme sledovať, či už rovnaký stav LR0) automatu náhodou nemáme vytvorený; pokiaľ áno, použijeme už existujúci stav
Príklad Zostrojte LR0) automat ku gramatike s pravlami: 1. S $ 2. + 3. 4. 5. )
Príklad stav 0 S $ Poznámka: Automaticky sa do stavu 0 dostane len položka S $ ; to, že sú tam teraz všetky pravlá s na začiatku je len zhoda okolností!!!
Príklad stav 0 S $ stav 1 S $ + stav 3 stav 2 stav 4 ) uzáverová operácia Poznámka: Stavy 2 a 3 sme si označili hneď ako vyriešené z hľadiska nasledovníkov, pretože žiadnych nemajú
Príklad stav 0 S $ stav 1 S $ + $ + stav 3 stav 6 + stav 2 stav 4 ) stav 5 S $ uzáverová operácia
Príklad stav 0 S $ stav 1 S $ + $ stav 5 S $ + stav 3 stav 6 + stav 2 stav 4 ) stav 7 ) + stavy 2, 3, 4 boli použité opakovane
Príklad stav 0 S $ stav 1 S $ + $ stav 5 S $ + stav 3 stav 6 + stav 8 + stav 2 stav 4 ) stav 7 ) +
Príklad stav 0 S $ stav 1 S $ + $ stav 5 S $ + stav 3 stav 6 + stav 8 + + stav 2 stav 4 ) stav 7 ) + ) stav 9 )
Príklad výsledný automat stav 0 S $ stav 1 S $ + $ stav 5 S $ + stav 3 stav 6 + stav 8 + + stav 2 stav 4 ) stav 7 ) + ) stav 9 )
Konštrukcia tabuľky ACION LR0) syntaktického analyzátora ACION tu bude závisieť len od stavov LR0) automatu, nie od aktuálneho vstupného symbolu Konštruuje sa na základe LR0) automatu: položky s na konci pravla tzn. tvaru A α ) signalizujú redukciu podľa A α špeciálne položky S α $ signalizujú akceptáciu položky tvaru A α tβ, t signalizujú presun
Konflikty Ak LR0) automat obsahuje nejaký stav, v ktorom sa nachádzajú: Dve rôzne LR0) položky s na konci, potom nevieme, podľa ktorého pravla sa má redukcia uskutočniť; e o tzv. konflikt typu redukcia-redukcia; LR0) položky s na konci aj vo vnútri príp. začiatku) pravla, potom nevieme, či v danej situácii sa má vykonať redukcia alebo presun; e o tzv. konflikt presun-redukcia. Ak žiaden stav LR0) automatu neobsahuje konflikt, potom gramatika, ku ktorej bol LR0) automat zostrojený, sa nazýva LR0) gramatika.
abuľka ACION - príklad 1. S $ 2. + 3. 4. 5. ) Žiaden stav automatu neobsahuje konflikt, gramatika je preto LR0) gramatika abuľka ACION: Stav/ Akcia stav 0 S $ stav 1 S $ + $ stav 5 S $ + stav 3 stav 6 + stav 8 + 0 1 2 3 4 5 6 7 8 9 P P R3 R4 P A P P R2 R5 + stav 2 stav 4 ) stav 7 ) + ) stav 9 )
abuľka GOO Zostrojí sa taktiež priamo na základe LR0) automatu: Ak existuje orientovaná hrana zo stavu i do stavu j na symbol X, X N ), potom GOO[i][X] = j
abuľka GOO: stav 0 S $ stav 1 S $ + $ stav 5 S $ + stav 3 stav 6 + stav 8 + Stav/Symbol 0 1 2 3 4 5 6 7 8 9 + stav 2 stav 4 ) stav 7 ) + ) stav 9 ) S 1 7 2 2 8 $ 5 + 6 6 3 3 3 4 4 4 ) 9
Otázky