Sei sulla pagina 1di 12

LINGUAGGI LL(1)

Ricorsione sinistra
In generale se esiste la regola con ricorsione sinistra Y Y x1 | Y x2 | | Y xn | v1 | v2 | | vm

questa pu essere sostituita con le regole equivalenti: Y Y (v1 | v2 | | vm)Y (x1 | x2 | | xn )Y |

Fattorizzazione sinistra
La fattorizzazione sinistra serve ad eliminare un eventuale prefisso comune a due parti destre di regole associate allo stesso simbolo non terminale Se una regola della grammatica ha la forma A y v | y w,

con y V+, v V* e w V+ e le stringhe v e w non hanno prefissi comuni, necessario fattorizzare a sinistra sostituendo la regola con: A A yA v|w

dove A un nuovo simbolo non terminale.

Insiemi FIRST
Se x V*, si definisce FIRST(x) linsieme di simboli terminali a tale che x + a y. Se x + allora anche in FIRST(x). -Se t VT allora FIRST(t) = { t }; (per completezza si pone FIRST() = ) -Se X VN allora FIRST(X)= { t | t VT, X + tu, u V*}; -Se X - Se y x1 | x2 | | xn , FIRST(X) = n i=1 FIRST(xi). y1 y2 yn con yi V:

1. se y1 non deriva , FIRST(y) = FIRST(y1);

2. se yi + , per i = 1, , k e k < n, e y k+1 non deriva , FIRST(y) lunione dei FIRST(yi); 3. Se tutti gli yi derivano allora FIRST(y) contiene .

Grammatiche LL(1)
Una grammatica si dice LL(1) se, per ogni regola X x1 | x2 | | xn , con xi V*, i=1,,n,

sono soddisfatte le condizioni seguenti (dette condizioni LL(1)): 1. gli insiemi FIRST(xi) sono a due a due disgiunti; 2. Esiste un solo xj tale che xj + e, se esiste, allora devono essere disgiunti gli insiemi FOLLOW(X) e FIRST(X).

ESERCIZIO 1
Data la seguente grammatica, stabilire se LL(1): S aBbE | b | Db B BcA | A A d | df | dfCg C Ch | i | D Ah | E Ch | a Fattorizzazione: S aBbE | b | Db B BcA | A A dA A fA | A Cg | C Ch | i | D Ah | E Ch | a Eliminazione ricorsione sinistra S aBbE | b | Db B AB B cAB | A dA A fA | A Cg | C iC | C C hC | D Ah | E Ch | a Insiemi FIRST: FIRST(S) {a, b} FIRST(D) = {a, b, d, } FIRST(B) FIRST(A) = {d} FIRST(B) = {c, } FIRST(A) = {d} FIRST(A) = {f, } FIRST(A) FIRST(C) {} = {g, i, h, } FIRST(C) {i} FIRST(C) = {i, h, } FIRST(C) = {h, } FIRST(D) FIRST(A) {} = {d, } FIRST(E) FIRST(C) {a} = {a, i, h, }

Insiemi FOLLOWS: FOLLOWS(S) = {$} FOLLOWS(B) = {b} FOLLOWS(B) = {b} FOLLOWS(A) =FIRST(B) FOLLOWS(B) {h}={c, b, h} FOLLOWS(A) = {c, b, h} FOLLOWS(A) = {c, b, h} FOLLOWS(C) = {g, h} FOLLOWS(C) = {g, h} FOLLOWS(D) = {b} FOLLOWS(E) = {$} La grammatica non LL(1) perch: 1. In A Cg | FIRST(A) FOLLOWS(A)={h} (violazione regola 2) 2. C hC | FIRST(C) FOLLOWS(C)={h} (violazione regola 2)

ESERCIZIO 2
Scrivere un parser discendente per il linguaggio definito dalla grammatica le cui produzioni sono di seguito riportate:

Risoluzione :

INSIEME dei FIRST:

INSIEMI dei FOLLOW:

Lunico conflitto nella tabella di parsing per la regola:

TABELLA di PARSING

La grammatica non LL(1) a causa dellambiguit presente nella cella a sfondo grigio. Nella scrittura del parser discendente in Java sceglieremo di considerare in corrispondenza di unambiguit una sola regola, in particolare la prima, ottenendo cos un parser di un sottoinsieme del linguaggio originario.

Potrebbero piacerti anche