Traductor e intérprete del lenguaje CL 1.23
|
Esta aplicación implementa un traductor del lenguaje imperativo CL, similar a Pascal. La traducción genera como resultado un programa equivalente en t-code, un lenguaje de bajo nivel de tres direcciones, tipo ensamblador.
Este precompilador tiene la siguiente estructura secuencial: en primer lugar una serie de etapas analizan la corrección léxica, sintáctica y semántiva de la entrada, y a continuación, si el programa es correcto, una fase de generación de codigo lo traduce al lenguaje destino.
Para poder ejecutar el programa generado, se usa un intérprete que comprueba que el t-code es correcto y lo ejecuta, obteniendo el resultado a partir de unos datos.
La práctica que aquí se propone no es más que la adaptación, preparada para funcionar con la herramienta ANTLR v3, de una práctica similar diseñada para una versión anterior de ANTLR (PCCTS v1.33). Ambas han sido diseñadas en el contexto de la asignatura Compiladors de la Facultat d'Informàtica de Barcelona de la UPC.
La práctica con PCCTS ha sido desarrollada por varios profesores de la FIB: Robert Nieuwenhuis, Pilar Nivela, Guillem Godoy, Josep Carmona, Lluis Padró, entre otros. Ellos han ido definiendo todos los aspectos de la misma, desde el propio lenguaje CL hasta la implementación de los diferentes módulos que la componen.
La herramienta ANTLR http://antlr.org permite generar los diferentes programas que realizan estas etapas a partir de una serie de ficheros que describen la sintaxis del lenguaje CL, sus propiedades semánticas y cómo traducirlo a t-code.
CL.g
TypeCheck.g
CodeGen.g
y CodeGen.stg
Estos cuatro ficheros describen, en la distribución que se proporciona a los alumnos, una versión muy elemental del lenguaje CL. Los ficheros están documentados y los alumnos deben completarlos para poder traducir cualquier programa CL. La descripción del lenguaje CL se hace a través de programas de ejemplo en los llamados juegos de prueba.
Para poder construir un precompilador completo, las etapas descritas necesitan algunas clases auxiliares que se proporcionan completamente implementadas y documentadas. Los alumnos deben entender perfectamente el funcionamiento de estas clases auxiliares, definidas en los siguientes ficheros:
CL_AST.java
y CL_AST_Adaptor.java
se describen los nodos del árbol de sintaxis abstracta (AST) TypeTree.java
se describen los tipos de datos, básicos y estructurados, que CL soporta SymTab.java
se describe la tabla de símbolos usada tanto en el análisis semántico como en la generación de t-code SemanticErrors.java
se describen todos los posibles errores semánticos que detecta el análisis semánticoEl intérprete se les da a los alumnos completamente implementado, aunque no es necesario entender su funcionamiento. El intérprete se encuentra distribuido en los siguientes ficheros:
TCode.g
se encuentra la descripción léxica y sintáctica del t-code, y dará lugar al analizador de t-code. También realiza una pequeña comprobación semántica TCode.java
se define una representación interna del t-code, y se encuentra el intérprete propiamente dicho. También algunas funciones necesarias en el analizador de t-code HeapMgr.java
implementa un gestor de heap, una clase auxiliar que utiliza el intérprete cuando ejecuta t-code Estos tres ficheros no se encuentran documentados dado que el alumno sólo debe implementar el precompilador. El intérprete únicamente se necesita para comprobar que la ejecución del t-code generado produce los resultados correctos.