Tema 3: Análisis sintáctico - Ejercicios de modelado sintáctico con GPDR
Solución del ejercicio 7.A
<Programa> -> (apar <Definición> cpar)* (apar <Sentencia> cpar)+
<Definición> -> Define coma ident
coma apar <Sentencia> cpar
<Sentencia> -> Lee coma ident
<Sentencia> -> Asigna coma ident coma <Expresión>
<Sentencia> -> Muestra (coma <Expresión>)+
<Sentencia> -> ident
<Expresión> -> lit
<Expresión> -> ident
<Expresión> -> apar idop coma <Expresión> coma <Expresión> cpar
Solución del ejercicio 7.B
El único problema en la solución anterior está en la primera regla: al
ver el componente apar, el analizador no puede saber
si es el delimitador inicial de una definición o de una sentencia,
es decir, si debe entrar en la primera clausura o pasar a la segunda.
Dicho de otro modo, si reemplazamos la clausura (apar
<Definición> cpar)* por un nuevo no terminal,
tendremos un no terminal anulable con el terminal apar
entre sus primeros y sus siguientes, dando lugar a un conflicto en la
tabla de análisis. Para resolverlo, podemos hábilmente sustituir la
primera regla por la siguiente:
<Programa> -> apar (<Definición> cpar apar)* <Sentencia> cpar
(apar <Sentencia> cpar)*
Eliminando ahora partes derechas regulares con las transformaciones
que hemos estudiado en el curso, el resultado es una gramática
incontectual LL(1).
<Programa> -> apar <C1> <Sentencia> cpar <C2>
<C1> -> <Definición> cpar apar <C1>
<C1> ->
<C2> -> apar <Sentencia> cpar <C2>
<C2> ->
<Definición> -> Define coma ident
coma apar <Sentencia> cpar
<Sentencia> -> Lee coma ident
<Sentencia> -> Asigna coma ident coma <Expresión>
<Sentencia> -> Muestra coma <Expresión> <C3>
<C3> -> coma <Expresión> <C3>
<C3> ->
<Sentencia> -> ident
<Expresión> -> lit
<Expresión> -> ident
<Expresión> -> apar idop coma <Expresión> coma <Expresión> cpar