dígito | $ | |
---|---|---|
€ | desplazar | |
digito | reducir a D | reducir a D |
€N | desplazar | aceptar |
ND | reducir por N: ND | reducir por N: ND |
€D | reducir por N: D | reducir a N:D |
Un analizador sintáctico acepta una entrada si y solamente si la entrada se puede generar por la gramática.
El analizador LR aceptará si y solamente si en la pila tenemos el euro, la variable inicial y el fin de datos.
En esta gramática, ¿cuando hay que reducir por la λ-producción?
Para cada regla de la gramática: Hemos de decidir cuándo conviene usarla para reducir, es decir,
saber si hemos de reducir por esa regla o no.
Consideramos un paso intermedio de la derivación derecha: ¿qué es necesario conocer para saber cuál fue el paso anterior?
La dificultad es cuando tenemos ambigüedad y que haya varios candidatos al paso anterior.
Dada una gramática libre de contexto, se dice que
\(\alpha\beta_1\in\{V\cup \Sigma \}^*\)
es un prefijo viable si
La idea del análisis ascendente expresada de otra forma es:
(Omitimos las reducciones de dígito, operador y de numero para mayor claridad)
Tomamos la siguiente gramática
La derivación a la izquierda de la palabra () (()) ; es \[T \mapsto S ; \mapsto S A ; \mapsto S (A) ; \mapsto S (()) ; \mapsto A (()) ; \mapsto () (()) ; \]
¿Cuales son aquí los prefijos viables?
Todo lenguaje libre de contexto determinista, en el que ninguna palabra sea prefijo de otra, admite una gramática en la cual el conjunto de prefijos viables para cada regla es un lenguaje regular.
Como siempre tendremos una marca de fin, en la práctica nunca una palabra aceptada es prefijo de otra.
Consecuencia: Para cada regla, existe un autómata finito que puede recorrer la pila y decirnos si hay que reducir usándola. Podemos combinarlos todos en uno solo, que recorre la pila y nos indica si hay que reducir o no, y cuál es la regla para utilizar.
Dada una gramática libre de contexto, un ítem LR(0) es un par formado por una regla de la gramática y un número natural entre 0 y la longitud de la parte derecha.
Lo escribimos con frecuencia entre corchetes. Cuando el número sea i, en vez de escribirlo explícitamente, pondremos un punto a continuación del i-ésimo símbolo de la parte derecha.
Por ejemplo, esto es un item LR(0) representando la regla \[A\mapsto AA,\ i = 1,\]
Estado inicial: