2012-01-10 12 views

Respuesta

16

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

+0

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

+0

@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 –

+0

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

Cuestiones relacionadas