JavaCC - Sintaxis JavaCC - Detalles
Reglas de Producción de especificaciones JavaCC
A continuación se define el conjunto de producciones, que generan el lenguaje de las especificaciones de gramáticas que pueden ser procesadas por JavaCC para generar parsers para dichas gramáticas:
javacc_input | ::= | javacc_options |
"PARSER_BEGIN" "(" <IDENTIFIER> ")" | ||
java_compilation_unit | ||
"PARSER_END" "(" <IDENTIFIER> ")" | ||
( production )* | ||
<EOF> | ||
javacc_options | ::= | [ "options" "{" ( option_binding )* "}" ] |
option_binding | ::= | "LOOKAHEAD" "=" java_integer_literal ";" |
| | "CHOICE_AMBIGUITY_CHECK" "=" java_integer_literal ";" | |
| | "OTHER_AMBIGUITY_CHECK" "=" java_integer_literal ";" | |
| | "STATIC" "=" java_boolean_literal ";" | |
| | "DEBUG_PARSER" "=" java_boolean_literal ";" | |
| | "DEBUG_LOOKAHEAD" "=" java_boolean_literal ";" | |
| | "DEBUG_TOKEN_MANAGER" "=" java_boolean_literal ";" | |
| | "OPTIMIZE_TOKEN_MANAGER" "=" java_boolean_literal ";" | |
| | "ERROR_REPORTING" "=" java_boolean_literal ";" | |
| | "JAVA_UNICODE_ESCAPE" "=" java_boolean_literal ";" | |
| | "UNICODE_INPUT" "=" java_boolean_literal ";" | |
| | "IGNORE_CASE" "=" java_boolean_literal ";" | |
| | "USER_TOKEN_MANAGER" "=" java_boolean_literal ";" | |
| | "USER_CHAR_STREAM" "=" java_boolean_literal ";" | |
| | "BUILD_PARSER" "=" java_boolean_literal ";" | |
| | "BUILD_TOKEN_MANAGER" "=" java_boolean_literal ";" | |
| | "SANITY_CHECK" "=" java_boolean_literal ";" | |
| | "FORCE_LA_CHECK" "=" java_boolean_literal ";" | |
| | "COMMON_TOKEN_ACTION" "=" java_boolean_literal ";" | |
| | "CACHE_TOKENS" "=" java_boolean_literal ";" | |
| | "OUTPUT_DIRECTORY" "=" java_string_literal ";" | |
production | ::= | javacode_production |
| | regular_expr_production | |
| | bnf_production | |
| | token_manager_decls | |
javacode_production | ::= | "JAVACODE" |
java_return_type java_identifier "(" java_parameter_list ")" | ||
java_block | ||
bnf_production | ::= | java_return_type java_identifier "(" java_parameter_list ")" ":" |
java_block | ||
"{" expansion_choices "}" | ||
regular_expr_production | ::= | [ lexical_state_list ] |
regexpr_kind [ "[" "IGNORE_CASE" "]" ] ":" | ||
"{" regexpr_spec ( "|" regexpr_spec )* "}" | ||
token_manager_decls | ::= | "TOKEN_MGR_DECLS" ":" java_block |
lexical_state_list | ::= | "<" "*" ">" |
| | "<" java_identifier ( "," java_identifier )* ">" | |
regexpr_kind | ::= | "TOKEN" |
| | "SPECIAL_TOKEN" | |
| | "SKIP" | |
| | "MORE" | |
regexpr_spec | ::= | regular_expression [ java_block ] [ ":" java_identifier ] |
expansion_choices | ::= | expansion ( "|" expansion )* |
expansion | ::= | ( expansion_unit )* |
expansion_unit | ::= | local_lookahead |
| | java_block | |
| | "(" expansion_choices ")" [ "+" | "*" | "?" ] | |
| | "[" expansion_choices "]" | |
| | [ java_assignment_lhs "=" ] regular_expression | |
| | [ java_assignment_lhs "=" ] java_identifier "(" java_expression_list ")" | |
local_lookahead | ::= | "LOOKAHEAD" "(" [ java_integer_literal ] [ "," ] [ expansion_choices ] [ "," ] [ "{" java_expression "}" ] ")" |
regular_expression | ::= | java_string_literal |
| | "<" [ [ "#" ] java_identifier ":" ] complex_regular_expression_choices ">" | |
| | "<" java_identifier ">" | |
| | "<" "EOF" ">" | |
complex_regular_expression_choices | ::= | complex_regular_expression ( "|" complex_regular_expression )* |
complex_regular_expression | ::= | ( complex_regular_expression_unit )* |
complex_regular_expression_unit | ::= | java_string_literal |
| | "<" java_identifier ">" | |
| | character_list | |
| | "(" complex_regular_expression_choices ")" [ "+" | "*" | "?" ] | |
character_list | ::= | [ "~" ] "[" [ character_descriptor ( "," character_descriptor )* ] "]" |
character_descriptor | ::= | java_string_literal [ "-" java_string_literal ] |
javacc_input
javacc_input define el esqueleto sintáctico de los archivos de entrada
de JavaCC.
La especificación del lenguaje para el que se desea construir el parser,
posee tres elementos diferentes:
1. Declaracion de opciones de personalización
javacc_options
javacc_options define la lista de opciones de personalización si hay alguna que adopte un valor distinto del valor predeterminado por
defecto. La lista se escribe entre llaves ("{" y "}")
y se antecede con la palabra reservada options.
option_binding
Las opciones que pueden elegirse para personalizar el parser, si es que se elige alguna,
se escriben como una lista cuyos elementos son la opción y el valor que
se le asigna, separado cada elemento del siguiente por ";".
Las opciones pueden setearse tanto desde el archivo como desde la línea
de comandos. El valor seteado desde la línea de comandos, posee mayor precedencia
que la especificada en el archivo.
2. Unidad de Compilación
Entre las palabras PARSE_BEGIN(nombre_parser) y PARSE_END(nombre_parser) debe especificarse la unidad de compilación java, en la cual JavaCC no realiza chequeos detallados, por lo que es posible que los archivos .java que se generan posean errores.
Si la unidad de compilación incluye paquetes de declaraciones, los mismos
son incluídos en los archivos generados, y si incluye declaraciones importadas,
también son incluídas en el parser y el token manager generados.
3. Especificaciones Léxicas y Sintácticas
Las especificaciones léxicas y sintácticas del lenguaje, se definen mediante
las diferentes variantes de producciones production.