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
  2. unidad de compilación
  3. especificación léxica y sintáctica


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.