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
LL(1)-elemzés ● kiindulásként az ún. egyszerű LL(1) nyelvtanokat vizsgáljuk ● epszilonmentesek ● 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 B » a 1 α 1 | a 2 α 2 |...
Egyszerű LL(1)-elemzés S a # ab (aSA, 1) pop accept error A(a, 2) bpoperror # (bA, 3) error ● példa elemző táblázatra: error a terminálisokhoz tartozó rész mindig átlós: ha karakter jön, csak a megfelelőt fogadjuk el 1: S » aSA 2: A » a 3: S » bA az olvasott terminális a verem teteje
Egyszerű LL(1)-elemzés ● elemezzük a következő szöveget: aabab# ● 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 S ab (aSA, 1) A(a, 2) # error (bA, 3) 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# ● feladat – 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 ● FIRST 1 (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 FIRST 1 (A) egy eleme A a... FIRST 1 (a) a 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 » | esetén FIRST 1 ( ) és FIRST 1 ( ) 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, amely elemzése során minden szabályt pontosan egyszer használunk! – elemezzük is a szöveget!
Epszilonmentes LL(1)-elemzés ● FOLLOW 1 (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: a szövegben, 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 S a... A S a A X X FOLLOW 1 (A)
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 FOLLOW 1 (A) = FIRST 1 (A) – amennyiben igen, adj példát is rá!
LL(1)-elemzés ● az LL(1)-nyelvtanok tulajdonságai – A » | esetén FIRST 1 ( FOLLOW 1 ( ) ) és FIRST 1 ( FOLLOW 1 ( ) ) diszjunktak – 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 a FIRST 1 (FOLLOW 1 ( ) ) oszlopaiba kerülnek
LL(1)-elemzés ● feladat: – S » Bd | dd A » a | cA B » ABC | bc C » AB | elemzendő: abcd ● feladat: adj meg olyan nyelvtant, amely elemző táblázatában a lehető legtöbb -szabály van! ● feladat: – S » CADB | D A » ab B » Da | C » BbA elemzendő: aba
S ab A # B C cd (Bd, 1) (a, 3) (dd, 2)(Bd, 1) (cA, 4) (Bd, 1) (ABC, 5) (AB, 7) (bc, 6) (AB, 7) ( , 8)
S ab A # B C cd D (CADB, 1) ( , 2) (ab, 3) (Da, 4) (BbA, 6) (D, 2) ( , 5) (CADB, 1) ( , 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 FIRST(k) és FOLLOW(k) szerepel, ahol ezek az első legfeljebb k levezethető terminális – LEFT(k, A, ) := {FIRST(k, x) | S »» wA » w »» wx} – egy eldöntési kritérium: egy nyelvtan LL(k), ha minden A » szabályra LEFT(k, A, ) és LEFT(k, A, ) 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 » A A » Bc | Bd B » a | bB ● S » BabB A » a | B » a | b ● S » Ab | Bc A » aAb | d B » aBc | d