LR-elemzés: LR(0) – ha az x mondatforma nyele , akkor bármely prefixe (az egész is) járható prefixe – ez azt jelenti, hogy ha elkezdjük olvasni a mondatformát, akkor “végig tudjuk olvasni” a járható prefixeket anélkül, hogy redukálnánk – vezessük be a pontot mint metaszimbólumot, ami azt mutatja, hogy tartunk a mondatforma olvasásában (elemzésében) – ha van A » alakú nyelvtani szabály, akkor a grammatika egy LR(0)-eleme [A » . ] – epszilon-szabályhoz [A ».] tartozik
LR-elemzés: LR(0) – az [A » . ] LR(0)-elem érvényes a járható prefixre, ha S »»» Ax » x – ez azt jelenti, hogy ha már végigolvastuk a szöveget, akkor felkészülünk arra, hogy a fenti szabály szerint fogunk redukálni Ax S
LR-elemzés: LR(0) – J a nyelvtan LR(0)-elemeinek egy halmazát jelöli – két elemhalmaz-operátor – closure(J) : J és minden olyan [B ». ], amelyhez closure(J)-ben található [A » .B ] – read(J, X) : elemei minden olyan closure([A » X. ]) minden eleme, melyre [A » .X ] benne van J-ben – closure: az elemzés egy pontjához tartozó összes elem – read: J-ből X-et olvasva az elemzés ide jut
LR-elemzés: LR(0) – az LR-elemzések kiegészített nyelvtanokkal dolgoznak (S' » S szabály) – a két operátorral elkészítjük a nyelv ún. kanonikus halmazait – I 0 := closure([S' ».S]) – a további halmazok (I 1, I 2,...) : minden már meghatározott halmazból próbálunk minden X szimbólumot olvasni – ha már van olyan halmaz, ami kijött, nem kell újat felvenni – ha üres halmaz jött ki, azt sem vesszük fel – a halmazok a read-del egy automatát adnak
LR-elemzés: LR(0) – elemző táblázat – sorai egy-egy kanonikus halmaznak felelnek meg – minden sorhoz tartozik egy működés, valamint a belőle való read-ek sorszámai – redukálni akkor kell, ha a megfelelő kanonikus halmaz minden elemének a végén szerepel a pont – ha a végén nem szerepel pont, léptetés – ha van pont a végén is és a közepén is, akkor nem LR(0)-elemezhető a nyelvtan
LR-elemzés: LR(0) – feladat: mik a kanonikus halmazok? S » T | S + T T » F | T * F F » i | – a kanonikus halmazok – I 0 : [S' ».S], [S ».T], [S ».S+T], [T ».F], [T ».T*F], [F ».i], [F ». ] – I 1 : [S' » S.], [S » S.+T] – I 2 : [S » T.], [T » T.*F] – I 3 : [T » F.] – I 4 : [F » i.]
LR-elemzés: LR(0) – a további kanonikus halmazok – I 5 : [F » ], [S ».T], [S ».S+T], [T ».F], [T ».T*F], [F ».i], [F ». ] – I 6 : [S » S+.T], [T ».F], [T ».T*F], [F ».i], [F ». ] – I 7 : [T » T*.F], [F ».i], [F ». ] – I 8 : [F » ], [S » S.+T] – I 9 : [S » S+T.], [T » T.*F] – I 10 : [T » T*F.] – I 11 : [F ».]
LR-elemzés: LR(0) – feladat: elemzendő bcabbccc# S » ABB | cS A » ab | bS B » b | c ● az elemző: kezdetben (# 0, szöveg), majd... ● ha az elemző állapotában az action accept, vége ● ha s (step, lépés), akkor kiolvassuk a szövegből a következő szimbólumot, és átlépünk az általa jelölt állapotba (ezt jelöljük alsó indexszel) ● ha r (redukálás), akkor az épített mondatforma végéről a szabály jobb oldalának jeleit kicseréljük a szabály fejével; az új állapot az ez előtti állapotból egy lépés a fejjel
LR-elemzés: LR(0) – az automata S' ».S S' » S.S » A.BB S » c.S A » b.S A » a.b a S » AB.BS » ABB. B » b. B » c. S » cS. A » ab.
LR-elemzés: LR(0) – az automata
LR-elemzés: LR(0) a állapot b s 1 3 action B goto SAc accept s s s 5s
LR-elemzés: LR(0) ab r4 7 9 BSAc r5 r2 r6 s 11r3 12r1 7812
LR-elemzés: LR(0) – feladat: elemzendő bcabbccc# – az elemző minden pontban tárolja azt is, milyen állapotban van; a pár első fele valójában egy kétkomponensű (szimbólum + állapot) verem – (# 0, bcabbccc#) (# 0 b 4, cabbccc#) (# 0 b 4 c 3, abbccc#) (# 0 b 4 c 3 a 5, bbccc#) (# 0 b 4 c 3 a 5 b 11, bccc#) (# 0 b 4 c 3 A 2, bccc#) (# 0 b 4 c 3 A 2 b 7, ccc#) (# 0 b 4 c 3 A 2 B 6, ccc#) (# 0 b 4 c 3 A 2 B 6 c 8, cc#) (# 0 b 4 c 3 A 2 B 6 B 12, cc#) (# 0 b 4 c 3 S 9, cc#) (# 0 b 4 S 10, cc#) (# 0 A 2, cc#)......
LR-elemzés: SLR(1) – az LR(0)-elemzés még nem elég, pl. a fólia kezdetén levő egyszerű aritmetikai nyelvtan (amiben +, *, <> volt) is konfliktusos (I 2 állapot) – a probléma: vannak olyan állapotok, amikben a pont a szöveg közepén és végén is előfordul, azaz redukciót és léptetést is előírunk hozzá – javítás: a redukciót csak a szabály fejében szereplő nemterminális FOLLOW-jára hajtsuk végre (a léptetést pedig azokra a jelekre, amikre szükséges) – ha így konfliktusmentes az elemző, akkor SLR(1)- nek nevezzük
LR-elemzés: SLR(1) – kibővül az action szerepe: most már minden terminálisnál lehet redukálni és léptetni is – ha [A » .a ] a H i kanonikus halmaz eleme, akkor a hozzá tartozó i-edik állapotban a-ra léptetést írunk elő: sj, ahol H j = read(H i, a) – ha [A » .] a H i kanonikus halmaz eleme, akkor az i-edik állapotban FOLLOW 1 (A) minden elemére redukálást írunk elő: rk, ahol A » a nyelvtan k- adik szabálya – [S' » S.] esetén (ált. H 1 -ben van) #-ra accept – feladat: elemezzük az aritmetikai nyelvtant
LR-elemzés: SLR(1) < állapot F 1 3 action * goto i+ acc s >ET# s6 s7 r5 s4 r1 r5 83 r1 r3 s5
LR-elemzés: SLR(1) < állapot F 7 9 action * goto i+ s >ET# s6 r2 s11 r2 r4 s410 r6 s7 s5
LR-elemzés: SLR(1) feladat: elemzendő i+ *i# (# 0, i+ *i#) (# 0 i 4, + *i#) (# 0 F 3, + *i#) (# 0 T 2, + *i#) (# 0 E 1, + *i#) (# 0 E 4 + 6, *i#) (# 0 E *i#) (# 0 E *i#) ......
LR-elemzés: LR(1) – az SLR(1)-elemzés sem képes minden szöveget elemezni, pl. S » aEa | bEb | aFb | bFa E » e F » e – a probléma: a szöveg egy adott pontján egy jelet nem biztos, hogy FOLLOW-jának tetszőleges eleme követheti – javítás: számon tartjuk, hogy az adott ponton mi követheti a jeleket – ha így konfliktusmentes az elemző, akkor LR(1)- nek nevezzük
LR-elemzés: LR(1) – ha van A » alakú nyelvtani szabály és X tetszőleges terminális vagy #, akkor a grammatika egy LR(1)-eleme [A » . , X] – epszilon-szabályhoz [A »., X] tartozik – az elem első komponensét az elem magjának nevezzük – X-et előreolvasási szimbólumnak nevezzük Aa xAa S x # A S
LR-elemzés: LR(1) az LR(0)-beli fogalmak LR(1)-es társai – closure(J) : J és minden olyan [B ». , b], amelyhez closure(J)-ben található [A » .B , a], melyre b FIRST 1 ( a) – read(J, X) : closure([A » X. , a]) elemei minden J-ből származó [A » .X , a]-ra – kanonikus halmazok: H 0 =closure([S' » S, #]), a továbbiak read-ekkel, mint LR(0)-ban
LR-elemzés: LR(1) – feladat: írjuk fel az elemző táblázatot S » Aa | bAc | Bc | bBa A » d B » d – miért nem SLR(1)? – elemzendő: bdc – mj: a nyelvtan nem is LALR(1). Miért?
LR-elemzés: LALR(1) – az LR(1)-elemző “mindent tud”, viszont nagyon sok állapota van (teljes programnyelvekre tízezres nagyságrendű), míg az SLR(1)-elemzőnek jóval kevesebb (max. ezres nagyságrend) – észrevétel: sok LR(1)-es kanonikus halmaz csak az előreolvasási szimbólumokban tér el, a magjuk pedig azonos; ezeket próbáljuk meg egyesíteni
LR-elemzés: LALR(1) – vonjuk össze az azonos magú kanonikus halmazokat – a read függvényt terjesszük ki: ha H i -t a K i halmazba, H j -t a K j halmazba vontuk össze, és read(H i, X) = H j, akkor read(K i, X) = K j – konfliktusok az összevont elemzőben: a két halmaz eltérő cselekvéseket ír elő – léptetés-léptetés: nem konfliktus, léptetünk – léptetés-redukálás: ekkor az eredeti elemzőben is konfliktus lett volna – redukálás-redukálás: előfordulhat; akkor LALR(1)-es a nyelvtan, ha nincs
LR-elemzés: LALR(1) – az előbbi módszerrel el kell készíteni az LR(1)- elemzőt is az LALR(1)-elemzőhöz, ezt pedig szeretnénk megspórolni – nevezzük egy kanonikus halmaz törzsének azokat az elemeket, amelyek magjában a pont nem az elején áll (kivétel: H 0, aminek a törzse [S' ».S, #]) – a törzsből lezárással visszaállítható a halmaz
LR-elemzés: LALR(1) 1. meghatározzuk az LR(0)-halmazok törzseit 2. kiegészítjük ezeket a megfelelő előreolvasási szimbólumokkal – először az ún. spontán generálhatóakkal – utána pedig, amíg új jeleket ad, örökléssel meghatározzuk, mikor kell léptetni illetve redukálni – az első lépés egyszerű, a másik kettő a következő oldalakon
LR-elemzés: LALR(1) spontán generálás a closure-rel – ha [C » .B , c] i, B »»» A » X , és , akkor minden a FIRST 1 ( )-ra [A » X. , a] read( i,X) spontán generálható öröklődés a closure-rel – ha [C » .B, c] i, B »»» A » X , akkor c öröklődik [A » X. , c] read( i,X)-be
LR-elemzés: LALR(1) C B A X ... C B A X a öröklődik spontán generálódik a
LR-elemzés: LALR(1) – vegyük a K i alapjaként szolgáló J i LR(0)-halmazt és új metaszimbólumot spontán generálás a read-del – ha [A » X a] closure([B » . valamely [B » . ] J i -re, és a akkor [A » X. a] read(K i X) öröklődés a read-del – ha [A » X closure([B » . akkor [A » X. a] read(K i X) minden a-ra, amelyre [A » X a] K i
LR-elemzés: LALR(1) B A X spontán -ból jön, B A X
LR-elemzés: LALR(1) redukálás – ha nem epszilon-szabályról van szó, akkor a kanonikus halmaz törzsében jelen van az ezt szükségessé tevő elem (ponttal a végén) – A » redukciót olyan elemekre kell végrehajtani, melyekre [C » .B , c] i, B »»» A és az előreolvasási szimbólumok: a FIRST 1 ( c) léptetés – a-ra léptetünk, ha a törzsben szerepel [B » .A , b], és A »»» ax úgy, hogy az utolsó alkalmazott helyettesítési szabály epszilon-mentes