Declaraciones preliminares
Especificaciones Package e Import
Una especificación comienza con la declaración opcional de package e import,
que se utilizan de la misma manera que en un programa Java normal.
La declaración de un package tiene la forma:
package name;
donde name es el identificador del paquete Java, posiblemente separado en varias partes por un punto ".".
Luego de la declaración opcional de package sigue la declaración de cero o más import, cuya declaración tiene la siguiente forma:
import package_name.class_name; o import package_name.*;
La declaración package indica en qué paquete generado por el sistema se almacenarán las clases sym y parser, que son las principales clases que componen el parser generado. Cualquier declaración import que aparezca en la especificación también aparecerá en el archivo fuente de la clase parser permitiendo varios nombres desde el package para ser usado directamente en el código de las acciones proporcionadas por el usuario.
Componentes de Código de Usuario
Siguiendo las declaraciones opcionales de package e import hay una serie de declaraciones opcionales que permiten al usuario incluir código en el parser a generar. Como parte del archivo del parser, se produce una clase no pública separada que contiene todas las acciones de usuario. La primera sección de declaración action code permite incluir el código en dicha clase. En esta sección, también deben incluirse las rutinas y variables que sean necesarias para el código asociado a la gramática.
La declaración tiene la forma:
action code {: ... :};
donde {: ... :} es un string de código cuyo contenido será ubicado directamente en la declaración de la clase action class.
Posteriormente puede declararse (o no) la opción parser code, que permite ubicar métodos y variables directamente en la clase parser generada. Aunque es menos común, ésto puede ayudar cuando se personaliza el parser, por ejemplo para incluir métodos de escaneo dentro del parser e/o ignorar las rutinas de reporte de errores definidas por defecto. La declaración tiene la forma:
parser code {: ... :};
donde el código del string de código se incluye directamente en el código de la clase parser generada.
Posteriormente, puede declararse un trozo de código que inicialice el estado del parser, antes de comenzar con el escaneo de los tokens. Normalmente la inicialización se refiere al scanner y a tablas y demás estructuras de datos que podrían ser necesarias para la ejecución de las acciones semánticas. La declaración tiene la forma:
init with {: ... :};
donde el código del string pasa a conformar el cuerpo de un método void miembro de la clase parser.
La última sección opcional de código de usuario indica la manera en la que el parser debe obtener el siguiente token del scanner. La declaración tiene la forma:
scan with {: ... :};
donde el código del string pasa a conformar el cuerpo de un método miembro de la clase parser, que retorna un objeto de tipo java_cup.runtime.Symbol, por lo cual el código incluído en el string debería retornar un valor de tal tipo.
Las opciones de esta sección pueden aparecer en cualquier orden, siempre y cuando precedan a la sección de declaración de símbolos.