Przekształcanie gramatyk do LL(1) Gramatyki LL(k)
Transkrypt
Przekształcanie gramatyk do LL(1) Gramatyki LL(k)
J zyki formalne i kompilatory Modyfikacja: 2005-01-01 Przekształcanie gramatyk do LL(1) Gramatyki LL(k) PobieranieZnaków Przekształcanie gramatyk bezkontekstowych do gramatyk LL(1) Sprawdzanie, czy gramatyka jest LL(1) lub LL(k) Analizator Leksykalny PobieranieSymboli Gramatyka bezkontekstowa Analizator Składniowy J zyki formalne i kompilatory, © by Michał miałek Lewostronna faktoryzacja i zast powanie Gramatyka, gdzie: A aB, A aC, nie jest LL(1) Lewostronna faktoryzacja polega na zast pieniu kilku produkcji jedn oraz dodaniu nowego symbolu nieterminalnego: A aX, X B, X C Ta gramatyka nadal mo e nie by LL(1), gdy np.: A aX, X B, X C, B ab, C ac Zast powanie polega na podstawieniu symboli terminalnych zamiast symboli nieterminalnych: A aX, X ab, X ac, a nast pnie dokonaniu lewostronnej faktoryzacji A aX, X aY, Y b, Y c J zyki formalne i kompilatory Przekształcanie gramatyk, gramatyki LL(k) © by Michał miałek 1 J zyki formalne i kompilatory Modyfikacja: 2005-01-01 Eliminacja lewostronnej rekurencji Gramatyka jest lewostronnie rekurencyjna, gdy posiada produkcje postaci: A A , gdzie A∈Γ i ∈(Σ∪Γ)* Eliminacja lewostronnej rekurencji polega na dodaniu nowego symbolu nieterminalego, który b dzie zamieniał rekurencj na prawostronn . Ogólnie, zestaw produkcji: A A 1, A A 2, … , A A A β 1, A β 2, … , A βn m zamieniamy na nast puj cy zestaw: A β 1A’, A β 2A’, … , A β nA’ A A’, A A’, … , A 1 2 mA’, A’ λ J zyki formalne i kompilatory © by Michał miałek Sprawdzanie gramatyk LL(1) i LL(k) Gramatyka LL(k) wymaga znajomo ci „k” kolejnych symboli ze strumienia wej ciowego, aby poprawnie zanalizowa składni zdania. Dla gramatyk definiujemy zbiory „firstk”, „followk” oraz „klookahead”. Definicje s podobne, jak dla zbiorów „first”, „follow” i „lookahead”. Zbiory t zawieraj nie pojedyncze symbole, ale ci gi składaj ce si z maksimum „k” (by mo e mniej) symboli. Zbiory „follow” musimy oblicza wtedy, gdy elementy zbioru „first” mog by krótsze ni „k”. Podobnie, jak dla gramatyk LL(1), gramatyka jest LL(k), gdy zbiory „k-lookahead” produkcji o tym samym symbolu nieterminanym z lewej strony, s rozł czne. J zyki formalne i kompilatory Przekształcanie gramatyk, gramatyki LL(k) © by Michał miałek 2 J zyki formalne i kompilatory Modyfikacja: 2005-01-01 Sprawdzanie gramatyk LL(k) - ilustracja Mamy gramatyk : S bRS, S λ, R RcSa, S acR, R b λ S Liczymy first3(bRS): S R bRS acR R b S {bb…} {bac} R {bb} RcSa acR {bba} R b {bbb} J zyki formalne i kompilatory © by Michał miałek Sprawdzanie gramatyk LL(k) - ilustracja Liczymy follow3(R): S RcSa follow1(S) = ? S follow3(S) = ? {ca…} S λ {c…} S R RcSa acR {cac} R bRS {cbc} b {aca, acb, bca, bcb, …} {cb..} nale y jeszcze policzy follow1(S) i follow3(S)… J zyki formalne i kompilatory Przekształcanie gramatyk, gramatyki LL(k) © by Michał miałek 3 J zyki formalne i kompilatory Modyfikacja: 2005-01-01 Sprawdzanie gramatyk LL(k) - wiczenia Sprawdzamy, czy gramatyki o nast puj cych zestawach produkcji s LL(1), LL(2), LL(3) (symbole pisane wielkimi literami s nieterminalne, pisane małymi literami s terminalne, S jest symbolem startowym): S aA, A S, A λ S C, S D, C aC, C c, D aD, D d S aAS, S b, A a, A bS S aAaB, S bAbB, A a, A ab, B aB, B a S AS, S λ, A aA, A b Prosz policzy zbiory „lookahead” dla odpowiednich produkcji, porówna je i stwierdzi , czy gramatyka jest LL(1), LL(2), LL(3), czy te nie jest LL(k) gdzie k<4. J zyki formalne i kompilatory Przekształcanie gramatyk, gramatyki LL(k) © by Michał miałek 4