Archivos generados por JavaCUP
Cada parser generado por CUP está compuesto por tres clases:
- sym
- parser
- action
La clase sym, contiene una serie de constantes enteras, una por cada símbolo terminal. También se incluyen los no terminales, si está seteada la opción nonterms.
El archivo fuente para la clase parser contiene dos definiciones de clae, la clase pública parser que implementa el parser actual, y otra clase no pública, llamada CUP$action, que encapsula todas las acciones de usuario contenidas en la gramática, así como el código de la declaración action code.
La clase parser contiene el parser actual generado. Es una subclase de java_cup.runtime.lr_parser que implementa un framework para parsers LR dirigidos por tablas. La clase consta de tres tablas :
- La tabla de producciones
- para cada producción de la gramática, provee el número del símbolo del lado izquierdo del no terminal, con la longitud del lado derecho.
- La tabla de acciones
- indica qué acción (shift, reduce, o error) debe ejecutarse de acuerdo al lookahead cuando se halla en cada estado.
- La tabla de reduce/go-to
- indica a qué estado debe desplazarse luego de reducir (bajo cada no terminal de cada estado).
Las tablas de acciones y reduce/goto no se almacenan en arreglos simples, sino que utilizan una estructura de lista, paa comprimir la cantidad de espacio utilizado.
Más allá de las tablas de parsing, el código generado (o heredado) provee una serie de métodos que pueden ser usados para personalizar el parser generado. Algunos de estos métodos se reemplazan con código expresado en la especificación y puede ser personalizado directamente. Los otros métodos son provistos por la clase base lr_parser y pueden ser sobreescritos con nuevas versiones, a través de las declaraciones de la sección parser code.
Otra de las clases que componen el parser, es la clase Yylex generada por JLex.