JavaCUP - Sintaxis JavaCUP: Detalles
Gramática para especificaciones CUP
java_cup_spec ::= package_spec import_list code_parts symbol_list precedence_list start_spec production_list package_spec ::= PACKAGE multipart_id SEMI | empty import_list ::= import_list import_spec | empty import_spec ::= IMPORT import_id SEMI code_part ::= action_code_part | parser_code_part | init_code | scan_code code_parts ::= code_parts code_part | empty action_code_part ::= ACTION CODE CODE_STRING opt_semi parser_code_part ::= PARSER CODE CODE_STRING opt_semi init_code ::= INIT WITH CODE_STRING opt_semi scan_code ::= SCAN WITH CODE_STRING opt_semi symbol_list ::= symbol_list symbol | symbol symbol ::= TERMINAL type_id declares_term | NON TERMINAL type_id declares_non_term | NONTERMINAL type_id declares_non_term | TERMINAL declares_term | NON TERMINAL declares_non_term | NONTERMIANL declared_non_term term_name_list ::= term_name_list COMMA new_term_id | new_term_id non_term_name_list ::= non_term_name_list COMMA new_non_term_id | new_non_term_id declares_term ::= term_name_list SEMI declares_non_term ::= non_term_name_list SEMI precedence_list ::= precedence_l | empty precedence_l ::= precedence_l preced + preced; preced ::= PRECEDENCE LEFT terminal_list SEMI | PRECEDENCE RIGHT terminal_list SEMI | PRECEDENCE NONASSOC terminal_list SEMI terminal_list ::= terminal_list COMMA terminal_id | terminal_id start_spec ::= START WITH nt_id SEMI | empty production_list ::= production_list production | production production ::= nt_id COLON_COLON_EQUALS rhs_list SEMI rhs_list ::= rhs_list BAR rhs | rhs rhs ::= prod_part_list PERCENT_PREC term_id | prod_part_list prod_part_list ::= prod_part_list prod_part | empty prod_part ::= symbol_id opt_label | CODE_STRING opt_label ::= COLON label_id | empty multipart_id ::= multipart_id DOT ID | ID import_id ::= multipart_id DOT STAR | multipart_id type_id ::= multipart_id terminal_id ::= term_id term_id ::= symbol_id new_term_id ::= ID new_non_term_id ::= ID nt_id ::= ID symbol_id ::= ID label_id ::= ID opt_semi ::= SEMI | empty
La sintaxis de las especificaciones de gramáticas CUP puede considerarse dividida en cuatro partes diferentes:
- Declaraciones preliminares, que permiten especificar cómo debe generarse el parser, y también proveer trozos de código para que sean ejecutados en tiempo de ejecución.
- Declaración de Terminales y No Terminales, con su respectiva clase de objeto asociada. En este caso, los terminales y no terminales pueden o no tener un tipo asociado, y en caso de no poseer un tipo especificado, significa que no tienen ningún valor asociado. Por el contrario, si se especifica un tipo determinado, el terminal o no terminal debe tomar un valor dentro del tipo declarado.
- Especificación de la precedencia y asociatividad de los terminales, en la que la última declaración de precedencia proporciana a sus terminales la más alta precedencia.
- Especificación de la sintaxis del lenguaje, con las producciones escritas en modo BNF.