PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LL SYNAKICKÁ ANALÝZA DOKONČENÍ, IMPLEMENACE. VLASNOSI LL GRAMAIK A JAZYKŮ. 2011 Jan Janoušek BI-PJP Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti
Gramatika generující aritmetický výraz Požadavky na syntaktickou strukturu (derivační strom) výrazů v gramatice: Strom musí respektovat prioritu operátorů: 1. ( ) 2. * 3. + Výpočet zdola-nahoru ve stromě se při stejné prioritě operátorů provádí zleva doprava.
Gramatika generující aritmetický výraz Gramatika: (1) E E + (2) E (3) * F (4) F (5) F a (6) F ( E ) Pozn. ato gramatika není LL(k) pro žádné k>=1, protože obsahuje levou rekurzi.
Levá derivace a derivační strom pro větu a+a*a E 1 E+ 2 + 4 F+ 6 a+ 3 a+*f 4 a+f*f 6 a+a*f 6 a+a*a E 1 E 2 E E E 3 E + E + E + E + F F E 4 E 6 E 6 a E + E + E + E + * F * F * F * F F F F F F F a a a a
Posloupnost přechodů při analýze shora-dolů pro větu a+a*a : (a+a*a, E) (a+a*a, E+) expanze pravidlem (1) (a+a*a, +) expanze pravidlem (2) (a+a*a, F+) expanze pravidlem (4) (a+a*a, a+) expanze pravidlem (5) (+a*a, +) srovnání (a*a, ) srovnání (a*a, *F) expanze pravidlem (3) (a*a, F*F) expanze pravidlem (4) (a*a, a*f) expanze pravidlem (5) (*a, *F) srovnání (a, F) srovnání (a, a) expanze pravidlem (4) (, ) srovnání
Odstranění levé rekurze z gramatiky (1) E E + (2) E (3) * F (4) F (5) F a (6) F ( E ) (1) E E (2) E E (3) E ε (4) F (5) F (6) ε (7) F a (8) F ( E ) Pozn. tato gramatika je již LL(1).
Konstrukce rozkladové tabulky Množiny FIRS(α) a Follow(A) pro pravidla A α gramatiky: FIRS(E )= { a,( } FOLLOW(E)={ ), ε } FIRS( E )= { + } FIRS( ε )={ ε } FIRS( F )= { a,( } FIRS( F )= { } FIRS( ε )= { ε } FIRS( a )= { a } FIRS( ( E ) )= { ( } FOLLOW(E )={ ), ε } FOLLOW()={ +,), ε } FOLLOW( )={ +,), ε } FOLLOW(F)={ +, *, ), ε }
Rozkladová tabulka a + * ( ) ε E 1 1 E 2 3 3 4 4 6 5 6 6 F 7 8
Průběh LL(1) analýzy (a +a *a, E, ε ) ( a +a*a, E', 1 ) ( a +a*a, F ' E', 14 ) ( a +a*a, a ' E', 147 ) ( +a*a, ' E', 147 ) ( +a*a, E', 1476 ) ( +a*a, + E', 14762 ) ( a*a, E', 14762 )
Průběh LL(1) analýzy ( a*a, a ' E', 1476247 ) ( *a, ' E', 1476247 ) ( *a, * F ' E', 14762475 ) ( a, F ' E', 14762475 ) ( a, a ' E', 147624757 ) ( ε, ' E', 147624757 ) ( ε, E', 1476247576 ) ( ε, ε, 14762475763 )
Implementace LL(1) analýzy Nejčastější implementace LL(1) analýzy je tzv. metoda rekurzivních procedur (neboli metoda rekurzivního sestupu). Rekurze v procedurách similuje činnost zásobníkového automatu.
Implementace rekurzivním sestupem Pro každý neterminál procedura ělo procedury A: větvení do tolika alternativ, kolik je A-pravidel + chyba Pro pravidlo A 1... m má tělo procedury tvar if Symb SELEC(A, 1) then analýza podle pravé strany 1 else... else if Symb SELEC(A, m) then analýza podle pravé strany m else chyba při expanzi neterminálu A kde SELEC(A, ) = FIRS( ), když FIRS( ), SELEC(A, ) = FOLLOW(A) (FIRS( ) { }), když FIRS( ).
Implementace rekurzivním sestupem Jestliže pro pravou stranu platí = X1 X2... Xn pak jí odpovídající analýzu provede posloupnost příkazů X'1 X'2... X'n, kde X'i je příkaz procedury Xi, když Xi je neterminální symbol, X'i je příkaz procedury Srovnej(Xi), když Xi je terminální symbol. Procedura Srovnej(x) je definována takto: if x = Symb then čtení dalsího vstupního symbolu else chyba při srovnání (očekává se x)
Vlastnosti LL gramatik a jazyků
Gramatika, která není LL(1) Pokud gramatika není LL(1), nastává při kostrukci rozkladové tabulky nedeterminismus tzv. kolize. Existují dva typy těchto kolizí: Kolize typu FIRS-FIRS příklad: S asb Ac, A aab b Kolize typu FIRS-FOLLOW příklad: S asb csa ε
Definice Bezkontextový jazyk L se nazývá LL(k) jazyk, jestliže existuje LL(k) gramatika G taková, že L=L(G). Bezkontextový jazyk L se nazývá LL jazyk, jestliže existuje LL(k) gramatika G pro nějaké k>=0 taková, že L=L(G).
Věta 1 Každá LL(k) gramatika je jednoznačná. Věta 2 Žádná LL(k) gramatika není levě rekurzivní. Věta 3 Pro danou bezkontextovou gramatiku G a dané pevné k>=0 je rozhodnutelné, zda G je nebo není LL(k).
Věta 4 Pro danou bezkontextovou gramatiku G je nerozhodnutelné, zda je LL(k) gramatikou pro nějaké k>=0. Věta 5 Je-li dána bezkontextová gramatika G, která není LL(k) a pevné k, je nerozhodnutelné, zda G má ekvivalentní gramatiku, která je LL(k).
Příklad jazyk, který není LL L = { a^m b^n : m>=n>=0 } Pozn. ento jazyk je obdobou konstruktu if-then a if-thenelse, který se běžně vyskytuje v programovacích jazycích (deterministické řešení bude ukázáno na příští přednášce).