200 likes | 409 Views
Método LALR. Análisis sintáctico (Look ahead LR). Análisis Sintáctico LR. Este tipo de análisis se puede realizar mediante 3 técnicas: LR(k): Leen la entrada de izquierda a derecha (Left to rigth). SLR(1): Mejora el LR(1) pero hace uso de la búsqueda hacia delante.
E N D
Método LALR Análisis sintáctico (Look ahead LR)
Análisis Sintáctico LR • Este tipo de análisis se puede realizar mediante 3 técnicas: • LR(k): Leen la entrada de izquierda a derecha (Left to rigth). • SLR(1): Mejora el LR(1) pero hace uso de la búsqueda hacia delante. • LALR(1): Más potente que SLR(1) y más sencillo que LR(1).
Análisis Sintáctico LALRConceptos • Significa «lookahead LR« • Estatécnica generalmente se usa en la practica. • Este es un análisis sintáctico de búsqueda hacia adelante. • Esta técnica es mas larga de realizar, pero también es la mas efectiva. • Es una técnica intermedia entre SLR(1) y LR(k). • Aquí básicamente lo que se hace la unión de los conjuntos de elementos que tengan elementos comunes en sus goto(Ui, α), y que únicamente varíe la parte del lookaheadde cada conjunto.
Análisis Sintáctico LALRAlgoritmo ENCONTRANDO FIRS Y FOLLOW
Análisis Sintáctico LALRAlgoritmo Por ejemplo si tenemos dos conjuntos Ui y Uj Podemos hacer la unión de sus lookahead , creando así un conjunto Uij, así: Ui = X->Y ·Z {a} Uj = X->Y ·Z {b} Ui = X->Y ·Z {a} Uij = X->Y ·Z {a,b} Uj = X->Y ·Z {b}
Análisis Sintáctico LALRAlgoritmo Entrada: Gramática aumentada G’ Método: • Construir la colección de conjuntos de elementos LR(1). • Para cada conjunto en LR(1), encontrar todos los conjuntos con los mismos elementos y sustituir todos por su unión de lookahead. • Construir las acciones de análisis sintáctico para cada nuevo estado (acción e ir_a iguales que el algoritmo de LR Canónico).
Análisis Sintáctico LALREjemplo Construiremos las transiciones de la siguiente gramática: (1)S → A (2)S → xb (3)A → aAb (4)A → B (5)B → x • Necesitaremos aumentarla, asi: (0)S’ → S$ (1)S → A (2)S → xb (3)A → aAb (4)A → B (5)B → x
Análisis Sintáctico LALREjemplo • Haciendo las transiciones (siguiendo la plantilla del método LR) , hacemos los goto de nuestros conjuntos: • Para empezar nuestro So: Lookahead • S’ -> •S {$} • S -> •A {$} • S -> • xb {$} • A -> • aAb {$} • A -> •B {$} • B -> •x {$}
Creando Goto Ahora hacemos los goto(Si, α), donde Si es el conjunto que vamos a crear y α es el terminal o no terminal a donde vamos a movernos; copiando sus lookahead de la producción padre. S4: Goto (So, x) S1: Goto (So, S): • • {$} • • • • S2: Goto (So, A) • • {$} S5: Goto(So, a) S3: Goto (So, B) • • • • {$}
Análisis Sintáctico LALREjemplo S1:Goto(S0,S) S4:Goto (S0, x) S’ -> S• {$} S -> x•b {$} A -> x• {$} S2:Goto(S0, A) S5:Goto(S0, a) S -> A• {$}A -> a•Ab {$} A -> •aAb {$} S3:Goto (S0, B) A -> •B {$} A -> B• {$} A -> •x{$} Tendremos en cuenta que cuando movemos el • con un No terminal y este es el ultimo elemento este pasa a ser un kernel.
Análisis Sintáctico LALREjemplo S13:Goto (S4,b) S -> xb • {$} S6:Goto (S5,A): S8:Goto (S5,B)(Goto S7,B) A -> a •Ab {$} A -> B• {$} A -> •aAb {b} A-> •B {b} S9:Goto (S5,x) Goto(S7,x): B -> •x {b} B -> x• {$} S7:Goto (S5,a) Goto(S7,a): A -> a•Ab {b} A -> •aAb {b} A -> •B {b} B -> •x {b}
Análisis Sintáctico LALREjemplo S10:Goto (S6,b) S -> xb • {$} S11:Goto (S7,A) S -> aA•b{b} S12:Goto (S11,b) S -> aAb• {$}
S10 A -> aAb• {$} S3 S1 A -> B• {$} S’ -> S• {$} b S6 A -> aA •b {$} S2 S -> A• {$} S A -> a•Ab {b} A -> •aAb {b} A-> •B {b} B -> •x {b} B S7 A S0 S5 A -> a•Ab {$} A -> •aAb {b} A-> •B {b} B -> •x {b} S’ -> •S {$} S -> •A {$} S -> •xb {$} A -> •aAb {$} A -> •B {$} B -> •x {$} A A a x a S9 x B S11 B -> x• {b} a A -> aA• b {b} B S8 b x A -> B• {b} S12 S4 S13 A -> aAb• {b} S -> x•b {$} B -> x• {$} b S -> xb • {$}
Nota: al unir estos conjuntos tenemos que unir también sus transiciones. Ahora trataremos de unir todos los conjuntos que tengan elementos en común y también uniendo sus lookahead. Con estos Conjuntos: • S3 con S8 • S5 con S7 • S6 con S11 • S10 con S12 Teniendo S3={A→B• {$}} S8={A→B• {b} Pasaremos a: S3_8={A→B• {$,b} Y así con todos los demás..
S10_12 A -> aAb• {$,b} S3_8 S1 A -> B• {b,$} S’ -> S• {$} b B S2 S6_11 S S -> A• {$} A -> aA •b {$, b} B A S0 S’ -> •S {$} S -> •A {$} S -> •xb {$} A -> •aAb {$} A -> •B {$} B -> •x {$} A S5_7 A -> a•Ab {$,b} A -> •aAb {b} A-> •B {b} B -> •x {b} a a S9 x B -> x• {b} x S4 S13 S -> x•b {$} B -> x• {$} b S -> xb • {$}
Construcción de la Tabla de AS 1. Construir la colección de conjuntos de elementos. 2. Ui es el estado i. Las acciones se determinan: • Si A -> α · aβ está en Ui e ir_a(Ui, a) = Uj entonces “desplazar j” en acción[i, a]. • Si A -> α · está en Ui entonces “reducir A -> α” en acción [i, a] para toda a en Look a head(A). • Si S´ -> S · está en Ui entonces “aceptar” en acción[i,$]. 3. Si ir_a(Ui, A) = Uj, entonces ir_a(i, A) = j 4. Todas las entradas no definidas por 2 y 3 son error. 5. El estado inicial del analizador es el que contiene [S´ -> · S]
Construcción de Tabla de AS Evaluar Cadena No terminales Terminales Estados Si Los Goto son desplazar y los kernel son reducir
Evaluar una cadena de entrada. • Cadena de entrada: aaxbb Para iniciar en nuestra pila tenemos 0 y a la par tenemos nuestra cadena de entrada. Vamos evaluando (0,a)=S5_7, movemos a la pila a, seguido de 5_7 Cuando encontramos un ri en la tabla, nos vamos al numero de producción que lo produjo y reemplazamos la producción por el no terminal. (0,a) = S5_7 (5_7,a)= axbb$ S5_7 0a5_7
aaxbb$ (0,a)= S5_7 axbb$ 0a5_7a5_7 (5_7,a)= S5_7 0a5_7 Ver Tabla (5_7,x)= S9 xbb%$ bb$ 0a5_7a5_7x9 (9,b) = r5 -> B -> x bb$ 0a5_7a5_7B (5_7,B) = 3_8 0a5_7a5_7B3_8 bb$ (3_8,b) = r4 -> A -> B (5_7,A)= 6_11 bb$ 0a5_7a5_7A bb$ 0a5_7a5_7A6_11 (6_11,b) =S10_12 b$ 0a5_7a5_7A6_11b10_12 (10_12,b)=r3 -> A -> aAb 0a5_7A (5_7, A)= 6_11 b$ (6_11,b)=S10_12 0a5_7A6_11 b$ 0a5_7A6_11b10_12 $ (10_12,$)=r3-> A->aAb (0,A)=2 0A $ 0A2 $ (2,$)=r1 -> S->A $ 0S (0,S)=1 0S1 $ (1,$)= ACEPTADA *Si la casilla esta vacia es error
Cadena Aceptada FIN