Vous êtes sur la page 1sur 16

Universidad de Santiago de Chile Facultad de Ingeniera Departamento de Ingeniera Informtica Ingeniera Civil en Informtica Autmatas y Lenguajes Formales

7. RECONOCIMIENTO DETERMINISTA DE LENGUAJES INDEPENDIENTES DEL CONTEXTO. LENGUAJES LL(K) Y LR(K) 7.1. Derivacin por la izquierda
Ejemplo: G = ({E}, {+, *, (, ), -, i}, {E E + E | E * E | (E) | -E | i}, E) E -E -(E) -(E + E) -(i + E) -(i + i)

7.2. Derivacin por la derecha


Ejemplo: G = ({E}, {+, *, (, ), -, i}, {E E + E | E * E | (E) | -E | i}, E) E -E -(E) -(E + E) -(E + i) -(i + i)

7.3. rbol de anlisis sintctico


Un rbol de anlisis sintctico es un rbol con las siguientes propiedades: 1. La raz est etiquetada con el smbolo inicial. 2. Cada hoja est etiquetada con un terminal o con . 3. Cada nodo interior est etiquetado con un no terminal. 4. Si A es el no terminal que etiqueta a algn nodo interior y X 1, X2, ... , Xn son las etiquetas de los hijos de ese nodo, de izquierda a derecha, entonces A X1 X2 ... Xn es una produccin. Ejemplo: G = ({E}, {+, *, (, ), -, i}, {E E + E | E * E | (E) | -E | i}, E)
E

Profesora: Sra. Consuelo Ramrez.

76

Universidad de Santiago de Chile Facultad de Ingeniera Departamento de Ingeniera Informtica Ingeniera Civil en Informtica Autmatas y Lenguajes Formales

7.4. Gramtica ambigua


Se dice que una gramtica que produce ms de un rbol de anlisis sintctico para alguna palabra es ambigua. O, dicho de otro modo, una gramtica ambigua es la que produce ms de una derivacin por la izquierda o por la derecha para la misma palabra. Ejemplo: G = ({E}, {+, *, (, ), -, i}, {E E + E | E * E | (E) | -E | i}, E) Derivaciones por la izquierda E E + E i + E i + E * E i + i * E i + i * i E E * E E + E * E i + E * E i + i * E i + i * i rboles de anlisis sintctico
E E

Profesora: Sra. Consuelo Ramrez.

77

Universidad de Santiago de Chile Facultad de Ingeniera Departamento de Ingeniera Informtica Ingeniera Civil en Informtica Autmatas y Lenguajes Formales

7.5. Recursividad por la izquierda


G = (N, , P, S) A A
+

A N ( N ) *

7.5.1. Eliminacin de la recursividad por la izquierda G = (N, , P, S) G = (N, , P, S) A A | P A A' P' A' A' | A 1 A' | 2 A' | ... | n A' P' A' 1 A' | 2 A' | ... | m A' |

A A 1 | A 2 | ... | A m | 1 | 2 | ... | n P N = N {A} Ejemplo: G = ({E, T, F}, {+, *, (, ), i}, P, E) P = { E E + T | T T T * F | F F ( E ) | i }

Profesora: Sra. Consuelo Ramrez.

78

Universidad de Santiago de Chile Facultad de Ingeniera Departamento de Ingeniera Informtica Ingeniera Civil en Informtica Autmatas y Lenguajes Formales

7.6. Factorizacin por la izquierda


G = (N, , P, S) G = (N, , P, S) A 1 | 2 | ... | m | 1 | 2 | ... | n P N = N {A} Ejemplo: G = ({P, E}, {i, t, e, a, b}, P, P) P = { P iEtP | iEtPeP | a E b } A A' | 1 | 2 | ... | n P' A' 1 | 2 | ... | m

Profesora: Sra. Consuelo Ramrez.

79

Universidad de Santiago de Chile Facultad de Ingeniera Departamento de Ingeniera Informtica Ingeniera Civil en Informtica Autmatas y Lenguajes Formales

7.7. Primero
G = (N, , P, S) P ( ) = { /

*

, ( N ) * }

P() = P() ={} , (N )* A 1 | 2 | ... | n P P(A) = P(1) P(2) ... P(n) = X1 X2 ... Xn Algoritmo: P() = P(X1) i=1 Mientras Xi N { P() = P() P(Xi+1) i=i+1 }

AN

Ejemplo: G = ({E, E, T, T, F}, {+, *, (, ), i}, P, E) P = { E TE E + TE | T FT T * FT | F ( E ) | i }

Profesora: Sra. Consuelo Ramrez.

80

Universidad de Santiago de Chile Facultad de Ingeniera Departamento de Ingeniera Informtica Ingeniera Civil en Informtica Autmatas y Lenguajes Formales

7.8. Siguiente
G = (N, , P, S) S ( A) = { / S A S ( S ) = {$} A B S ( B) = P ( ) A B S ( B ) = S ( A) A B
* *

A N , ( N ) * }

A, B N , ( N ) * A, B N ( N ) *

S ( B ) = P ( ) S ( A) A, B N , ( N ) *

Ejemplo: G = ({E, E, T, T, F}, {+, *, (, ), i}, P, E) P = { E TE E + TE | T FT T * FT | F ( E ) | i }

Profesora: Sra. Consuelo Ramrez.

81

Universidad de Santiago de Chile Facultad de Ingeniera Departamento de Ingeniera Informtica Ingeniera Civil en Informtica Autmatas y Lenguajes Formales

7.9. Analizador sintctico LL(1)


La primera L representa el examen de la entrada de izquierda a derecha, la segunda L representa una derivacin por la izquierda, y el 1 es por utilizar un smbolo de entrada de examen por anticipado en cada paso para tomar las decisiones de la accin en el anlisis sintctico. 7.9.1. Gramtica LL(1) Ninguna gramtica ambigua o recursiva por la izquierda puede ser LL(1) [6]. G = (N, , P, S)
1. 2.

A 1 | 2 | ... | n P P(i) P(j) = P(A) S(A) = A N

AN,i j

Ejemplo: G = ({E, E, T, T, F}, {+, *, (, ), i}, P, E) P = { E TE E + TE | T FT T * FT | F ( E ) | i } Ejercicio: G = ({P, P, E}, {i, t, e, a, b}, P, P) P = { P iEtPP | a P | eP E b }

Profesora: Sra. Consuelo Ramrez.

82

Universidad de Santiago de Chile Facultad de Ingeniera Departamento de Ingeniera Informtica Ingeniera Civil en Informtica Autmatas y Lenguajes Formales

7.9.2. Tabla del analizador sintctico LL(1) Algoritmo: A P { P() M[A, ] = A Si A N entonces S(A) M[A, ] = A } Ejemplo: G = ({E, E, T, T, F}, {+, *, (, ), i}, P, E) P = { E TE E + TE | T FT T * FT | F ( E ) | i } =i+i*i Ejercicio: G = ({P, P, E}, {i, t, e, a, b}, P, P) P = { P iEtPP | a P | eP E b }

Profesora: Sra. Consuelo Ramrez.

83

Universidad de Santiago de Chile Facultad de Ingeniera Departamento de Ingeniera Informtica Ingeniera Civil en Informtica Autmatas y Lenguajes Formales

7.9.3. Recuperacin de errores en el analizador sintctico LL(1) G = (N, , P, S) M[A, ] = sinc A N , S(A)

Ejemplo: G = ({E, E, T, T, F}, {+, *, (, ), i}, P, E) P = { E TE E + TE | T FT T * FT | F ( E ) | i } M[A, ] = saltar M[A, ] = sinc sacar A Ejemplo: =+i*+i AN, AN,

Profesora: Sra. Consuelo Ramrez.

84

Universidad de Santiago de Chile Facultad de Ingeniera Departamento de Ingeniera Informtica Ingeniera Civil en Informtica Autmatas y Lenguajes Formales

7.10. Analizadores sintcticos LR


La L es por el examen de la entrada de izquierda a derecha, la R es por construir una derivacin por la derecha en orden inverso, y el 1 es por utilizar un smbolo de entrada de examen por anticipado para tomar las decisiones del anlisis sintctico. 7.10.1. Elemento LR(0) Un elemento LR(0) de una gramtica G es una produccin de G con un punto en alguna posicin del lado derecho [6]. Ejemplo: G = (N, , P, S) A XYZ P Observacin: A A 7.10.2. AFN- de elementos LR(0) G = (N, , P, S) G = (N, , P, S) N = N {S} P = P {S S} M = (Q, N , , q0, Q) Q : Conjunto de elementos LR(0) q0 : S S : (A X, X) = {A X / X (N )} (A B, ) = {B / B P} Ejemplo: G = ({S, B}, {a, b}, P, S) P = { S BB B aB | b }

Profesora: Sra. Consuelo Ramrez.

85

Universidad de Santiago de Chile Facultad de Ingeniera Departamento de Ingeniera Informtica Ingeniera Civil en Informtica Autmatas y Lenguajes Formales

7.10.3. Analizador sintctico SLR Clausura G = (N, , P, S) I: conjunto de elementos LR(0). Algoritmo: Clausura(I) { J=I Repetir A B J B P / B J J = J {B } Hasta que no se puedan agregar ms elementos a J. Retornar(J) } Ir_a I: conjunto de elementos LR(0). Ir_a(I, X) = Clausura({A X / A X I}) X (N )

Profesora: Sra. Consuelo Ramrez.

86

Universidad de Santiago de Chile Facultad de Ingeniera Departamento de Ingeniera Informtica Ingeniera Civil en Informtica Autmatas y Lenguajes Formales

7.10.3.1. Tabla del analizador sintctico SLR


a) b) c) d)

A Ii Ir_a(Ii, ) = Ij Accin[i, ] = Dj A Ii Accin[i, ] = RA S(A) S S Ii Accin[i, $] = A Ir_a(Ii, A) = Ij Ir_a[i, A] = j

Ejemplo: G = ({E, T, F}, {+, *, (, ), i}, P, E) P = { E E + T | T T T * F | F F ( E ) | i } =i*i+i Toda gramtica SLR es no ambigua, pero hay muchas gramticas no ambiguas que no son SLR [6]. Ejemplo: G = ({S, L, R}, {=, *, i}, P, S) P = { S L = R | R L * R | i R L }

Profesora: Sra. Consuelo Ramrez.

87

Universidad de Santiago de Chile Facultad de Ingeniera Departamento de Ingeniera Informtica Ingeniera Civil en Informtica Autmatas y Lenguajes Formales

Uso de gramticas ambiguas Toda gramtica ambigua no es SLR [6]. Ejemplo: G = ({E}, {+, *, (, ), i}, {E E + E | E * E | ( E ) | i}, E) =i*i+i Ejercicio 1: G = ({S}, {i, e, a}, {S iSeS | iS | a}, S) = iiaea Ejercicio 2: G = ({E}, {b, p, {, }, c}, {E E b E p E | E b E | E p E | { E } | c}, E)

Profesora: Sra. Consuelo Ramrez.

88

Universidad de Santiago de Chile Facultad de Ingeniera Departamento de Ingeniera Informtica Ingeniera Civil en Informtica Autmatas y Lenguajes Formales

7.10.4. Analizador sintctico LR Toda gramtica SLR(1) es una gramtica LR(1), pero para una gramtica SLR(1) el analizador sintctico LR cannico puede tener ms estados que el analizador SLR para la misma gramtica [6]. Clausura G = (N, , P, S) I: conjunto de elementos LR(1). Algoritmo: Clausura(I) { Repetir [A B, a] I B P b P(a) / [B , b] I I = I {[B , b]} Hasta que no se puedan agregar ms elementos a I. Retornar(I) } Ir_a I: conjunto de elementos LR(1). Ir_a(I, X) = Clausura({[A X , ] / [A X, ] I}) 7.10.4.1. Tabla del analizador sintctico LR
a) b) c) d)

X (N )

[A a, b] Ii Ir_a(Ii, a) = Ij Accin[i, a] = Dj [A , ] Ii Accin[i, ] = RA [S S , $] Ii Accin[i, $] = A Ir_a(Ii, A) = Ij Ir_a[i, A] = j

Ejemplo: G = ({S, C}, {c, d}, P, S) P = { S CC C cC | d }

Profesora: Sra. Consuelo Ramrez.

89

Universidad de Santiago de Chile Facultad de Ingeniera Departamento de Ingeniera Informtica Ingeniera Civil en Informtica Autmatas y Lenguajes Formales

7.10.5. Analizador sintctico LALR Analizador sintctico LR 7.10.5.1. Tabla del analizador sintctico LALR Las tablas SLR y LALR para una gramtica siempre tienen el mismo nmero de estados [6].
a) b) c) d)

[A a, b] Ii Ir_a(Ii, a) = Ij Accin[i, a] = Dj [A , ] Ii Accin[i, ] = RA [S S , $] Ii Accin[i, $] = A Ir_a(Ii, A) = Ij Ir_a[i, A] = j

Ejemplo: G = ({S, C}, {c, d}, P, S) P = { S CC C cC | d } Ejercicio: G = ({S, A, B}, {a, b, c, d, e}, P, S) P = { S aAd | bBd | aBe | bAe A c B c }

Profesora: Sra. Consuelo Ramrez.

90

Universidad de Santiago de Chile Facultad de Ingeniera Departamento de Ingeniera Informtica Ingeniera Civil en Informtica Autmatas y Lenguajes Formales

7.10.6. Recuperacin de errores en los analizadores sintcticos LR Ejemplo: G = ({E}, {+, *, (, ), i}, {E E + E | E * E | ( E ) | i}, E) Rutinas de error: E1: introducir i 3 en el stack falta operando E2: eliminar parntesis derecho de la entrada parntesis derecho no equilibrado E3: introducir + 4 en el stack falta operador E4: introducir ) 9 en el stack falta parntesis derecho =i+)

Profesora: Sra. Consuelo Ramrez.

91