Konstrukce zásobníkového automatu LALR(1)

Podobné dokumenty
doplněk, zřetězení, Kleeneho operaci a reverzi. Ukážeme ještě další operace s jazyky, na které je

Vztah jazyků Chomskeho hierarchie a jazyků TS

KOMPLEXNÍ ČÍSLA. Algebraický tvar komplexního čísla

Turingovy stroje. Teoretická informatika Tomáš Foltýnek

Konstrukce relace. Postupně konstruujeme na množině všech stavů Q relace i,

Jednoznačné a nejednoznačné gramatiky

Necht tedy máme přirozená čísla n, k pod pojmem systém lineárních rovnic rozumíme rovnice ve tvaru

Kapitola 6. LL gramatiky. 6.1 Definice LL(k) gramatik. Definice 6.3. Necht G = (N, Σ, P, S) je CFG, k 1 je celé číslo.

Lineární algebra : Lineární prostor

Dále budeme předpokládat, že daný Markovův řetězec je homogenní. p i1 i 2

Automaty a gramatiky(bi-aag) Motivace. 1. Základní pojmy. 2 domácí úkoly po 6 bodech 3 testy za bodů celkem 40 bodů

u (x i ) U i 1 2U i +U i+1 h 2. Na hranicích oblasti jsou uzlové hodnoty dány okrajovými podmínkami bud přímo

Výpočetní modely pro rozpoznávání bezkontextových jazyků zásobníkové automaty LL(k) a LR(k) analyzátory

Množinu všech slov nad abecedou Σ značíme Σ * Množinu všech neprázdných slov Σ + Jazyk nad abecedou Σ je libovolná množina slov nad Σ

Lineární algebra : Báze a dimenze

2.5. MATICOVÉ ŘEŠENÍ SOUSTAV LINEÁRNÍCH ROVNIC

2. Definice pravděpodobnosti

Čísla a aritmetika. Řádová čárka = místo, které odděluje celou část čísla od zlomkové.

Kapitola 1. Úvod. 1.1 Značení. 1.2 Výroky - opakování. N... přirozená čísla (1, 2, 3,...). Q... racionální čísla ( p, kde p Z a q N) R...

Naproti tomu gramatika je vlastně soupis pravidel, jak

6 Lineární geometrie. 6.1 Lineární variety

Univerzální Turingův stroj a Nedeterministický Turingův stroj

Báze a dimenze vektorových prostorů

Matematická logika cvičení

Matematická logika. Miroslav Kolařík

1 Soustavy lineárních rovnic

1 Řešení soustav lineárních rovnic

PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITY PALACKÉHO KATEDRA INFORMATIKY. Gramatiky LALR(1) 2011 David Beer

IV. Základní pojmy matematické analýzy IV.1. Rozšíření množiny reálných čísel

Sémantika výrokové logiky. Alena Gollová Výroková logika 1/23

Čísla značí použité pravidlo, šipka směr postupu Analýza shora. Analýza zdola A 2 B 3 B * C 2 C ( A ) 1 a A + B. A Derivace zleva:

Regulární výrazy. M. Kot, Z. Sawa (VŠB-TU Ostrava) Úvod do teoretické informatiky 14. března / 20

Formální jazyky a gramatiky Teorie programovacích jazyků

Nechť je číselná posloupnost. Pro všechna položme. Posloupnost nazýváme posloupnost částečných součtů řady.

Lineární algebra : Polynomy

Texty k přednáškám z MMAN3: 4. Funkce a zobrazení v euklidovských prostorech

Bezkontextové jazyky. Bezkontextové jazyky 1 p.1/39

Mirko Navara, Petr Olšák. Základy fuzzy množin. Praha, 2001

Energie elektrického pole

KOMPLEXNÍ ČÍSLA. Algebraický tvar komplexního čísla

p 2 q , tj. 2q 2 = p 2. Tedy p 2 je sudé číslo, což ale znamená, že

Vlastnosti Derivační strom Metody Metoda shora dolů Metoda zdola nahoru Pomocné množiny. Syntaktická analýza. Metody a nástroje syntaktické analýzy

Množiny, relace, zobrazení

1 Báze a dimenze vektorového prostoru 1

Minimalizace KA - Úvod

Ivana Linkeová SPECIÁLNÍ PŘÍPADY NURBS REPREZENTACE. 2 NURBS reprezentace křivek

PŘEDNÁŠKA 5 Konjuktivně disjunktivní termy, konečné distributivní svazy

PODKLADY PRO PRAKTICKÝ SEMINÁŘ PRO UČITELE VOŠ. Logaritmické veličiny používané pro popis přenosových řetězců. Ing. Bc. Ivan Pravda, Ph.D.

H {{u, v} : u,v U u v }

19. Druhý rozklad lineární transformace

Matematika (CŽV Kadaň) aneb Úvod do lineární algebry Matice a soustavy rovnic

Přednáška 9, 28. listopadu 2014 Část 4: limita funkce v bodě a spojitost funkce

Substituce. Petr Štěpánek. S využitím materialu Krysztofa R. Apta. Logické programování 2 1

PŘEDNÁŠKA 2 POSLOUPNOSTI

Syntaxí řízený překlad

Regulární výrazy. Definice Množina regulárních výrazů nad abecedou Σ, označovaná RE(Σ), je definována induktivně takto:

Matematická analýza pro informatiky I. Limita funkce

3.10 Rezoluční metoda ve výrokové logice

Vektory a matice. Obsah. Aplikovaná matematika I. Carl Friedrich Gauss. Základní pojmy a operace

Výroková logika - opakování

Neparametrické metody

Matice lineárních zobrazení

Pro každé formule α, β, γ, δ platí: Pro každé formule α, β, γ platí: Poznámka: Platí právě tehdy, když je tautologie.

Formální jazyky a automaty Petr Šimeček

ASYMPTOTICKÉ VLASTNOSTI ODHADŮ S MINIMÁLNÍ KOLMOGOROVSKOU VZDÁLENOSTÍ

LIMITA A SPOJITOST FUNKCE

V předchozí kapitole jsme podstatným způsobem rozšířili naši představu o tom, co je to číslo. Nadále jsou pro nás důležité především vlastnosti

Limita a spojitost funkce a zobrazení jedné reálné proměnné

0.1 Úvod do lineární algebry

1 Kardinální čísla. množin. Tvrzení: Necht X Cn. Pak: 1. X Cn a je to nejmenší prvek třídy X v uspořádání (Cn, ),

Základy matematické analýzy

Náhodným (stochastickým) procesem nazveme zobrazení, které každé hodnotě náhodnou veličinu X ( t)

0.1 Úvod do lineární algebry

MASARYKOVA UNIVERZITA PEDAGOGICKÁ FAKULTA

1 Linearní prostory nad komplexními čísly

(Cramerovo pravidlo, determinanty, inverzní matice)

Iterační výpočty. Dokumentace k projektu pro předměty IZP a IUS. 22. listopadu projekt č. 2

Výroková a predikátová logika - II

Automaty a gramatiky(bi-aag) Formální překlady. 5. Překladové konečné automaty. h(ε) = ε, h(xa) = h(x)h(a), x, x T, a T.

Limita a spojitost funkce. 3.1 Úvod. Definice: [MA1-18:P3.1]

A u. jsou po řadě počáteční a koncové body úsečky; t je parametr:

Výroková a predikátová logika - IV

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LL SYNTAKTICKÁ ANALÝZA DOKONČENÍ, IMPLEMENTACE.

7. Lineární vektorové prostory

0. ÚVOD - matematické symboly, značení,

Místo pojmu výroková formule budeme používat zkráceně jen formule. Při jejich zápisu

Základní pojmy matematické logiky

Lineární programování

4. Kombinatorika a matice

Vrcholová barevnost grafu

Pravděpodobnost a statistika

Stromové rozklady. Definice 1. Stromový rozklad grafu G je dvojice (T, β) taková, že T je strom,

Lineární algebra : Násobení matic a inverzní matice

6. Demonstrační simulační projekt generátory vstupních proudů simulačního modelu

Algebraické struktury s jednou binární operací

Bezkontextové jazyky 2/3. Bezkontextové jazyky 2 p.1/27

Greenova funkce pro dvoubodové okrajové úlohy pro obyčejné diferenciální rovnice

1. Spektrální rozklad samoadjungovaných operátorů 1.1. Motivace Vlastní čísla a vlastní vektory symetrické matice 1 1 A = 1 2.

Výroková a predikátová logika - V

Matematická analýza 1

Transkript:

Konstrukce zásobníkového automatu LALR(1) Vlém Vychodl 5. lstopadu 2001 Tento text se zabývá technckým aspekty konstrukce významné třídy zásobníkových automatů určených pro determnstckou syntaktckou analýzu zdola nahoru. LALR(1) automaty umožňují analyzovat šrší třídu jazyků než automaty SLR(1). Redukce se uplatňuje pouze v případě, kdy je na vstupu symbol z predktvní množny symbolů (look ahead). Počet zásobníkových symbolů je shodný jako u automatu SLR(1), což je prot počtu zásobníkových symbolů obecného automatu LR(1) značně výhodné. Text předpokládá ntutvní znalost zásobníkových automatů. Determnstcká analýza zdola nahoru Analýza bezkontextového jazyka s sebou přnáší několk úskalí. Proces analýzy je dán samotnou povahou jazyků. U regulárních jazyků je možné provést rozpoznání na základě konečné posloupnost konečně mnoha stavů. U bezkontextových jazyků je stuace jná. Analýza vyžaduje smulac průchodu stromem nabízí se přrozeně rozšířt model automatu o zásobník. Zásobníkové automaty pracují dvojím způsobem. Automaty pracující shora dolů smulují průchod dervačním stromem od jeho kořenu startovního symbolu gramatky až po lsty, což jsou termnální symboly. Dvě základní operace automatu analyzujícího shora dolů jsou srovnání a expanse. Př srovnání dojde buďto k odstranění shodných symbolů ze vstupu a vrcholu zásobníku, nebo k ukončení čnnost automatu. Př expans je na vrcholu zásobníku nahrazen netermnální symbol A řetězcem α za předpokladu, že A α je odvozovací pravdlo gramatky. Nedetermnstčnost automatu pracujícího shora dolů spočívá pouze ve vybrání správného expandujícího pravdla. Manpulace se zásobníkem je rovněž přímočará. Ze zásobníku je odebírán nanejvýš jeden symbol, přdáván je obecně řetězec. Zásobníkové symboly jsou tvořeny z termnálních a netermnálních symbolů gramatky. Automat pracuje pouze s vrcholem zásobníku. Na druhé straně stojí zásobníkové automaty pracující zdola nahoru. Jejch čnnost smuluje průchod dervačním stromem zdola nahoru, tedy od lstů k startovnímu symbolu gramatky. Základní operace jsou opět dvě, je to přesun a redukce. Přesunem je přesunut vstupní symbol na vrchol zásobníku. Redukcí je odstraněn řetězec z vrcholu zásobníku a na jeho místo je položen netermnální symbol A odpovídající levé straně některého odvozovacího A α pravdla s odstraňovaným řetězcem α na pravé straně. Označme přechodovou funkc zásobníkového automatu δ : T {ε} (T N) 2 (T N), kde G = (N, T, P, S) je bezkontextová gramatka. Přechodová funkce defnuje př aktuálním symbolu a př řetězc na zásobníku nové řetězce. Provedení přechodu je vždy podmíněno vstupem a aktuálním stavem zásobníku. Vstup a aktuální vrchol zásobníku je odstraněn, na vrchol zásobníku je př přechodu přdán jeden z defnovaných řetězců. Základní operace lze chápat jako přesun δ(t, ε) = {t}, redukce δ(ε, A) = {α 1, α 2,..., α n }, kde A α 1 α 2... α n P. Problémů, které musí tato analýza řešt je víc. Přesun je jednoznačný v tom smyslu, že pro každý t T je defnována operace přesunu, kde δ(t, ε) je jednoprvková

množna. Narozdíl od přímočaré operace srovnání u analýzy shora dolů jž nelze jednoduše rozhodnout, zda-l v daný krok analýzy proběhne přesun, nebo redukce. Přesun se obecně neřídí stavem zásobníku. Dalším nemalým problémem je rozhodnutí o náhradě řetězce ze zásobníku některou levou stranou. Problém technckého charakteru představuje manpulace se zásobníkem. Př analýze zdola nahoru je nutné prohledávat zásobník do hloubky. I přes zdánlvě větší počet problémů je v techncké prax používána praktcky výhradně analýza zdola nahoru. Problémy těchto metod analýzy jsou shrnuty v následujícím přehledu. Př čnnost automatu je nutné prohledávat zásobník do hloubky. Tento nedostatek je odstraněn zavedením zásobníkových symbolů. Ty se v prax používají místo množny T N. Zásobníkové symboly obsahují nformac o fáz přesunu automat dále pracuje pouze s vrcholem zásobníku. Během analýzy je na základě znalost vstupního symbolu a stavu zásobníku nutné rozhodnout o typu operace, která bude provedena. Zásobníkové symboly v sobě nesou nformac o tom, zda-l má př daném vstupu proběhnout přesun, č redukce. Př konstrukc automatu mohou vznkat konflkty mez přesunem a redukcí, nebo mez dvěma č více redukcem. Zastavením automatu se rozpoznává přjetí č zamítnutí vstupního řetězce coby věty jazyka. Vstupní gramatku je nutné upravt do takového tvaru, aby bylo přjetí vstupního řetězce techncky dobře zjsttelné. Z předchozího text je patrné, že vyřešení těchto problémů spočívá především v zavedení vhodných zásobníkových symbolů. Konstrukce zásobníkových symbolů Předpokládejme bezkontextovou gramatku G = (N, T, P, S), k níž máme sestrojt analyzující zásobníkový automat pracující zdola nahoru. Jak jž bylo předesláno, nejprve je nutné vytvořt zásobníkové symboly. Ty v sobě ponesou nformac o fázích přesunu. Nejprve však zavedeme pojem expandované gramatky. Defnce 1. Nechť G = (N, T, P, S) je bezkontextová gramatka. Dále označme S netermnální symbol takový, že S N. Ekvvalentní bezkontextová gramatka G = (N, T, P, S ), kde N = N {S }, P = P {S S} se nazývá expandovaná gramatka. Expandovaná gramatka, někdy též rozšířená gramatka, je vskutku ekvvalentní. V podstatě pouze předsazuje nový startovní symbol. Tato úprava je výhodná z technckého hledska. Pokud automat př své čnnost vyčerpá vstupní symboly a na vrcholu zásobníku zůstane pravdlo symbolsující redukc podle pravdla S S, čnnost automatu lze zastavt řetězec je přjat jako věta jazyka. Konstrukce zásobníkových symbolů je rozdílná pro automatu LR(0), SLR(1) a LALR(1), LR(1). Konstrukce automatů LR(0), SLR(1) je výrazně jednodušší. O provedení redukce se rozhoduje buďto pouze na základě stavu zásobníku LR(0), nebo jednoduchou metodou na základě znalost jednoho vstupního symbolu. Je-l A α redukující pravdlo, pak musí být vstupní symbol z množny Follow(A). Tímto způsobem fungují automaty SLR(1). Nejprve je rozebrána konstrukce zásobníkových symbolů pro automaty LR(0) a SLR(1). Defnce 2. Nechť G = (N, T, P, S) je expandovaná bezkontextová gramatka a nechť A αβ P je lbovolné odvozovací pravdlo. Symboly tvaru [A α β] nazveme položky gramatky G. Položky gramatky tvaru [A α ] se nazývají redukční položky. Neprázdná množna položek gramatky se nazývá zásobníkový symbol gramatky G. Poznámka. Zásobníkové symboly se skládají z položek gramatky. Každá z nch representuje odvozovací pravdlo, na jehož pravé straně je tečkou vyznačena fáze přesunu. Zásobníkový symbol sestává z více polož právě proto, že může representovat několk přesunů zároveň. Je-l položka

ve tvaru [A αβ], jedná se o počátek přesunu, je-l položka ve tvaru [A αβ ], přesun byl dokončen a může se začít s redukcí. Následující příklad ukazuje fáze přesunu. [E F + F ] zahájení přesunu, F čeká na přesun, [E F + F ] F je přesunuto, + čeká na přesun, [E F + F ] přesun pravé strany dokončen, může se redukovat. Je-l pravdlo ve tvaru [A α Bβ], kde B je netermnální symbol, pak representuje fakt, že daný netermnál by měl být přesunut na zásobník. To ale v prax znamená, že nejprve je některá pravá strana odvozovacího pravdla začínajícího B celá přesunuta na zásobník a poté zredukována. To je jedný způsob, jak na zásobník přesunout netermnální symbol, který přrozeně není vstupní. Z tohoto důvodu lze ke každému zásobníkovému symbolu zavádí jeho uzávěr. Defnce 3. Nechť G = (N, T, P, S) je expandovaná bezkontextová gramatka, označme Z(G) množnu všech možných zásobníkových symbolů gramatky G. Pro podmnožnu Z Z(G) zásobníkových symbolů defnujeme posloupnost podmnožn {U Z(G)} N0 nduktvně, U 0 = Z, U +1 = U {[B β] ; [A α Bγ] U B β P }. Dle Drchletova prncpu musí exstovat ndex j N 0 tak, že U j = U j+1. Množnu U j nazveme uzávěrem množny položek Z a označíme U(Z). Uzávěr množny položek jž dobře representuje stav zásobníku během postupného přesunu symbolů. Zbývá dořešt techncký detal, jak zkonstruovat množnu zásobníkových symbolů podle daných pravdel gramatky. Pro expandovanou gramatku G = (N, T, P, S ) je startovní symbol S obsažen pouze v odvozovacím pravdle S S. První zásobníkový symbol tedy vznkne uzávěrem U({[S S]}). Další symboly jsou konstruovány průběžně přesunem symbolů za tečkou. Algortmus 1. (Konstrukce pro LR(0), SLR(1)) Vycházejme z expandované gramatky G = (N, T, P, S ). Konstrukce zásobníkových symbolů bude representována konstrukcí konečného determnstckého automatu A = (T N, Q, δ, U({[S S]}), F ) automatu zásobníkových symbolů. Množna stavů Q označuje množnu konstruovaných zásobníkových symbolů. Vzájemný vztah zásobníkových symbolů je dán přechodovou funkcí δ. 1. Položme Q = {U({[S S]})}. 2. Pro každý dosud neuvažovaný zásobníkový symbol Z Q a pro každý a N T označme Z a = U({[A αa β] ; [A α aβ] Z}), to jest Z a representuje zásobníkový symbol vznklý přesunem symbolu a př stávajícím symbolu Z na vrcholu zásobníku. 3. Pokud je Z a =, pokračujeme krokem 2. 4. Pokud Z a dosud není v množně Q, pak Q def = Q {Z a }. 5. Defnujeme δ(z, a) def = Z a a pokračujeme krokem 2. Po konečně mnoha krocích obdržíme automat A = (T N, Q, δ, U({[S S]}), F ), jehož stavy jsou zásobníkové symboly a přechodu defnují jejch vzájemný vztah vzhledem k operac přesunu. Za koncové stavy můžeme považovat ty symboly Z Q, které obsahují redukční položku. Poznámka. Čnnost automatu analyzujícího průchodem zdola nahoru se řídí přechodovou funkcí automatu zásobníkových symbolů A. Je-l na vrcholu zásobníku symbol Z, na vstupu termnální symbol t a exstuje-l přechod δ(z, t) = Z, potom je přesunem myšleno odstranění vstupního symbolu t a přdání zásobníkového symbolu Z na vrchol zásobníku. Jedný problém, který zůstává vyřešt je provedení redukce. Expandovaná bezkontextová gramatka G = (N, T, P, S ) je LR(0), právě když žádná redukční položka příslušného automatu zásobníkových symbolů nemá defnovaný přechod pro žádné a N T.

Defnce 4. Nechť A = (T N, Q, δ, U({[S S]}), F ) je automat zásobníkových symbolů expandované bezkontextové gramatky G = (N, T, P, S ) a nechť koncové stavy automatu jsou zásobníkové symboly obsahující právě jednu redukční položku gramatky. Jestlže pro každý Z F a lbovolný t T není defnován přechod δ(z, t), pak je gramatka LR(0). To v techncké prax znamená, že automat nepotřebuje pro rozhodnutí mez přesunem a redukcí znát žádný symbol ze vstupu. Je-l na vrcholu zásobníku symbol s právě jednou redukční položkou, tato položka jednoznačně určuje, o kterou redukc se jedná. Je-l na vstupu symbol bez redukční položky, automat provede přesun podle přechodové funkce automatu zásobníkových symbolů. Požadavek gramatky LR(0) je velm slný. I velm jednoduché gramatky potřebují př jednom zásobníkovém symbolu někdy přesouvat a někdy redukovat. V tomto případě se automat musí rozhodnout podle vstupního symbolu. Defnce 5. Nechť A = (T N, Q, δ, U({[S S]}), F ) je automat zásobníkových symbolů expandované bezkontextové gramatky G = (N, T, P, S ) a nechť koncové stavy automatu jsou zásobníkové symboly obsahující alespoň jednu redukční položku gramatky. Gramatka G je jednoduchá LR(1), nebol SLR(1), pokud jsou splněny následující dvě podmínky. 1. Pro každý Z F a každou jeho redukční položku [A α ] Z neexstuje přechod δ(z, t) pro žádný t Follow(A). Formálně, {s; δ(z, s) je defnován} Follow(A) =. 2. Pro všechny redukční položky [A 1 α 1 ],..., [A n α n ] zásobníkového symbolu Z F, platí Follow(A 1 ) Follow(A 2 ) Follow(A n ) =. Gramatky SLR(1) se jž př redukc rozhodují podle množny symbolů Follow(A), kde A je levá strana redukční položky [A α ]. Tato motvace je zřejmá, pokud má být řetězec z vrcholu zásobníku redukován na A, potom musí být následující symbol odvodtelný z větných forem stojících za A. Množna Follow(A) T, tedy gramatky SLR(1) zahrnují šrší třídu jazyků. Čím menší je podmnožna symbolů T určující redukc, tím šrší třídu jazyků dostáváme. Množna Follow(A) T není pro určení redukce v žádném případě mnmální. V techncké prax se používají především gramatky LALR(1) a LR(1). Gramatka LR(1) je vůbec nejobecnější, její stnnou stránkou ale je rychle vzrůstající počet zásobníkových symbolů. Gramatky LALR(1) odstraňují tento nedostatek slučováním zásobníkových symbolů. Syntaktcké analyzátory postavené na gramatkách LALR(1) tvoří základ moderních analyzátorů jazyků. Mez nejznámější generátory syntaktckých analyzátorů patří Bson, jehož tvůrcem není nkdo jný než Rchard M. Stallman. Položky gramatky a zásobníkové symboly pro LALR(1) a LR(1) gramatky jsou rozšířeny o množnu predktvních symbolů. Defnce 6. Nechť G = (N, T, P, S) je expandovaná bezkontextová gramatka a nechť A αβ P je lbovolné odvozovací pravdlo. Dvojce tvaru [A α β; ω], kde ω T {ε}, nazveme položky gramatky G. První prvek dvojce je jádro položky gramatky, značíme Ker [A α β; ω] = [A α β]. Druhý prvek je množna predktvních symbolů, značíme La [A α β; ω] = ω. Položky tvaru [A α ; ω] se nazývají redukční položky. Neprázdná množna položek gramatky se nazývá zásobníkový symbol gramatky G. Poznámka. Defnc jádra a množny predktvních symbolů lze přrozeně rozšířt z položek gramatky na celé zásobníkové symboly prostým sjednocením přes jednotlvé položky gramatky. Označme Z zásobníkový symbol. Pak Ker Z = Ker p, La Z = La p, p Z a nazveme je jádrem zásobníkového symbolu a predktvní množnou zásobníkového symbolu. Jelkož jž zásobníkové symboly nerepresentují pouze stav přesunu, ale množny symbolů, které p Z v

mohou být na vstupu po dokončení redukce, musí se adekvátně upravt uzávěr množny položek gramatky. Defnce 7. Nechť G = (N, T, P, S) je expandovaná bezkontextová gramatka, označme Z(G) množnu všech možných zásobníkových symbolů gramatky G. Pro podmnožnu Z Z(G) zásobníkových symbolů defnujeme posloupnost podmnožn {U Z(G)} N0 nduktvně, U 0 = Z, U +1 = U {[B β; κ(γ, ω)] ; [A α Bγ; ω] U B β P }, kde nová množna predktvních symbolů κ(γ, ω) je κ(γ, ω) = t ω Frst γt. Dle Drchletova prncpu musí exstovat ndex j N 0 tak, že U j = U j+1. Množnu U j nazveme uzávěrem množny položek Z a označíme U(Z). Defnce uzávěru je v souladu s ntucí. Je-l ω množna symbolů, které mohou být na vstupu pro provedení redukce, potom musí být každá položka gramatky vybavena novou množnou predktvních symbolů ta musí obsahovat symboly, které mohou být na vstupu po její redukc. Jelkož je přesunován netermnál z A α Bγ na B β, za předpokladu γ ε stačí vzít κ(γ, ω) = Frst γ. Pokud by bylo γ = ε, pak zůstane predktvní množna κ(γ, ω) = ω. Konstrukce automatu LR(1) jž je v tuto chvíl možná. Př konstrukc zásobníkových symbolů se pouze uplatňuje nový uzávěr. Počátečním zásobníkovým symbolem je zřejmě U({[S S; ε]}). Predktvní množna položky [S S; ε] je prázdná, položka representuje ukončení čnnost automatu vstup je očekáván prázdný. Algortmus 2. (Konstrukce pro gramatky LR(1)) Vycházejme z expandované gramatky G = (N, T, P, S ). Konstrukce zásobníkových symbolů bude representována konstrukcí konečného determnstckého automatu A = (T N, Q, δ, U({[S S; ε]}), F ) automatu zásobníkových symbolů. Množna stavů Q označuje množnu konstruovaných zásobníkových symbolů. Vzájemný vztah zásobníkových symbolů je dán přechodovou funkcí δ. 1. Položme Q = {U({[S S; ε]})}. 2. Pro každý dosud neuvažovaný zásobníkový symbol Z Q a pro každý a N T označme Z a = U({[A αa β; ω] ; [A α aβ; ω] Z}), to jest Z a representuje zásobníkový symbol vznklý přesunem symbolu a př stávajícím symbolu Z, predktvní množna symbolů zůstává zachována. 3. Pokud je Z a =, pokračujeme krokem 2. 4. Pokud Z a dosud není v množně Q, pak Q def = Q {Z a }. 5. Defnujeme δ(z, a) def = Z a a pokračujeme krokem 2. Po konečně mnoha krocích obdržíme automat A = (T N, Q, δ, U({[S S; ε]}), F ), jehož stavy jsou zásobníkové symboly a přechodu defnují jejch vzájemný vztah vzhledem k operac přesunu. Za koncové stavy můžeme považovat ty symboly Z Q, které obsahují redukční položku. Poznámka. Dvě položky gramatky jsou ekvvalentní, právě když jsou s rovna jejch jádra predktvní množny. Položky [A α β; ω 1 ], [A α β; ω 2 ] jsou tedy ekvvalentní, právě když platí ω 1 = ω 2. Dva zásobníkové symboly jsou ekvvalentní, právě když lze mez jejch položkam gramatky zavést bjektvní zobrazení tak, že vzájemně přřazené položky jsou ekvvalentní. v

Defnce 8. Nechť A = (T N, Q, δ, U({[S S; ε]}), F ) je automat zásobníkových symbolů expandované bezkontextové gramatky G = (N, T, P, S ) a nechť koncové stavy automatu jsou zásobníkové symboly obsahující alespoň jednu redukční položku gramatky. Gramatka G je LR(1), pokud jsou splněny následující dvě podmínky. 1. Pro každý Z F a každou jeho redukční položku [A α ; ω] Z neexstuje přechod δ(z, t) pro žádný t ω. Formálně, {s; δ(z, s) je defnován} ω =. 2. Pro všechny redukční položky [A 1 α 1 ; ω 1 ],..., [A n α n ; ω n ] zásobníkového symbolu Z F, platí ω 1 ω 2 ω n =. Vlastní čnnost automatu během analýzy se nemění, př rozhodování o typu operace se automat rozhoduje podle predktvní množny. To jest, je-l na vrcholu zásobníku symbol s redukční položkou, lze se orentovat podle množny predktvních symbolů. Obecně lze říct, že úspěšná analýza je podmíněna vzájemnou nencdencí množn predktvních symbolů redukčních položek automatu a jejch nencdencí vůč množně symbolů, které lze přesouvat. Tvrzení 1. Pro každou gramatku LR(k), k > 1 exstuje ekvvalentní gramatka LR(1). Důkaz. NAPÍŠU ČASEM Rychle rostoucí počet zásobníkových symbolů je hlavním důvodem, proč se LR(1) gramatky v prax nepoužívají. Gramatky LALR(1) jsou rovněž založeny na dentfkac redukce podle predktvní množny, počet symbolů je ale shodný jako v případě gramatk SLR(1). Během konstrukce zásobníkových symbolů jsou slučovány symboly se stejným jádrem. Sloučení symbolů formálně popsujeme operací Merge. Defnce 9. Nechť A = (T N, Q, δ, U({[S S; ε]}), F ) je automat zásobníkových symbolů expandované bezkontextové gramatky. Pro zásobníkové symboly Z 1, Z 2,..., Z n Q, které mají shodné jádro, to jest Ker Z 1 = Ker Z 2 = = Ker Z n defnujeme sloučený zásobníkový symbol Merge(Z 1,..., Z n ) předpsem Merge(Z 1,..., Z n ) = {[A α β; ω] ; [A α β] Ker Z 1 }, n { } kde ω značí La p; p Z Ker p = [A α β]. =1 To jest př sloučení dochází pouze u zásobníkových symbolů se stejným jádrem, přtom množny predktvních symbolů jsou sjednoceny. Konstrukce zásobníkových symbolů LALR(1) automatu je v zásadě dvojí. Buďto je nejprve vytvořen automat LR(1) a nakonec je zredukován počet zásobníkových symbolů. Mnohem častěj jsou však symboly slučovány jž během konstrukce automatu. Př sloučení nového symbolu s jž exstujícím je nutné znovu projít množny predktvních symbolů těch zásobníkových symbolů, které za slučovaným symbolem následují ve smyslu přechodové funkce automatu zásobníkových symbolů. Konstrukc zásobníkových symbolů shrnuje následující algortmus. Algortmus 3. (Konstrukce pro gramatky LALR(1)) Vycházejme z expandované gramatky G = (N, T, P, S ). Konstrukce zásobníkových symbolů bude representována konstrukcí konečného determnstckého automatu A = (T N, Q, δ, U({[S S; ε]}), F ) automatu zásobníkových symbolů. Množna stavů Q označuje množnu konstruovaných zásobníkových symbolů. Vzájemný vztah zásobníkových symbolů je dán přechodovou funkcí δ. 1. Položme Q = {U({[S S; ε]})}. 2. Pro každý dosud neuvažovaný zásobníkový symbol Z Q a pro každý a N T označme Z a = U({[A αa β; ω] ; [A α aβ; ω] Z}), to jest Z a representuje zásobníkový symbol vznklý přesunem vstupního symbolu a př stávajícím symbolu Z, predktvní množna symbolů zůstává zachována. v

3. Pokud je Z a =, pokračujeme krokem 2. 4. Pokud Z a dosud není v množně Q a Ker Z a je různé od jader všech ostatních zásobníkových symbolů, pak Q def = Q {Z a } a pokračujeme bodem 6. 5. Pokud Z a dosud není v množně Q a jádro Ker Z a se shoduje s jádrem zásobníkového symbolu Z, to jest Ker Z a = Ker Z, pak zavedeme sloučený zásobníkový symbol Z = Merge(Z a, Z ). Dále upravíme množny predktvních symbolů. () Zásobníkový symbol Z nahradíme symbolem Z. To jest Q def = (Q {Z }) {Z }. Adekvátně upravíme přechodovou funkc, δ(s, t) = Z nahradíme δ(s, t) = Z. () Každému symbolu odvozenému přesunem z Z upravíme množnu predktvních symbolů podle sloučeného symbolu Z v souladu s předchozím pravdly. Tuto úpravu provádíme rekursvně pro každý upravený symbol, dokud nejsou upraveny všechny symboly, jejchž předkem byl Z. () Původní zásobníkový symbol Z zankl. Defnujeme δ(z, a) def = Z a pokračujeme krokem 2. 6. Defnujeme δ(z, a) def = Z a a pokračujeme krokem 2. Po konečně mnoha krocích obdržíme automat A = (T N, Q, δ, U({[S S; ε]}), F ), jehož stavy jsou zásobníkové symboly a přechodu defnují jejch vzájemný vztah vzhledem k operac přesunu. Za koncové stavy můžeme považovat ty symboly Z Q, které obsahují redukční položku. Pátý bod předchozího algortmu je stěžejní. Díky němu nedochází k nárůstu zásobníkových symbolů. Grafcky lze slučování znázornt následujícím obrázkem. Předpokládejme, že symboly Z a a Z 1 mají stejné jádro. Levá část vysthuje konstrukc zásobníkových symbolů LR(1) gramatky a vznk nového symbolu Z a. V pravé část obrázku je zachycena konstrukce zásobníkových symbolů LALR(1) gramatky. a Z 5 Z 5 A Z 1 Z 4 a Z 0 Z 2 b b B Z 6 a Z a b A Z 4 Z 0 a Z 2 b B Z 6 a Z a Z 7 Z a Z 7 Nový symbol není zaveden, místo toho je slt s původním symbolem Z 1. Šedou barvou jsou vyznačeny ty symboly, jejchž množny predktvních symbolů musejí být upraveny. Defnce LALR(1) gramatky je v tomto kontextu stejná, jako u gramatky LR(1), př konstrukc zásobníkových symbolů pouze dochází k jejch slučování podle společného jádra. Čnnost automatu Tento odstavec je věnován popsu čnnost automatu. Samotná čnnost všech automatů vychází z obecného modelu automatu analyzujícího průchodem zdola nahoru. Je-l k dané gramatce sestaven adekvátní automatu zásobníkových symbolů A = (T N, Q, δ, U({[S S; ε]}), F ), jsou všechny operace přímočaré. Operace přesunu se řídí přechodovou funkcí automatu A, je-l na vstupu t a na vrcholu zásobníku Z, pak se t odebere ze vstupu a na vrchol zásobníku se vloží zásobníkový symbol δ(z, t). Pokud by přechod neexstoval a Z neobsahuje redukční položku, to jest Z F, pak automat svou čnnost ukončí a řetězec nebyl přjat jako věta jazyka. v

Pokud pro vstupní t a Z na vrcholu zásobníku neexstuje přechod, ale Z obsahuje redukční položku (položky), Z F, pak se automat rozhoduje o redukc. Podle vstupního symbolu je vybráno redukující pravdlo A α, odpovídající redukční položce A α. Počet symbolů α je odebrán z vrcholu zásobníku, nový vrchol zásobníku označme Z. V této fáz byla odebrána pravá strana pravdla a na zásobník je nutné přdat symbol representující netermnál na levé straně. Na vrchol je položen symbol δ(z, A). Celou čnnost automatu shrnuje následující algortmus. Algortmus 4. Předpokládejme, že máme zkonstruovány automaty zásobníkových symbolů boď pro LR(0), SLR(1), nebo pro LALR(1), LR(1) gramatku, to jest automat A = (T N, Q, δ, U({[S S]}), F ), nebo automat A = (T N, Q, δ, U({[S S; ε]}), F ). 1. Na počátku analýzy je na vrcholu zásobníku počáteční zásobníkový symbol, to je buďto symbol U({[S S]}), nebo U({[S S; ε]}). Počáteční zásobníkový symbol representuje počátek přesunů, na vrchol zásobníku je třeba přesunout S. Počáteční zásobníkový symbol rovněž ndkuje konec analýzy. 2. V průběžném kroku je proveden buďto přesun, nebo redukce. Na vrcholu zásobníku je symbol Z, na vstupu je termnální symbol t. () Pokud je defnován přechod δ(z, t) = S, je provedena operace přesunu. Vstupní symbol t je odebrán ze vstupu a na vrchol zásobníku je položen symbol S. Dále proběhne krok 3. () Pokud není defnován přechod δ(z, t) a zásobníkový symbol neobsahuje redukční položku, Z F, pak se čnnost automatu zastaví s neúspěchem. () Pokud není defnován přechod δ(z, t) a zásobníkový symbol obsahuje redukční položky p 1,..., p n, pak je rozhodnuto o redukc podle následujících pravdel. Je-l gramatka LR(0), pak je redukční položka právě jedna. Redukční pravdlo je vybráno podle ní, to jest pro jednou redukční položku tvaru [A α ] je vybráno redukční pravdlo A α. Je-l gramatka SLR(1), pak je vybráno redukční pravdlo A α příslušné redukční položce [A α ], kde t Follow A. Pokud neexstuje an jedna redukční položka této vlastnost, čnnost automatu se zastaví s neúspěchem. Je-l gramatka LALR(1), nebo LR(1), pak je vybráno redukční pravdlo A α příslušné redukční položce [A α ; ω], kde t ω. Pokud neexstuje an jedna redukční položka této vlastnost, čnnost automatu se zastaví s neúspěchem. Pro vybrané redukční pravdlo A α je nejprve z vrcholu zásobníku odebráno α symbolů. Zásobníkový symbol, který zůstane po odebrání na vrcholu zásobníku označme Z. Provedeme přesun symbolu δ(z, A) na vrchol zásobníku. Pokud by př odstraňování podtekl zásobník, nebo nebyl defnován přechod δ(z, A), čnnost automatu se zastaví s neúspěchem. V opačném případě je pokračováno krokem 3. 3. Pokud je na vstupu ε, to jest vstup je kompletně zpracován a na vrcholu zásobníku je symbol obsahující redukční položku [S S ], případně [S S, ε], pak je čnnost automatu zastavena a automat přjal vstupní řetězec jako větu jazyka. V opačném případě proběhne další průběžný krok. Techncká realsace algortmu je přímočará. V podstatě lze pouze udržovat dvojrozměrnou tabulku o Q řádcích představujících zásobníkové symboly a o N T {ε} sloupcích představující termnální a netermnální symboly spolu s prázdným řetězcem ε. Přechody δ(z, t) se doplní do celé tabulky. Redukce se doplní pouze do část T {ε}. Do tabulky je rovněž vhodné doplnt symbol halt. Sloupec symbolu halt odpovídá prázdnému vstupu. Řádek symbolu halt representuje zásobníkový symbol obsahující redukční položku [S S ], případně [S S ; ε]. v

Jednoznačnost přesunu a redukce Z předchozí uvedené techncké realsace algortmu analýzy je dobře vdět, v jakých případech není možné prohlást danou gramatku za LR(0), SLR(1), LALR(1), č LR(1). Z tohoto pohledu jde v zásadě jen o jednu věc, na témže pol dvojrozměrné tabulky nemůže být uveden zároveň přesun a redukce, nebo dvě č více redukcí zároveň. Uvědomte s, že na jednom pol se nkdy nemohou sejít dva přesuny. Konstruovaný automat zásobníkových symbolů je totž vždy determnstcký odtud toto tvrzení. Stuace, kdy na jednom pol přechodové tabulky dochází ke střetu víc akcí, nazýváme konflkty. Nejčastěj vznkajícím konflktem je konflkt přesun/redukce. Konflkt přesun/redukce vznká, pokud př konstrukc zásobníkových symbolů př Z na vrcholu zásobníku a př t na vstupu exstují dvě alternatvy, buďto přesun, nebo redukce. Dobrou zprávou budž to, že konflkty typu přesun/redukce jsou dobře odstrantelné a zpravdla nevedou ke zhroucení analýzy. Příklad 1. Uvažujme expandovanou bezkontextovou gramatku G = (N, T, P, E ), kde N = {E, E}, T = {,, +, (, )} a odvozovací pravdla jsou tvaru, P = {E E, E E+E E E (E) }. Tato gramatka odpovídá uzávorkovaným artmetckým výrazům, obsahujícím operace sčítání a násobení, termnální symbol representuje sčítané hodnoty. Výše uvedená gramatka je nejednoznačná, například ke větám + +, č + exstuje víc dervačních stromů. Například pro + exstují následující dva stromy. E E E + E E E E E E + E Obě část dervačního stromu representují tutéž větu. Logcký význam obou dervací je však jný, v prvním případě je nejprve zkompletována operace násobení, výraz má tedy význam + ( ), v druhém případě je nejprve dokončeno sčítání, výraz má význam ( + ). Jelkož je gramatka nejednoznačná, k jedné větě exstuje víc dervačních stromů, nelze k ní sestrojt determnstcký analyzátor. Jakýkolv analyzátor, třeba LR(1), bude mít v předchozím případě konflkt přesun/redukce. Většna generátorů analyzátorů s dokáže s konflkty přesun/redukce poradt zavedením asocatvty a prorty operací. V předchozím případě chceme, aby analyzátor provedl dervac ve smyslu prvního obrázku. To znamená, že je-l na vstupu + ( ), nejprve je celý výraz přesunut na zásobník a až poté je redukován. Kdyby byl přesunut pouze začátek výrazu, to jest + a ten redukován, dervace by vedla na druhý případ. Příklad 2. Předpokládejme, že máme sestaven SLR(1) automat a snažíme se vyřešt předchozí konflkt. Na vrcholu zásobníku je symbol Z = {[E+E ], [E +E], [E E]}. Pokud je na vstupu α, což je zbývající vstup pro zpracování první číst výrazu +, pak automat se musí rozhodnout mez přesunem symbolu, nebo redukcí podle pravdla E E+E. Jelkož má vyšší prortu než +, volíme operac přesunu. Konflkt je vyřešen. Analogcky se řeší problémy asocatvty zprava a zleva, to jest u výrazů + + se upřednostňuje redukce sčítání je zleva asocatvní. Naopak u mocnnných výrazů, třeba ˆˆ, které jsou zpravdla zprava asocatvní, se volí přesun. Na závěr k problematce konflktů přesun/redukce x

uveďme, že výše uvedená gramatka pro pops artmetckých výrazů lze nahradt ekvvalentní, která jž v sobě obsahuje nformac o asocatvtě a prortě operací. Vz následující příklad. Příklad 3. Uvažujme expandovanou bezkontextovou gramatku G = (N, T, P, E ), kde N = {E, E, T, F }, T = {,, +, (, )} a odvozovací pravdla jsou tvaru, P = {E E, E E+T T, T T F F, F (E) }. V této modelové gramatce pro + exstuje pro E + + pouze jeden dervační strom. Podrobně, E E E+T T +T F +T +T +T F +F F + F +. Druhým významným typem konflktů jsou konflkty redukce/redukce. Tyto konflkty vznkají v případě, kdy má jeden vstupní symbol víc redukčních položek a př daném t na vstupu není možné jednoznačně rozhodnout o tom, která redukce bude provedena. Konflkty mez dvěma č více redukcem by v dobře napsaných gramatkách neměly nastávat. Většna generátorů analyzátorů tyto problémy řeší bez větší vntřní logky. Například generátor analyzátorů Bson použje první vyhovující redukční pravdlo. V každém případě konflkty redukce/redukce je nejlepší řešt ručním zásahem do gramatky. Příklad 4. Uvažujme expandovanou bezkontextovou gramatku G 1 = (N, T, P, S ), kde N = {S, S, T }, T = {} a odvozovací pravdla jsou tvaru, P = {S S, S T S ε, T ε}. V této gramatce vznknou dva konflkty redukce/redukce a jeden konflkt přesun/redukce. Je-l na vstupu, nebo ε, pak exstují dvě možné redukce. Navíc vyvstane konflkt, zda-l př vstupu redukovat, č přesouvat. Uvažme zásobníkový symbol Z = U({[S S]}) = {[S S], [S T ], [S S ], [S ε ], [T ], [T ε ]}. Tento symbol obsahuje dvě redukční položky [S ε ] a [T ε ]. Př, č ε na vstupu není možné rozhodnout, která redukce se má použít. Navíc vznká konflkt přesun/redukce mez přesunem termnálu v [T ] a mez oběma redukcem. Ještě jednodušším případem konflktu redukce/redukce je gramatka G 2 = (N, T, P, S ), kde N = {S, S}, T = {} a množna odvozovacích pravdel je P = {S S, S S ε}. V této gramatce dojde pouze k jednomu konflktu redukce/redukce, konkrétně v zásobníkovém symbolu Z = {[S ], [S ε ], [S S]}. Obě konflktní gramatky z předchozího příkladu lze upravt do bezkonflktního tvaru, například gramatku G 1 lze nahradt gramatkou G = (N, T, P, S ), kde N = {S, S, F }, T = {} a odvozovací pravdla jsou tvaru, Analogcky pro druhý případ. P = {S S, S F ε, F S}. x