Especificación de la sintaxis
La sección final de las especificaciones CUP provee la declaración de la sintaxis del lenguaje. Opcionalmente, puede empezarse con la declaración:
start with <non-terminal> ;
Esto indica cuál es el no terminal inicial u objetivo del parsing. Si no
se explicita ningún no terminal inicial, se considera por defecto el no
terminal ubicado en el lado izquierdo de la primera producción de la gramática.
Cuando CUP concluye el parsing, retorna un objeto de tipo java_cup.runtime.Symbol, que contiene el resultado de la reducción final.
Luego de definir el símbolo inicial, sigue la gramática escrita en estilo BNF: un no terminal en el lado izquierdo, seguido por "::=", y el lado derecho compuesto por cero o más acciones, símbolos terminales y/o no terminales, seguidos por una asignación contextual de precedencia, que es opcional. Cada producción termina con punto y coma (";").
Cada símbolo del lado derecho puede estar rotulado. El nombre de la etiqueta aparece a continuación del símbolo, separado por dos puntos (":"), y cada nombre debe ser único en la producción, y puede usarse en el código de la acción asociada a la producción para referirse al valor del símbolo. Junto con la etiqueta, se crean automáticamente dos variables adicionales, conocidas como left y right de tipo int, que contienen la locación siniestra y diestra, respectivamente, del terminal o no terminal del archivo de entrada. Estos valores deben ser inicializados en los terminales por el lexer. Los valores de left y right se propagan a los no terminales a cuya producción se reduce.
Si un no terminal tiene varias expansiones diferentes, pueden ser declaradas juntas, separadas por una barra vertical ("|") y el conjunto total de expansiones debe culminar con el punto y coma (";").
Las acciones asociadas a las producciones aparecen en el lado derecho como strings de código (es decir, el código Java entre los delimitadores {: ... :}). Estas acciones son ejecutadas por el parser cuando la porción de la producción a la izquierda de la acción ha sido reconocida. (El scanner retornará el token una vez pasado el punto de la acción, ya que el parser necesita este token extra para el reconocimiento.)
Las asignaciones de precedencia contextual se escriben a la derecha de todos los símbolos y acciones de la producción cuya precedencia ya está asignada. Esto le permite al usuario que una producción tenga asignada una precedencia que no esté basada en el último terminal que integra la producción.