Todas las gramáticas LL son gramáticas LR, pero no al revés, pero aún me cuesta lidiar con la distinción. Tengo curiosidad acerca de pequeños ejemplos, si los hay, de gramáticas LR que no tienen una representación LL equivalente.Ejemplo de una gramática LR que no puede ser representada por LL?
Respuesta
Bueno, en lo que respecta a las gramáticas, es fácil: cualquier gramática simple recursiva a la izquierda es LR (probablemente LR (1)) y no LL. Por lo tanto la gramática como una lista:
list ::= list ',' element | element
es LR (1) (suponiendo que la producción para el elemento es) pero no LL. Tales gramáticas se pueden convertir con bastante facilidad en gramáticas LL mediante factorización de la izquierda y tal, por lo que esto no es demasiado interesante.
De más interés son los IDIOMAS que son LR pero no LL - es un lenguaje para el cual existe una gramática LR (1) pero ninguna gramática LL (k) para cualquier k. Un ejemplo es cosas que necesitan coincidencias finales opcionales. Por ejemplo, el idioma de cualquier número de símbolos a
seguido del mismo número o menos de símbolos b
, pero no más b
s - {a^i b^j | i> = j}. Hay una gramática LR (1) trivial:
S ::= a S | P
P ::= a P b | \epsilon
pero no LL (k) gramática. La razón es que una gramática LL necesita decidir si hace coincidir un par a + b o una impar al mirar una a, mientras que la gramática LR puede diferir esa decisión hasta después de que ve el b o el final de la entrada.
This post en cs.stackechange.com tiene un montón de evaluaciones de esta
- 1. ¿Es cada LL (1) gramática también una LR (1)?
- 2. LL (1) no puede ser ambiguo
- 3. ¿Cómo identificar si una gramática es LL (1), LR (0) o SLR (1)?
- 4. ¿Por qué esta gramática LR (1) no es LALR (1)?
- 5. Lenguaje LL (2) que no es LL (1)
- 6. ¿Esta gramática no es LR (1)?
- 7. ¿Cómo es esta gramática LR (1) pero no SLR (1)?
- 8. la conversión de una gramática en LL (1) gramática: algunos problemas
- 9. ¿Cuál es la diferencia entre el análisis de LL y LR?
- 10. ¿Busca un idioma que no sea LL (1)?
- 11. ¿Una referencia no puede ser NULL o puede ser NULL?
- 12. ¿Por qué DialogFragment no puede ser una clase interna?
- 13. ¿Por qué una enum de Java no puede ser definitiva?
- 14. Boost :: Ejemplo de gramática simple de Spirit
- 15. ¿por qué __getitem__ no puede ser classmethod?
- 16. Analizador LALR vs LL
- 17. ¿Por qué una estructura C# no puede ser heredada?
- 18. Ejemplo de un ciclo Mientras que no puede ser un bucle For
- 19. ¿Qué tipo de gramática se usa para analizar PostgreSQL?
- 20. En Java, ¿por qué una matriz no puede ser una variable de tipo vinculada, pero puede ser un comodín vinculado?
- 21. Servicio de Android: parece que no puede encontrar un ejemplo.
- 22. Por qué AccessViolationException no puede ser capturado por .NET4.0
- 23. ¿Por qué una estructura no administrada no puede ser miembro de una clase administrada?
- 24. ¿Cuál puede ser el mal ejemplo de herencia en Java?
- 25. Gramática: ¿diferencia entre arriba hacia abajo y hacia abajo? (Ejemplo)
- 26. .NET base type no puede ser serializado por WCF
- 27. principal no puede ser nula
- 28. ¿Por qué NSWindow sin styleMask: NSTitledWindowMask no puede ser keyWindow?
- 29. ¿Por qué el lado izquierdo de una tarea no puede ser una expresión de incremento?
- 30. ¿Por qué puedo probar un genérico para nulo cuando puede no ser anulable o puede no ser un objeto?
Eso parece bastante improbable. Esa gramática parece coincidir con 'if/else' simplemente bien, es decir,' statement :: = if (...) instrucción | if (...) declaración else (...) statement'. Esto, hasta donde yo sé, es manejado por analizadores de LL muy bien. – Puppy
@DeadMG: Como nota, la gramática del resto es el mismo patrón, por lo que no es LL y no puede ser manejado limpiamente por ningún analizador de LL. Por supuesto, con un analizador escrito a mano, puede utilizar una solución alternativa ad hoc (por lo general, un analizador LR mini para este caso), pero eso no cambia el hecho de que la gramática no es LL –
Interesante. ¿Eso significa que prácticamente * todos * los idiomas que siguen este constructo tienen gramáticas no LL, y prácticamente todos los generadores de analizadores LL deben tener soluciones temporales? – Puppy