Para verificar si una gramática es LL (1), una opción es construir la tabla de análisis LL (1) y verificar si hay algún conflicto. Estos conflictos pueden ser
- FIRST/FIRST conflictos, donde dos producciones diferentes tendrían que predecirse para un par no terminal/terminal.
- FIRST/FOLLOW conflictos, donde se predicen dos producciones diferentes, una que representa que debe tomarse cierta producción y se expande a un número distinto de cero símbolos, y una que representa que se debe usar una producción que indique que algún no terminal debe expandirse finalmente a la cadena vacía.
- SEGUIR/SEGUIR conflictos, donde dos producciones que indican que un no terminal debe expandirse finalmente al conflicto de cadena vacía entre sí.
Probemos esto en su gramática construyendo los conjuntos FIRST y FOLLOW para cada uno de los no terminales. Aquí, tenemos que
FIRST(X) = {a, b, z}
FIRST(Y) = {b, epsilon}
FIRST(Z) = {epsilon}
También tenemos que los conjuntos siguen son
FOLLOW(X) = {$}
FOLLOW(Y) = {z}
FOLLOW(Z) = {z}
partir de esto, podemos construir la siguiente LL (1) tabla de análisis sintáctico:
a b z $
X a Yz Yz
Y bZ eps
Z eps
Desde podemos construir esta tabla de análisis sin conflictos, la gramática es LL (1).
Para comprobar si una gramática es LR (0) o SLR (1), comenzamos construyendo todos los conjuntos de configuración LR (0) para la gramática. En este caso, suponiendo que X es el símbolo de inicio, obtenemos lo siguiente:
(1)
X' -> .X
X -> .Yz
X -> .a
Y -> .
Y -> .bZ
(2)
X' -> X.
(3)
X -> Y.z
(4)
X -> Yz.
(5)
X -> a.
(6)
Y -> b.Z
Z -> .
(7)
Y -> bZ.
partir de esto, podemos ver que la gramática no es LR (0) porque hay desplazamiento/reducción conflictos en los Estados (1) y (6). Específicamente, porque tenemos los artículos de reducción Z →. y Y →., no podemos decir si reducir la cadena vacía a estos símbolos o cambiar algún otro símbolo. De manera más general, ninguna gramática con & epsilon; -productions es LR (0).
Sin embargo, esta gramática podría ser SLR (1). Para ver esto, aumentamos cada reducción con el conjunto de anticipación para los no terminales particulares. Esto da vuelta este conjunto de SLR (1) conjuntos configurating:
(1)
X' -> .X
X -> .Yz [$]
X -> .a [$]
Y -> . [z]
Y -> .bZ [z]
(2)
X' -> X.
(3)
X -> Y.z [$]
(4)
X -> Yz. [$]
(5)
X -> a. [$]
(6)
Y -> b.Z [z]
Z -> . [z]
(7)
Y -> bZ. [z]
Ahora, que no tienen más de reducción por desplazamiento conflictos. El conflicto en el estado (1) se ha eliminado porque solo reducimos cuando la búsqueda anticipada es z, que no entra en conflicto con ninguno de los otros elementos.Del mismo modo, el conflicto en (6) se ha ido por la misma razón.
Espero que esto ayude!
¿No hay un FIRST/FIRST conflicto entre X y Y en su LL (1) discusión de la gramática? Ambos contienen b. –
@ JohnRoberts: se produce un conflicto FIRST/FIRST cuando dos producciones para el mismo no terminal tienen conjuntos FIRST superpuestos. Aunque X e Y contienen b en sus PRIMEROS conjuntos, no hay no terminal en la gramática con dos producciones, una de las cuales comienza con X y una de ellas comienza con Y. ¿Tiene sentido eso? – templatetypedef
Entonces, ¿está diciendo que debido a que las dos producciones se relacionan con diferentes no terminales, no hay conflicto? –