Lab 4 (JCUP)
Last updated
Was this helpful?
Last updated
Was this helpful?
Descarguen todos los archivos del siguiente repositorio:
Ahora que han terminado la fase 1 de su proyecto, saben utilizar JLex para el análisis léxico de una cadena de caracteres. Como han visto en clase, el análisis sintáctico se basa en gramáticas, y tiene algoritmos muy bien definidos para poder ser implementado. Para prepararlos para la fase 2, utilizaremos una herramienta llamada JCup, que funciona para analizar la sintáxis de un texto dado.
Al igual que JLex, JCup cuenta con una sección en donde se colocan las funciones que posteriormente se copiarán en la clase generada, en este laboratorio no utilizaremos esta funcionalidad, pero les será útil para su proyecto. Luego existe una lista de símbolos terminales, como los paréntesis, los dígitos, etc., seguido de una lista de símbolos no terminales. Tanto los símbolos terminales como los no terminales pueden tener un tipo definido:
Luego pueden especificar una precedencia. Por ejemplo, una multiplicación se debe hacer antes que una suma. Para este tipo de precedencia deben emplear "precedence left", como en el siguiente ejemplo:
Seguido de eso, van todas las reglas de producción. Siguiendo la siguiente sintáxis, en donde RESULT
es la derivación usando bottom-up parsing.
La gramática con la que trabajaremos es la siguiente:
Para la primer parte deben completar el archivo calculator.lex generando los tokens necesarios para una calculadora con operaciones básicas y que maneje tanto floats como enteros. Noten que las funciones trigonométricas no son case sensitive, por lo que "sin" y "sIN" son aceptadas de igual manera. Esta es la lista de tokens que debe tener:
Si analizan la gramática, pueden ver que una expresión puede ser una expresión entera, o una expresión de punto flotante. Más adelante verán que esta gramática se puede simplificar dejando la distinción entre enteros y floats al analizador semántico.
Para la segunda parte, ustedes deben completar el archivo calculator.cup, agregando las reglas de derivación bottom-up. Pueden agregar tantos símbolos no terminales como quieran, pero no pueden modificar ninguno de los símbolos terminales. Una vez agregadas todas las reglas de derivación, pueden compilar su archivo de la siguiente manera:
y para correrlo:
Así se deberá de ver al probarlo:
Noten que el argumento de las funciones trigonométricas está en radianes.
Una vez terminado, tienen que realizar un commit de los archivos .cup y .lex y subir al GES el link de su repositorio.
JCup Manual - Manual de JCup.
JCup Java Manual - Javadoc de JCup.