LL(1)-elemzés az LL(1)-elemzők már jobbak az előzőeknél, bár nem fedik le a programozási nyelvek szükségleteit alapötlet: a levezetés következő lépéséhez használjuk fel a szöveg következő terminálisát kiindulásként az ún. egyszerű LL(1) nyelvtanokat vizsgáljuk epszilonmentes a szabályok jobb oldalai terminálissal kezdődnek az azonos bal oldalú szabályok jobb oldalának kezdeti terminálisai különbözőek
Egyszerű LL(1)-elemzés példa elemző táblázatra: 1: S » aSA 2: A » a 3: S » bA a verem teteje a b # az olvasott terminális S (aSA, 1) (bA, 3) error A (a, 2) error error mj. : a szürkén jelölt rész mindig átlós: ha karakter jön, csak a megfelelőt fogadjuk el a pop error error b error pop error # error error accept
Egyszerű LL(1)-elemzés a b # elemezzük a következő szöveget: aabab# S (aSA, 1) (bA, 3) error A (a, 2) error error az elemzés menetének komponensei: (szöveg, mondatforma, alkalmazott szabályok) az elemzés menete: a táblázat szerint léptetünk vagy fejtjük ki a szabályt; kiindulás: (szöveg, S#, ) (aabab#, S#, ) ® (aabab#, aSA#, 1) ® (abab#, SA#, 1) ® (abab#, aSA#, 11) ® (bab#, SA#, 11) ® (bab#, bAA#, 113) ® (ab#, AA#, 113) ® (ab#, aA#, 1132) ® (b#, A#, 1132) ® error
Egyszerű LL(1)-elemzés feladat adott a következő nyelvtan S » aS | bA A » d | ccA hogy néz ki az elemző táblázat? le lehet-e vezetni: abc# adj meg olyan nyelvtant, amiben n db nemterminális és m db terminális szerepel, és az elemző táblázatnak a lehető legtöbb mezője ki van töltve!
Epszilonmentes LL(1)-elemzés ez már majdnem a teljes LL(1) az az ötlet, hogy a szövegekben megjelenő kezdeti terminálisokat vizsgáljuk, és ezek szerint választjuk ki, melyik szabályt kell alkalmazni FIRST1(a): az a mondatformából levezethető mondatok első terminálisainak halmaza van algoritmus rá, hogyan lehet ezeket kinyerni a nyelvtan ismeretében a mi egyszerű nyelvtanainkból ránézésre is látszanak előfordulhat, hogy # is eleme ha epszilon-szabályok is megengedettek, lehet üres is
Epszilonmentes LL(1)-elemzés A a ... ... a ... a ... FIRST1(A) egy eleme FIRST1(a)
Epszilonmentes LL(1)-elemzés feladat: határozzuk meg minden nyelvtani jel FIRST-jét az alábbi nyelvtanokban S » Bc | SA A » aAA | a B » Bb | b S » A | B | C | D A » aB | Ab B » bC | Bc C » cD | Cd D » dE | De E » e
Epszilonmentes LL(1)-elemzés az epszilonmentes nyelvtanok tulajdonságai epszilonmentesek :) A » a | b esetén FIRST1(a) és FIRST1(b) diszjunktak az elemző táblázat pontosan olyan, mint az egyszerű LL(1) esetén ha egy szabály nemterminálissal kezdődik, akkor minden olyan terminális oszlopába be kell írni, ami szerepel a FIRST-jében mivel a FIRST-ök különbözőek, garantált, hogy egy mezőt nem próbálunk meg kétszer is kitölteni
Epszilonmentes LL(1)-elemzés feladat adott a következő nyelvtan S » dSdS | A | eB A » a | BA B » b | c adjuk meg az elemző táblázatot adjunk olyan szöveget, aminek az elemzése során minden szabályt pontosan egyszer használunk! elemezzük is a szöveget!
Epszilonmentes LL(1)-elemzés FOLLOW1(A): azok a terminálisok, amelyekhez van a nyelvnek olyan mondata, hogy a szintaxisfában közvetlenül A után szerepelnek másképpen megfogalmazva: ahogy olvassuk a szöveget, miután kiolvastuk A-t, rögtön ez a terminális következik ezek kinyerésére is van algoritmus míg a FIRST meghatározásánál abból a szabályból indul ki az ember, aminek a bal oldalán áll a nemterminális, itt azokból, amelyek a jobb oldalon tartalmazzák; az utána jövő jel FIRST-je adja meg előfordulhat itt is, hogy a # is eleme
LL(1)-elemzés FOLLOW1(A) FOLLOW1(A) S S ... ... ... A X ... ... X ...
Epszilonmentes LL(1)-elemzés feladat: határozzuk meg minden nyelvtani jel FOLLOW-ját az alábbi nyelvtanban S » ABCBA A » aB | a B » bA | b C » cAcB kérdés: előfordulhat-e, hogy FOLLOW1(A) = FIRST1(A) amennyiben igen, adj példát is rá!
LL(1)-elemzés az LL(1)-nyelvtanok tulajdonságai A » a | b esetén FIRST1(a FOLLOW1(A) ) és FIRST1(b FOLLOW1(A) ) diszjunktak mj. : a feltétel még mindig arról szól, hogy egyértelműnek kell lennie a terminálisból, melyik szabály következik a szintaxisfában az elemző táblázat még tovább bővül az epszilonmentes LL(1)-hez képest az epszilon-szabályok FOLLOW1(A) oszlopaiba kerülnek
LL(1)-elemzés feladat: elemzendő: abcd# S » Bd | dd A » a | cA B » ABCd | bc C » AB | e feladat: elemzendő: aba# S » CADB | D A » ab B » Da | e C » BbA D » e feladat: adj meg olyan nyelvtant, aminek az elemző táblázatában a lehető legtöbb e-szabály van!
a b c d # S (Bd, 1) (Bd, 1) (Bd, 1) (dd, 2) A (a, 3) (cA, 4) B (ABC, 5) (bc, 6) (ABC, 5) C (AB, 7) (AB, 7) (e, 8) S (CADB,1) (CADB,1) (D, 2) (e, 2) A (ab, 3) B (Da, 4) (e, 5) (e, 5) C (BbA, 6) (BbA, 6) D (e, 7) (e, 7)
LL(k) feladat: adjunk olyan nyelvtant, ami nem LL(1)-es típusú, de pár elem előreolvasásával meg lehet mondani, melyik szabályt kell választani! az LL(k) elemzések pont erről szólnak a definíciójában FIRSTk és FOLLOWk szerepel, ahol ezek az első legfeljebb k levezethető terminális LEFTk(A, g) := {FIRSTk(x) | S »» wAb » wgb »» wx} egy eldöntési kritérium: egy nyelvtan LL(k), ha minden A » g | b szabályra LEFTk(A, g) és LEFTk(A, b) diszjunktak ezek sem elég jók: adjunk meg olyan nyelvtant, ami semmilyen k-ra nem LL(k)!
LL(k) feladat: milyen k-ra LL(k)? Át lehet-e alakítani úgy, hogy kisebb k-ra LL(k) legyen? S » BAbB A » a | e B » a | b S » A A » Bc | Bd B » a | bB S » Ab | Bc A » aAb | d B » aBc | d