Analizadores Sintácticos
#
Analizador Sintáctico SLR CanónicoEn un tabla LR(0) cada celda solo puede contener a lo sumo una producción o celdas vacías. Esto asegura que dicha tabla puede realizar análisis sintáctico de gramáticas LR(0).
Las tablas de análisis sintáctico LR(0) pueden tener conflictos:
Reduce / Reduce
Shift / Reduce
#
Conflicto Reduce/ReduceSe producen cuando hay dos elementos A→ α. en el mismo estado.
Dada la gramática G=({A', A, C}, {c | $}, P A') con el siguiente conjunto de producciones:
A' → A$
A → c | C
C → c
Se construye un autómata de las siguientes características
estado | A' | A | C | c |
---|---|---|---|---|
…. | ||||
3 | A→c / C→c | |||
#
Conflicto Shift/ReduceEste tipo de conflicto se da cuando un elemento de la forma A→ α. y un elemento que no tiene esa forma se encuentran en una misma celda de un estado.
G=({E',E,A}, {a,b$}, P ,E' ) cuyo conjunto de producciones es
E' → E$
E → A | Ab
A → a | ab
En este caso hay ambigüedad en la gramática, al generar el autómata se obtiene:
El análisis sintáctico LR(0) puede presentar conflictos. Para ello se mejora el algoritmo utilizando el llamado SLR
#
#Análisis Sintáctico Ascendente SLR- es una variante del LR(0), incrementa de manera importante la potencia del análisis al utilizar el token SIGUIENTE en la cadena de entrada para dirigir sus acciones.
- Las Acciones REDUCE no ocupan todas la fila de la tabla.
- Solamente se reduce por una producción A→β para los símbolos terminales que puedan aparecer a continuación de A.
- Se pone ACTION[q,a]=REDUCE(A→β) solamente cuando a pertenece a SIGUIENTE(A).
- La idea es cuando se completa la tabla se pone ACTION[q,a]=Reduce(A→β) solo si a ∈ SIGUIENTE(A)
- Esto evita conflictos:
- Reduce / Reduce
- Shift /Reduce
#
EjemploSea G=({S',A, S},{a,b,$},P,S' ). Con el conjunto P:
S' → S$
S → a | Ab
A → a
Se genera el autómata LR(0):
Tabla LR
( recordar que cada vez que se tiene un elemento con un punto al final se ponene las acciones reduce en todos los no terminales.
estado | S' | S | A | a | b | $ | |
---|---|---|---|---|---|---|---|
1 | 2 | 5 | S3 | ||||
2 | Accept | ||||||
3 | S→a / A→a | S->a / A→a | S→a / A→a | S→a / A→a | |||
4 | S→Ab | S→Ab | S→Ab | ||||
5 | s4 |
No hay tabla LR(0) ya que hay un conflicto Reduce / Reduce en el estado 3
La idea es que las producciones no vayan en todas las filas, sino que las el elemento A → a. van en las columnas que contengan a SIGUIENTE(A)
No terminales PRIMERO SIGUIENTE S {a} {$} A {a} {b} S' {a} {$} Se construye la tabla SLR teniendo en cuenta lo anterior
estado | S' | S | A | a | b | $ |
---|---|---|---|---|---|---|
1 | 2 | 5 | S3 | |||
2 | ||||||
3 | A→a | S→a | ||||
4 | S→ab | |||||
5 | s4 |
- Las gramáticas SLR no son ambiguas, pero hat gramáticas no ambiguas que no son SLR
G=({S,L,R}, {id,=,*}), P, S)
S → L=R | R
L → * R | id
R → L
#
Analizador sintáctico LR(1) CanónicoUsa un token lookahead
El concepto detrás es el de refinar aun más el autómata: si el siguiente símbolo de la entrada es a, solo se debe reducir por A → β cuando a podría venir a continuación de A
Está construido de tal forma que mantiene el registro de cual es el símbolo de debería venir a continuación tal que si A → β. /a donde /a es el lookahead
#
Elemento LR(1)Un elemento LR(1) es un par [A →α.β donde A → αβ es una producción y a ∈ |SigmaU {$} es un símbolo terminal.
- Los estados de la tabla de Análisis Sintáctico LR(1) son Ahora conjuntos de elementos LR(1)
- La tabla se construye igual que la LR(0), la parte más importante es la definición de elemento LR(1) y su Clausura.
Clausura De un Elemento LR(1)
Entrada: una gramática un conjunto de elementos LR(1)
Salida: CLAUSURA(E)
J=E while hay cambios for each elemento [A-> alpha . beta,a] pertenece a J for each producción B-> gamma for each simbolo terminal b que pertenece a PRIMERO(betaa) J=J U {[B-.gamma,b]} end end end end
- Ejemplo :
Sea G=({S',S,A}, {a,b,$},P, S'). Donde P es
S' → S
S → AA
A → aA | b
Construir el autómata:
Primeros
no terminal | Primero |
---|---|
A | {a,b] |
S | {a,b} |
Se hace la clausura
#
Analizador Sintáctico LR con lectura Anticipada LALREl tamaño de la tabla LR(1) es muy grande, a pesar de que el método es muy poderoso.
Se define núcleo de un conjunto de elementos como al subconjunto de elementos que no son de la forma [A→ .β/a]
Una vez construido el autómata LR(1) se identifican los estados que tienen el mismo núcleo sin tener en cuenta el lookahead y se fusionan en un solo estado para reducirla cantidad de estados del autómata.