Teljes visszalépéses elemzés adott a következő nyelvtan S» aad a A» b c elemezzük a következő szöveget: accd» ccd ddc S S a A d a A b c d a c c d a c c d
Teljes visszalépéses elemzés adott a következő nyelvtan S» aad a A» b c elemezzük a következő szöveget: accd» ccd ddc S a c c d a c c d
Teljes visszalépéses elemzés balrekurziómentes L nyelvtanokra jó az elemzés menetét egy négyessel írjuk le állapot q: előrehaladás b: visszalépés t: terminálás véget ért az elemzés mutató a bemenet következő elemére az elemzés története (verem) vizsgált mondatforma (verem) kezdőállapot: (q, 1,, S#)
Teljes visszalépéses elemzés az elemzés szabályai: q állapot (előrehaladás) ha a mondatformában terminális jön...... és az megegyezik az aktuális pozíción elhelyezkedő terminálissal, léptetjük a pozíciót, és áthelyezzük a terminálist az elemzés történetének végére... és nem egyezik, b állapotba váltunk ha nemterminális jön a mondatformában, áthelyezzük az elemzés történetébe, és az első vele szereplő szabály jobb oldalát a vizsgált mondatforma elejére fűzzük ha a mondat végére értünk (# jel következik)... és a szöveg végén áll a mutató, t állapotba váltunk... különben pedig b állapotba ha t állapotban vagyunk, készen vagyunk, és a mondat helyes; a szintaxisfa az elemzés történetében található
Teljes visszalépéses elemzés az elemzés szabályai: b állapot (visszalépés) ha az elemzés történetének végén terminális áll, visszaírjuk az vizsgált mondatforma elejére, eltávolítjuk az elemzés végéről, és visszaállítjuk eggyel a mutatót ha az elemzés történetének végén nemterminális áll... és még van vele alkalmazható szabály, akkor feljegyezzük, hanyadik alkalmazott szabálynál tartunk, és az előző szabály jobb oldalát, amelynek ekkor a vizsgált mondatforma elején kell lennie, lecseréljük az aktuális jobb oldalra... ha már minden alkalmazható szabályt végigpróbáltunk, akkor visszaírjuk a vizsgált mondatforma elejére, és kitöröljük az elemzés végéről ha az elemzés története üres, a mondat nem eleme a nyelvnek kellemetlen, hogy nem tudunk semmit se mondani arról, hol rontottuk el a mondatot
Teljes visszalépéses elemzés az előző elemzés menete formálisan: (q, 1,, S#) (q, 1, S 1, aad#) (q,, S 1 a, Ad#) (q,, S 1 aa 1, bd#) (b,, S 1 aa 1, bd#) (b,, S 1 aa, cd#) (q,, S 1 aa c, d#) (b,, S 1 aa c, d#) (b,, S 1 aa, cd#) (b,, S 1 a, Αd#) (b, 1, S 1, aad#) (q, 1, S, a#) (q,, S a, #) (q,, S a 1, ccd#) (q,, S a 1 c, cd#) (q,, S a 1 cc, d#) (q,, S a 1 ccd, #) (t,, S a 1 ccd, #)
feladat Teljes visszalépéses elemzés S» T TE E» +T +TE T» F FU U» *F *FU F» i [S] elemezzük a következő szövegeket: i+i# # (vagyis az üres szöveg) mi lesz az elemzés végén az elemző állapota? hogyan néz ki a kapott szintaxisfa? hány lépést tettünk meg?
Teljes visszalépéses elemzés összesen lépés lesz, ebből az elsők: (q, 1,, S#) (q, 1, S 1, Τ#) (q, 1, S 1 T 1, F#) (q, 1, S 1 T 1 F 1, i#) (q,, S 1 T 1 F 1 i, #) (b,, S 1 T 1 F 1 i, #) (b, 1, S 1 T 1 F 1, i#) (q, 1, S 1 T 1 F, [Ε]#) (b, 1, S 1 T 1 F, [Ε]#) (b, 1, S 1 T 1, F#) (q, 1, S 1 T, FU#) (q, 1, S 1 T F 1, iu#) (q, 1, S 1 T F 1 i, U#) (q, 1, S 1 T F 1 iu 1, *F#)...
Teljes visszalépéses elemzés Az elemzés végállapota: (t,, S T 1 F 1 ie 1 +T 1 F 1 i, #) T S E Ez kiolvasható a fából szélességi bejárással; a harmadik komponens alapján pedig fel lehet építeni a szintaxisfát. F T F i + i
mohó algoritmus: elfogadott terminálist nem von vissza a grammatikát át kell hozzá alakítani A» aβ aγ helyett A» a és» β γ szabályok nem tartalmazhatják egymást, azaz nem lehet ilyen: A» x és» xβ működése: programozott mikrogép 1 bites regiszter mutató a szövegre mikroprocesszor verem
általános programsor: címke a AT AF működés: if a = c[i] then c[i] a szöveg i-edik karakterét jelöli i = i + 1 execute AT else if nemterminális( a ) then push i call a if reg then execute AT end if else execute AF end if execute X: ha üres a mező: a következő sorra megyünk logikai érték esetén: a regiszter felveszi az értéket, majd visszatérünk a rutinból OK vagy ERROR: program vége
egy általános szabály A» acd programja AF mindig, AT az utolsó sorban true, különben üres. A a c d true S-hez tartozó szabály S» Ac programja Különbségek: jobb oldal végén # (ez jelzi a szöveg végét) true és helyett OK és ERROR (ezek jelzik az elemzés végét) S A ERROR ERROR c ERROR
epszilon-szabály A» ε programja A X * true X * a csillagok helyére bármilyen jel kerülhet több alternatívával rendelkező szabály A» β γ δ programja átírjuk a szabályt A» X Y δ alakra, ahol X és Y új nemterminálisok δ utolsó sora kivételével, mint az egyszerű szabálynál, AF és AT üres A X true Y δ 1... δ utolsó true true
feladat: add meg az alábbi nyelvtan programját, majd elemezd az a=(a+b)# mondatot vele! Korlátozott visszalépéses elemzés feladat: add meg az alábbi nyelvtan programját! S» A A» aa a» b ac adj meg egy olyan mondatot, amely eleme a nyelvnek, de a program mégse fogadja el! az elemző komoly hiányossága a nemteljessége
az A» aa a szabály átalakítandó C új nemterminális A» ac C» a ε ha az alternatíva csak egy terminálist tartalmaz, akkor nem szükséges új nyelvtani jelet bevezetni S» A A» aa a» b ac ERROR A a C true a c true C a true C true C C true C a
az aac# szöveg eleme a nyelvnek az alábbi szintaxisfával S az elemző azonban rossz szabályt próbál alkalmazni, és elakad S A A a a c a a b a a c a a c
az elemzés állapota tartalmazza: a pozíciót a szövegben a végrehajtandó sor sorszámát a visszatérési címeket A = kezdetben: 1 1 true a true b true S» A A» =» a b ( + ) ( + ) true
1 1 1 A = true a true b true ( 1 + ) true
1 1 1 1 1 1 A = true a true ( + ) true
1 1 1 1 1 1 1 1 A = true a true ( + ) true
1 1 1 1 1 1 1 1 1 A = true a true ( + ) true
1 1 1 1 1 1 1 1 1 1 A = true a true ( + ) true
1 1 1 1 1 1 1 1 1 1 1 A = true a true ( + ) true
1 1 1 1 1 1 1 1 1 1 1 1 A = true a true ( + ) true
1 1 1 1 1 1 1 1 1 1 1 1 1 A = true a true ( + ) true
1 1 1 1 1 1 1 1 1 1 1 1 1 1 A = true a true ( + ) true
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 A = true a true ( + ) true
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 A = true a true ( + ) true
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 A = true a true ( + ) true
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 A = true a true ( + ) true
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 A = true a true ( + ) true
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 A = true a true ( + ) true
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 A = true a true ( + ) true
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 A = true a true ( + ) true
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 A = true a true ( + ) true
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 A = true a true ( + ) true
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 A = true a true ( + ) true
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 A = true a true ( + ) true
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 OK 1 A = true a true ( + ) true