Tema 3: Análisis sintáctico - Ejercicios de modelado LL(1) y RLL(1)
Solución del ejercicio M7
Apartado M7.1
Es falso. Se puede demostrar con el siguiente contraejemplo:
<A> -> a | <B>
<B> -> a b
Para esta gramática incontextual obtenemos la siguiente tabla de análisis:
Producciones <A> -> ![]() |
Anulable(![]() |
Primeros(![]() |
Siguientes(<A>) |
---|---|---|---|
1. <A> -> a | no | a | $ |
2. <A> -> <B> | no | a | |
3. <B> -> a b | no | a | $ |
Tabla de análisis | $ | a | b |
---|---|---|---|
<A> | 1, 2 | ||
<B> | 3 |
Podemos observar que en esta tabla hay conflictos, lo cual indica que la gramática no es LL(1), a pesar de que no tiene recursión por la izquierda ni prefijos comunes.
Apartado M7.2
Es falso. Se puede demostrar con el siguiente contraejemplo:
<A> -> <A> a |
Esta gramática incontextual no es LL(1), por tener recursión por la
izquierda (ver solución del
ejercicio A5). Y tampoco es ambigua, porque todas las cadenas del
lenguaje son de la forma an con n >= 0, y
para cada una de ellas tenemos una única derivación posible, en la que
se aplica n veces la producción <A> -> <A>
a (pues cada vez que la aplicamos generamos una
a más) y una vez, al final, la producción
<A> -> .
Apartado M7.3
Es cierto. Un esbozo de la demostración podría ser el siguiente.
Supongamos que la gramática es ambigua. Por tanto, existe alguna
cadena s1 s2 ... sn del lenguaje que
tiene dos derivaciones a izquierdas diferentes. Esas dos derivaciones
difieren a partir de un paso de derivación en el que, tras haber
generado s1
s2 ... sj <A> ... (con 0 <= j <= n), se
aplican producciones diferentes, <A> -> en una y <A> ->
en otra. Pero al final ambas
derivaciones han de llegar a s1 s2
... sn $. Por las definiciones de primeros y siguientes, de
ahí se deduce que el terminal a que hay a continuación
de sj (o a = $ si j = n) es
uno de los primeros de
, o bien es uno
de los siguientes de
y
es anulable; y del mismo modo, se deduce
que es uno de los primeros de
, o es
uno de los siguientes de
y
es anulable. En cualquier caso, por la
forma de construir la tabla de análisis, eso lleva a que en la celda
M[<A>, a] tengamos un conflicto entre
y
. Y si la
gramática es LL(1), eso no puede suceder.