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

Tema 3: Análisis sintáctico - Ejercicios de modelado LL(1) y RLL(1)

Ejercicio M5

Supongamos que tenemos esta gramática con partes derechas regulares, que hemos comprobado que es RLL(1), para modelar expresiones formadas con enteros, un operador suma (+) binario asociativo por la izquierda, y un operador producto (*) binario asociativo por la izquierda más prioritario:

<Expresión> -> <Término> (suma <Término>)*
<Término> -> <Factor> (producto <Factor>)*
<Factor> -> entero

En los siguientes apartados debes ampliar el lenguaje, consiguiendo que la gramática resultante siga siendo RLL(1) y teniendo en cuenta las prioridades y asociatividades de los operadores si hace falta. Puedes modificar también las categorías léxicas si lo crees conveniente. En cada apartado, debes partir del resultado del apartado anterior.

No es necesario que construyas la tabla de análisis en cada apartado, pero hazlo en aquellos en que dudes si tu solución es RLL(1).

Al acabar el último apartado, construye la tabla de análisis de la gramática resultante, como verificación final y como ejercicio adicional.

Apartado M5.1

Añade la posibilidad de escribir subexpresiones entre paréntesis.

Apartado M5.2

Añade la posibilidad de operar con cadenas además de enteros.

Apartado M5.3

Añade un operador de cambio de signo (-) unario, prefijo y más prioritario que el producto.

Apartado M5.4

Añade un operador resta (-) binario, infijo, asociativo por la izquierda e igual de prioritario que la suma.

Apartado M5.5

Añade un operador división (/) binario, infijo, asociativo por la izquierda e igual de prioritario que el producto.

Apartado M5.6

Añade un operador identidad (+) unario, prefijo e igual de prioritario que el cambio de signo.

Apartado M5.7

Añade un operador barra (| |) que se aplica a cualquier expresión de tipo entero o cadena encerrada entre las dos barras verticales para calcular su valor absoluto si es de tipo entero o su longitud si es de tipo cadena.

Apartado M5.8

Añade un operador potencia (**) binario, infijo, asociativo por la derecha, más prioritario que el producto y menos prioritario que el cambio de signo.

Apartado M5.9

Añade un operador factorial (!) unario, postfijo y más prioritario que el cambio de signo.

Apartado M5.10

Añade un operador de conversion (<< >>) que se aplica a cualquier expresión encerrada en medio para convertirla de entero a cadena o de cadena a entero.

Apartado M5.11

Añade seis operadores relacionales (==, !=, >, <, >=, <=) binarios, infijos, asociativos por la izquierda, igual de prioritarios entre sí y menos prioritarios que la suma.