Esta es una pregunta del Libro del Dragón. Esta es la gramática:
B → ε
La pregunta pregunta cómo mostrar que es LL (1) pero no SLR (1).
Para demostrar que es LL (1), intenté construir su tabla de análisis, pero obtengo múltiples producciones en una celda, lo cual es una contradicción.
Indique cómo es este LL (1) y cómo demostrarlo.
formal-grammars
compilers
parsers
Vinayak Garg
fuente
fuente
Respuestas:
Primero, demos un número a tus producciones.
Calculemos el primero y sigamos primero los conjuntos. Para pequeños ejemplos como estos, usar la intuición sobre estos conjuntos es suficiente.
Ahora calculemos la tabla . Por definición, si no tenemos conflictos, la gramática es L L ( 1 ) .L L ( 1 ) L L ( 1 )
Como no hay conflictos, la gramática es .L L ( 1 )
Ahora para la tabla . Primero, el autómata L R ( 0 ) .SL R ( 1 ) L R ( 0 )
Y luego la tabla (supongo que S puede ser seguido por cualquier cosa).SL R ( 1 ) S
Hay conflictos en el estado 0, por lo que la gramática no es . Tenga en cuenta que si se utilizara L A L R ( 1 ) , ambos conflictos se resolverían correctamente: en el estado 0 en la búsqueda anticipada a L A L R ( 1 ) tomaría R3 y en la búsqueda anticipada b tomaría R4.SL R ( 1 ) L A L R ( 1 ) una L A L R ( 1 ) si
Esto da lugar a la interesante pregunta de si hay una gramática que es pero no L A L R ( 1 ) , que es el caso pero no es fácil encontrar un ejemplo.L L ( 1 ) L A L R ( 1 )
fuente
Si no se le pregunta, no tiene que construir la tabla LL (1) para demostrar que es una gramática LL (1). Simplemente calcula los conjuntos PRIMERO / SEGUIR como lo hizo Alex:
Y luego, por definición, una gramática LL (1) tiene que:
Entonces, para la gramática dada:
En cuanto al análisis SLR (1), creo que es perfecto.
fuente
Busque una condición suficiente que haga una gramática LL (1) (sugerencia: observe los PRIMEROS conjuntos).
Busque una condición necesaria que todas las gramáticas SLR (1) deben cumplir (pista: mire los conjuntos SIGUIENTE).
fuente