Sunteți pe pagina 1din 3

GRAMATICAS LL(1)

Las gramáticas LL(1) permiten construir de forma automática un analizador determinista


descendente con tan solo examinar en cada momento el símbolo actual de la cadena de entrada
(símbolo de pre análisis) para saber que producción aplicar.

• L: Método direccional, procesamos la entrada de izquierda a derecha (from left to rigth).

• L: Obtenemos derivación más a la izquierda (left-most derivation).

• 1: Usamos un símbolo de pre análisis para decidir la producción a aplicar.

Teorema 1: Una gramática LL(1) no puede ser recursiva a izquierda y debe estar factorizada.

Teorema 2: Una gramática LL(1) es no ambigua.

Ejemplo de gramática LL(1)

S aB
B b |aBb

¿Cómo garantizar que una gramática es LL(1): los conjuntos PRIMEROS y SIGUIENTES?
Sea α Є (VN U VT), PRIMEROS (α) indica el conjunto de terminales que pueden aparecer al principio
de cadenas derivadas de α.

Si α ═⃰> σ σ1…. σn entonces {σ} Є PRIMEROS (α) con σ Є VT

Si α ═⃰> є entonces {є} Є PRIMEROS (α)

Sea A Є VN entonces SIGUIENTES(A) indica el conjunto de terminales que en cualquier momento


de la derivación pueden aparecer inmediatamente a la derecha (después de) A.

Sea σ Є VT, {σ} Є SIGUIENTES (A) si existe α,β Є (VN U VT)* tales que S ═⃰> αAσβ

Algoritmo para calcular el conjunto de PRIMEROS:


Para X un único símbolo de la gramática (terminal o no terminal). Entonces PRIMEROS(X) consiste
de símbolos terminales y se calcula:

 Si X es un terminal o є , entonces PRIMEROS(X)= X


 Si X es un no-terminal, entonces para cada producción de la forma X X1 X2…Xn,
PRIMEROS(X) contiene a PRIMEROS(X1) - {є}. Si además para algún i<n todos los conjuntos
PRIMEROS(X1)...PRIMEROS (Xi) contienen a є, entonces PRIMEROS(X) contiene a PRIMEROS
(XI+1) - {є}.

Para cualquier cadena, α = X1 X2…Xn, de terminales y no-terminales, entonces PRIMEROS (α)


contiene a PRIMEROS(X1) - {є}. Para algún i=2…n, si PRIMEROS(Xk ) contiene {є} para todos los
k=1… i-1 , entonces PRIMEROS(α ) contiene a PRIMEROS( Xi) - {є} . Finalmente, si para todo i=1…n,
PRIMEROS (Xi) contiene є, entonces PRIMEROS (α) contiene a {є}.
Algoritmo para calcular el conjunto de SIGUIENTES:
Dado A Є VNT, entonces SIGUIENTES(A) consiste de terminales y del símbolo # (símbolo de fin de
cadena) y se calcula como:

 Si A es el símbolo de inicio, entonces {#} Є SIGUIENTES(A)


 Si hay una producción B αAγ, entonces PRIMEROS (γ) - {є} Є SIGUIENTES(A).
 Si existe una producción B αA o´ B αAγ tal que {є} Є PRIMEROS (γ) entonces
SIGUIENTES(B) c SIGUIENTES(A).

Ejemplo: calcular PRIMEROS y SIGUIENTES para la gramática

E T E’

E’ + T E’ | - T E’ | є

T F T’

T’ * F T’ | / F T’ | є

F (E) | num | id

PRIMEROS (E)= {(,id,num }

PRIMEROS (T)= {(,id,num }

PRIMEROS (F)= {(,id,num }

PRIMEROS (E’)= {+,-, є}

PRIMEROS (T’)= {*, /, є}

SIGUIENTES (E)= { #,)}

SIGUIENTES (E’)= { #,)}

SIGUIENTES (T)= { #,),+,-}

SIGUIENTES (T’)= { #,),+,-}

SIGUIENTES (F)= { +,-,*, /,), #}


La condición LL(1)
Para que una gramática sea LL(1) se debe cumplir que:

1. Para las producciones de la forma A α1 | α2 |…αn se debe cumplir que:

PRIMEROS (αi) ∩ PRIMEROS (αj) = Ø para todo i, j ( i != j).

Esta regla permite decidir que´ alternativa elegir conociendo solo un símbolo de la entrada.

2. Si A Є VN, tal que { є } Є PRIMEROS(A), entonces:

PRIMEROS (A) ∩ SIGUIENTES(A) = Ø


Esta condición garantiza que para aquellos símbolos que pueden derivar la cadena vacía, el
primer símbolo que generan y el siguiente que puede aparecer detrás de ellos sean
distintos, sino no sabríamos como decidir si vamos a empezar a reconocer el no-terminal o
que ya lo hemos reconocido.

S-ar putea să vă placă și