/* * ANTLR Ada95 tree super grammar (base class) * * Oliver M. Kellogg * * $Id$ * */ options { language="Cpp"; } class AdaTreeParserSuper extends TreeParser; options { importVocab=Ada; } // Compilation Unit: This is the start rule. compilation_unit : context_items_opt ( library_item | subunit ) ( pragma )* ; pragma : #(PRAGMA IDENTIFIER ( pragma_arg )* ) ; pragma_arg : #(RIGHT_SHAFT IDENTIFIER expression) | expression ; context_items_opt : #(CONTEXT_CLAUSE ( pragma | with_clause | use_clause )* ) ; with_clause : #(WITH_CLAUSE ( compound_name )+ ) ; compound_name : IDENTIFIER | #(DOT compound_name IDENTIFIER) ; use_clause : #(USE_TYPE_CLAUSE ( subtype_mark )+ ) | #(USE_CLAUSE ( compound_name )+ ) ; subtype_mark : compound_name | #(TIC compound_name attribute_id) ; attribute_id : RANGE | DIGITS | DELTA | ACCESS | IDENTIFIER ; library_item : #(LIBRARY_ITEM modifiers ( subprog_decl_or_rename_or_inst_or_body | #(PACKAGE_BODY def_id pkg_body_part) | #(GENERIC_PACKAGE_INSTANTIATION def_id generic_inst) | #(PACKAGE_SPECIFICATION def_id pkg_spec_part) | #(PACKAGE_RENAMING_DECLARATION def_id renames) | generic_decl ) ) ; modifiers : #(MODIFIERS ( ABSTRACT | ACCESS | ALIASED | ALL | CONSTANT | IN | LIMITED | OUT | PRIVATE | PROTECTED | REVERSE | TAGGED )* // We can afford to be this loose because the parser // has already fended off illegal usages, i.e. we can // be sure that we are only dealing with permissible // values for each usage context here. // Only exception: PRIVATE as the prefix of private // {generic|package|subprogram} library-level decl. // The parser has let this in for bodies as well // (which is not legal), so we need a semantic check. ) ; id_opt : #(ID_OPT ( def_designator )? ) ; end_id_opt : #(END ( def_designator )? ) ; subprog_decl : #(GENERIC_PROCEDURE_INSTANTIATION def_id generic_inst) | #(PROCEDURE_RENAMING_DECLARATION def_id formal_part_opt renames) | #(PROCEDURE_DECLARATION def_id formal_part_opt) | #(PROCEDURE_BODY_STUB def_id formal_part_opt) | #(ABSTRACT_PROCEDURE_DECLARATION def_id formal_part_opt) | #(GENERIC_FUNCTION_INSTANTIATION def_designator generic_inst) | #(FUNCTION_RENAMING_DECLARATION def_designator function_tail renames) | #(FUNCTION_DECLARATION def_designator function_tail) | #(FUNCTION_BODY_STUB def_designator function_tail) | #(ABSTRACT_FUNCTION_DECLARATION def_id function_tail) ; def_id : compound_name // Can afford looseness because parser is tight. ; generic_inst : compound_name ( value_s )? ; value : #(OTHERS expression) | #(RIGHT_SHAFT ranged_expr_s expression) | ranged_expr_s ; ranged_expr_s : #(PIPE ranged_expr_s ranged_expr) | ranged_expr ; ranged_expr : #(DOT_DOT expression simple_expression) | #(RANGE expression range) | expression ; range_constraint : #(RANGE_CONSTRAINT range) ; range : ( range_dots | range_attrib_ref ) ; range_dots : #(DOT_DOT simple_expression simple_expression) ; range_attrib_ref : #(RANGE_ATTRIBUTE_REFERENCE prefix ( expression )? ) ; prefix : IDENTIFIER | #(DOT prefix ( ALL | IDENTIFIER ) ) | #(INDEXED_COMPONENT prefix value_s ) ; formal_part_opt : #(FORMAL_PART_OPT ( parameter_specification )* ) ; parameter_specification : #(PARAMETER_SPECIFICATION defining_identifier_list modifiers subtype_mark init_opt) ; defining_identifier_list : #(DEFINING_IDENTIFIER_LIST ( IDENTIFIER )+ ) ; renames : CHARACTER_STRING // CHARACTER_STRING should not really be there. | OPERATOR_SYMBOL // OPERATOR_SYMBOL should be used instead. | name ; name : IDENTIFIER | #(DOT name ( ALL | IDENTIFIER | CHARACTER_LITERAL | OPERATOR_SYMBOL ) ) | #(INDEXED_COMPONENT name value_s) | #(TIC name attribute_id) ; definable_operator_symbol : OPERATOR_SYMBOL ; tqparenthesized_primary : #(PARENTHESIZED_PRIMARY ( NuLL | value_s extension_opt ) ) ; extension_opt : #(EXTENSION_OPT ( NuLL | value_s )? ) ; def_designator : compound_name | definable_operator_symbol ; function_tail : formal_part_opt subtype_mark ; spec_decl_part : #(GENERIC_PACKAGE_INSTANTIATION def_id generic_inst) | #(PACKAGE_SPECIFICATION def_id pkg_spec_part) | #(PACKAGE_RENAMING_DECLARATION def_id renames) ; pkg_spec_part : basic_declarative_items_opt private_declarative_items_opt end_id_opt ; basic_declarative_items_opt : #(BASIC_DECLARATIVE_ITEMS_OPT ( basic_decl_item )* ) ; private_declarative_items_opt : #(PRIVATE_DECLARATIVE_ITEMS_OPT ( basic_decl_item )* ) ; basic_decl_item : spec_decl_part | task_type_or_single_decl | prot_type_or_single_decl | subprog_decl | decl_common ; task_type_or_single_decl : #(TASK_TYPE_DECLARATION def_id discrim_part_opt task_definition_opt) | #(SINGLE_TASK_DECLARATION def_id task_definition_opt) ; task_definition_opt : task_items_opt private_task_items_opt ; discrim_part_opt : #(DISCRIM_PART_OPT ( BOX | discriminant_specifications )? ) ; discriminant_specifications : #(DISCRIMINANT_SPECIFICATIONS ( discriminant_specification )* ) ; discriminant_specification : #(DISCRIMINANT_SPECIFICATION defining_identifier_list modifiers subtype_mark init_opt) ; init_opt : #(INIT_OPT ( expression )? ) ; // `expression' is of course much too loose; // semantic checks are required in the usage contexts. task_items_opt : #(TASK_ITEMS_OPT entrydecls_repspecs_opt) ; entrydecls_repspecs_opt : ( entry_declaration | pragma | rep_spec )* ; entry_declaration : #(ENTRY_DECLARATION IDENTIFIER discrete_subtype_def_opt formal_part_opt) ; discrete_subtype_def_opt : #(DISCRETE_SUBTYPE_DEF_OPT ( discrete_subtype_definition )? ) ; discrete_subtype_definition // TBD : range | subtype_ind ; rep_spec : #(RECORD_REPRESENTATION_CLAUSE subtype_mark align_opt comp_loc_s) | #(AT_CLAUSE subtype_mark expression) | #(ATTRIBUTE_DEFINITION_CLAUSE subtype_mark expression) // attrib_def. Semantic check must ensure that the // subtype_mark contains an attribute reference. | #(ENUMERATION_REPESENTATION_CLAUSE local_enum_name enumeration_aggregate) ; align_opt : #(MOD_CLAUSE_OPT ( expression )? ) ; comp_loc_s : #(COMPONENT_CLAUSES_OPT ( pragma | subtype_mark expression range )* ) ; private_task_items_opt : #(PRIVATE_TASK_ITEMS_OPT entrydecls_repspecs_opt ) ; prot_type_or_single_decl : #(PROTECTED_TYPE_DECLARATION def_id discrim_part_opt protected_definition) | #(SINGLE_PROTECTED_DECLARATION def_id protected_definition) ; prot_private_opt : #(PROT_PRIVATE_OPT ( prot_member_decl_s )? ) ; protected_definition : prot_op_decl_s prot_private_opt end_id_opt ; prot_op_decl_s : #(PROT_OP_DECLARATIONS ( prot_op_decl )* ) ; prot_op_decl : entry_declaration | #(PROCEDURE_DECLARATION def_id formal_part_opt) | #(FUNCTION_DECLARATION def_designator function_tail) | rep_spec | pragma ; prot_member_decl_s : #(PROT_MEMBER_DECLARATIONS ( prot_op_decl | comp_decl )* ) ; comp_decl : #(COMPONENT_DECLARATION defining_identifier_list component_subtype_def init_opt) ; // decl_common is shared between declarative_item and basic_decl_item. // decl_common only contains specifications. decl_common : // type_def: #(ENUMERATION_TYPE_DECLARATION IDENTIFIER enum_id_s) | #(SIGNED_INTEGER_TYPE_DECLARATION IDENTIFIER range) | #(MODULAR_TYPE_DECLARATION IDENTIFIER expression) | #(FLOATING_POINT_DECLARATION IDENTIFIER expression range_constraint_opt) | #(ORDINARY_FIXED_POINT_DECLARATION IDENTIFIER expression range) | #(DECIMAL_FIXED_POINT_DECLARATION IDENTIFIER expression expression range_constraint_opt) | array_type_declaration | access_type_declaration // | #(INCOMPLETE_TYPE_DECLARATION IDENTIFIER discrim_part_opt) // derived_or_private_or_record | #(PRIVATE_EXTENSION_DECLARATION id_and_discrim modifiers subtype_ind) | #(DERIVED_RECORD_EXTENSION id_and_discrim modifiers subtype_ind record_definition) | #(ORDINARY_DERIVED_TYPE_DECLARATION id_and_discrim subtype_ind) | #(PRIVATE_TYPE_DECLARATION id_and_discrim modifiers) | #(RECORD_TYPE_DECLARATION id_and_discrim modifiers record_definition) // | #(SUBTYPE_DECLARATION IDENTIFIER subtype_ind) | generic_decl | use_clause | rep_spec // enumeration_representation_clause only | #(EXCEPTION_RENAMING_DECLARATION def_id compound_name) | #(OBJECT_RENAMING_DECLARATION def_id subtype_mark name) | #(EXCEPTION_DECLARATION defining_identifier_list) | #(NUMBER_DECLARATION defining_identifier_list expression) | #(ARRAY_OBJECT_DECLARATION defining_identifier_list modifiers array_type_definition init_opt) | #(OBJECT_DECLARATION defining_identifier_list modifiers subtype_ind init_opt) ; id_and_discrim : IDENTIFIER discrim_part_opt ; enum_id_s : ( enumeration_literal_specification )+ ; enumeration_literal_specification : IDENTIFIER | CHARACTER_LITERAL ; array_type_definition : index_or_discrete_range_s component_subtype_def ; range_constraint_opt : ( range_constraint )? ; array_type_declaration : #(ARRAY_TYPE_DECLARATION IDENTIFIER array_type_definition) ; index_or_discrete_range_s : index_or_discrete_range | #(COMMA index_or_discrete_range_s index_or_discrete_range) ; index_or_discrete_range : #(DOT_DOT simple_expression simple_expression) | #(RANGE simple_expression ( BOX | range) ) | simple_expression ; component_subtype_def : modifiers subtype_ind // mod=aliased_opt ; subtype_ind : #(SUBTYPE_INDICATION subtype_mark constraint_opt) ; constraint_opt : ( range_constraint | digits_constraint | delta_constraint | index_constraint | discriminant_constraint )? ; digits_constraint : #(DIGITS_CONSTRAINT expression range_constraint_opt) ; delta_constraint : #(DELTA_CONSTRAINT expression range_constraint_opt) ; index_constraint : #(INDEX_CONSTRAINT ( discrete_range )+ ) ; discrete_range : range | subtype_ind ; discriminant_constraint : #(DISCRIMINANT_CONSTRAINT ( discriminant_association )+ ) ; discriminant_association : #(DISCRIMINANT_ASSOCIATION selector_names_opt expression) ; selector_names_opt : #(SELECTOR_NAMES_OPT ( selector_name )* ) ; selector_name : IDENTIFIER // TBD: sem pred ; access_type_declaration : #(ACCESS_TO_PROCEDURE_DECLARATION IDENTIFIER modifiers formal_part_opt) | #(ACCESS_TO_FUNCTION_DECLARATION IDENTIFIER modifiers function_tail) | #(ACCESS_TO_OBJECT_DECLARATION IDENTIFIER modifiers subtype_ind) ; record_definition : ( component_list )? ; component_list : component_items ( variant_part )? ; component_items : #(COMPONENT_ITEMS ( pragma | comp_decl )* ) ; variant_part : #(VARIANT_PART discriminant_direct_name variant_s) ; discriminant_direct_name : IDENTIFIER // TBD: symtab lookup. ; variant_s : #(VARIANTS ( variant )+ ) ; variant : #(VARIANT choice_s ( component_list )? ) ; choice_s : #(PIPE choice_s choice ) | choice ; choice : OTHERS | discrete_with_range | expression ; discrete_with_range : mark_with_constraint | range ; mark_with_constraint : #(MARK_WITH_CONSTRAINT subtype_mark range_constraint) ; local_enum_name : IDENTIFIER // to be refined: do a symbol table lookup ; enumeration_aggregate : ( value )* ; generic_decl : #(GENERIC_PACKAGE_RENAMING generic_formal_part_opt def_id renames) | #(GENERIC_PACKAGE_DECLARATION generic_formal_part_opt def_id pkg_spec_part) | #(GENERIC_PROCEDURE_RENAMING generic_formal_part_opt def_id formal_part_opt renames) | #(GENERIC_PROCEDURE_DECLARATION generic_formal_part_opt def_id formal_part_opt) | #(GENERIC_FUNCTION_RENAMING generic_formal_part_opt def_designator function_tail renames) | #(GENERIC_FUNCTION_DECLARATION generic_formal_part_opt def_id function_tail) ; generic_formal_part_opt : #(GENERIC_FORMAL_PART ( pragma | use_clause | generic_formal_parameter )* ) ; generic_formal_parameter : // FORMAL_TYPE_DECLARATIONs: #(FORMAL_DISCRETE_TYPE_DECLARATION def_id) | #(FORMAL_SIGNED_INTEGER_TYPE_DECLARATION def_id) | #(FORMAL_MODULAR_TYPE_DECLARATION def_id) | #(FORMAL_DECIMAL_FIXED_POINT_DECLARATION def_id) | #(FORMAL_ORDINARY_FIXED_POINT_DECLARATION def_id) | #(FORMAL_FLOATING_POINT_DECLARATION def_id) | formal_array_type_declaration | formal_access_type_declaration | #(FORMAL_PRIVATE_TYPE_DECLARATION id_part modifiers) | #(FORMAL_ORDINARY_DERIVED_TYPE_DECLARATION id_part subtype_ind) | #(FORMAL_PRIVATE_EXTENSION_DECLARATION id_part modifiers subtype_ind) | #(FORMAL_PROCEDURE_DECLARATION def_id formal_part_opt subprogram_default_opt) | #(FORMAL_FUNCTION_DECLARATION def_designator function_tail subprogram_default_opt) | #(FORMAL_PACKAGE_DECLARATION def_id compound_name formal_package_actual_part_opt) | parameter_specification ; id_part : def_id discrim_part_opt ; formal_array_type_declaration : array_type_declaration ; formal_access_type_declaration : access_type_declaration ; subprogram_default_opt : ( BOX | name )? // #(SUBPROGRAM_DEFAULT_OPT ( BOX | name )? ) ; formal_package_actual_part_opt : ( BOX | defining_identifier_list )? ; subprog_decl_or_rename_or_inst_or_body : subprog_decl | procedure_body | function_body ; procedure_body : #(PROCEDURE_BODY def_id formal_part_opt body_part) ; function_body : #(FUNCTION_BODY def_designator function_tail body_part) ; body_part : declarative_part block_body end_id_opt ; declarative_part : #(DECLARATIVE_PART ( pragma | declarative_item )* ) ; // A declarative_item may appear in the declarative part of any body. declarative_item : #(PACKAGE_BODY_STUB def_id) | #(PACKAGE_BODY def_id pkg_body_part) | spec_decl_part | #(TASK_BODY_STUB def_id) | #(TASK_BODY def_id body_part end_id_opt) | task_type_or_single_decl | #(PROTECTED_BODY_STUB def_id) | #(PROTECTED_BODY def_id prot_op_bodies_opt end_id_opt) | prot_type_or_single_decl | subprog_decl_or_rename_or_inst_or_body | decl_common ; pkg_body_part : declarative_part block_body_opt end_id_opt ; block_body_opt : #(BLOCK_BODY_OPT ( handled_stmt_s )? ) ; prot_op_bodies_opt : #(PROT_OP_BODIES_OPT ( pragma | entry_body | subprog_decl_or_body )* ) ; subprog_decl_or_body : procedure_body | #(PROCEDURE_DECLARATION def_id formal_part_opt) | function_body | #(FUNCTION_DECLARATION def_designator function_tail) ; block_body : #(BLOCK_BODY handled_stmt_s) ; handled_stmt_s : #(HANDLED_SEQUENCE_OF_STATEMENTS statements except_handler_part_opt) ; handled_stmts_opt : #(HANDLED_STMTS_OPT ( statements except_handler_part_opt )? ) ; statements : #(SEQUENCE_OF_STATEMENTS ( pragma | statement )+ ) ; statement : #(STATEMENT def_label_opt ( null_stmt | exit_stmt | return_stmt | goto_stmt | delay_stmt | abort_stmt | raise_stmt | requeue_stmt | accept_stmt | select_stmt | if_stmt | case_stmt | loop_stmt id_opt | block end_id_opt | call_or_assignment // | code_stmt // not yet implemented in parser ) ) ; def_label_opt : #(LABEL_OPT ( IDENTIFIER )? ) ; null_stmt : NULL_STATEMENT ; if_stmt : #(IF_STATEMENT cond_clause elsifs_opt else_opt) ; cond_clause : #(COND_CLAUSE condition statements) ; condition : expression ; elsifs_opt : #(ELSIFS_OPT ( cond_clause )* ) ; else_opt : #(ELSE_OPT ( statements )? ) ; case_stmt : #(CASE_STATEMENT expression alternative_s) ; alternative_s : ( case_statement_alternative )+ ; case_statement_alternative : #(CASE_STATEMENT_ALTERNATIVE choice_s statements) ; loop_stmt : #(LOOP_STATEMENT iteration_scheme_opt statements) ; iteration_scheme_opt : #(ITERATION_SCHEME_OPT ( #(WHILE condition) | #(FOR IDENTIFIER modifiers discrete_subtype_definition) )? // mod=reverse_opt ) ; block : #(BLOCK_STATEMENT declare_opt block_body) ; declare_opt : #(DECLARE_OPT ( declarative_part )? ) ; exit_stmt : #(EXIT_STATEMENT ( label_name )? ( WHEN condition )? ) // TBD !!! ; label_name : IDENTIFIER ; return_stmt : #(RETURN_STATEMENT ( expression )? ) ; goto_stmt : #(GOTO_STATEMENT label_name) ; call_or_assignment : #(ASSIGNMENT_STATEMENT name expression) | #(CALL_STATEMENT name) ; entry_body : #(ENTRY_BODY def_id entry_body_formal_part entry_barrier body_part) ; entry_body_formal_part : entry_index_spec_opt formal_part_opt ; entry_index_spec_opt : #(ENTRY_INDEX_SPECIFICATION ( def_id discrete_subtype_definition )? ) ; entry_barrier : condition ; entry_call_stmt : #(ENTRY_CALL_STATEMENT name) ; accept_stmt : #(ACCEPT_STATEMENT def_id entry_index_opt formal_part_opt handled_stmts_opt end_id_opt ) ; entry_index_opt : #(ENTRY_INDEX_OPT ( expression )? ) ; delay_stmt : #(DELAY_STATEMENT modifiers expression) //mod=until_opt ; // SELECT_STATEMENT itself is not modeled since it is trivially // reconstructed: // select_statement ::= selective_accept | timed_entry_call // | conditional_entry_call | asynchronous_select // select_stmt : #(ASYNCHRONOUS_SELECT triggering_alternative abortable_part) | #(SELECTIVE_ACCEPT selective_accept) | #(TIMED_ENTRY_CALL entry_call_alternative delay_alternative) | #(CONDITIONAL_ENTRY_CALL entry_call_alternative statements) ; triggering_alternative : #(TRIGGERING_ALTERNATIVE ( delay_stmt | entry_call_stmt ) stmts_opt ) ; abortable_part : #(ABORTABLE_PART stmts_opt) ; entry_call_alternative : #(ENTRY_CALL_ALTERNATIVE entry_call_stmt stmts_opt) ; selective_accept : guard_opt select_alternative or_select_opt else_opt ; guard_opt : #(GUARD_OPT ( condition ( pragma )* )? ) ; select_alternative : accept_alternative | delay_alternative | TERMINATE_ALTERNATIVE ; accept_alternative : #(ACCEPT_ALTERNATIVE accept_stmt stmts_opt) ; delay_alternative : #(DELAY_ALTERNATIVE delay_stmt stmts_opt) ; stmts_opt : ( pragma | statement )* ; or_select_opt : #(OR_SELECT_OPT ( guard_opt select_alternative )* ) ; abort_stmt : #(ABORT_STATEMENT ( name )+ ) ; except_handler_part_opt : #(EXCEPT_HANDLER_PART_OPT ( exception_handler )* ) ; exception_handler : #(EXCEPTION_HANDLER identifier_colon_opt except_choice_s statements ) ; identifier_colon_opt : #(IDENTIFIER_COLON_OPT ( IDENTIFIER )? ) ; except_choice_s : #(PIPE except_choice_s exception_choice) | exception_choice ; exception_choice : compound_name | OTHERS ; raise_stmt : #(RAISE_STATEMENT ( compound_name )? ) ; requeue_stmt : #(REQUEUE_STATEMENT name ( ABORT )? ) ; operator_call : #(OPERATOR_SYMBOL value_s) ; value_s : #(VALUES ( value )+ ) ; expression : #(AND expression relation) | #(AND_THEN expression relation) | #(OR expression relation) | #(OR_ELSE expression relation) | #(XOR expression relation) | relation ; relation : #(IN simple_expression range_or_mark) | #(NOT_IN simple_expression range_or_mark) | #(EQ simple_expression simple_expression) | #(NE simple_expression simple_expression) | #(LT_ simple_expression simple_expression) | #(LE simple_expression simple_expression) | #(GT simple_expression simple_expression) | #(GE simple_expression simple_expression) | simple_expression ; range_or_mark : range | subtype_mark ; simple_expression : #(PLUS simple_expression signed_term) | #(MINUS simple_expression signed_term) | #(CONCAT simple_expression signed_term) | signed_term ; signed_term : #(UNARY_PLUS term) | #(UNARY_MINUS term) | term ; term : #(STAR term factor) | #(DIV term factor) | #(MOD term factor) | #(REM term factor) | factor ; factor : #(NOT primary) | #(ABS primary) | #(EXPON primary primary) | primary ; primary : ( name_or_qualified | tqparenthesized_primary | allocator | NuLL | NUMERIC_LIT | CHARACTER_LITERAL | CHAR_STRING | operator_call ) ; // Temporary, to be turned into just `qualified'. // We get away with it because `qualified' is always mentioned // together with `name'. // Only exception: `code_stmt', which is not yet implemented. name_or_qualified : IDENTIFIER | #(DOT name_or_qualified ( ALL | IDENTIFIER | CHARACTER_LITERAL | OPERATOR_SYMBOL ) ) | #(INDEXED_COMPONENT name_or_qualified value_s) | #(TIC name_or_qualified ( tqparenthesized_primary | attribute_id ) ) ; allocator : #(ALLOCATOR name_or_qualified) ; subunit : #(SUBUNIT compound_name ( subprogram_body | package_body | task_body | protected_body ) ) ; subprogram_body : procedure_body | function_body ; package_body : #(PACKAGE_BODY def_id pkg_body_part) ; task_body : #(TASK_BODY def_id body_part) ; protected_body : #(PROTECTED_BODY def_id prot_op_bodies_opt) ; // TBD // code_stmt : #(CODE_STATEMENT qualified) // ;