Procesadores de Lenguaje - UJI - Curso 2009/2010 - Grupo TE2

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