-- ada83_actions.gwa -- This file contains the decorated grammar for Ada83. -- -- Created: June 1994, M. Larrea pragma = "PRAGMA" <+SPACE+> IDENTIFIER [ actual_parameter_part ] ";" . pragmas_opt = { <+LINE+> pragma } . basic_declaration = object_declaration | number_declaration | type_declaration | subtype_declaration | subprogram_declaration | package_declaration | task_declaration | generic_declaration | exception_declaration | generic_instantiation | renaming_declaration . object_declaration = identifier_list <+SPACE+> ":" <+SPACE+> subtype_indication [ <+SPACE+> ":=" <+SPACE+> expression ]";" | identifier_list <+SPACE+> ":" <+SPACE+> "CONSTANT" <+SPACE+> subtype_indication <+SPACE+> ":=" <+SPACE+> expression ";" | identifier_list <+SPACE+> ":" <+SPACE+> constrained_array_definition [ <+SPACE+> ":=" <+SPACE+> expression ] ";" | identifier_list <+SPACE+> ":" <+SPACE+> "CONSTANT" <+SPACE+> constrained_array_definition <+SPACE+> ":=" <+SPACE+> expression ";" . number_declaration = identifier_list <+SPACE+> ":" <+SPACE+> "CONSTANT" <+SPACE+> ":=" <+SPACE+> universal_static_expression ";" . universal_static_expression = expression . identifier_list = {+ IDENTIFIER $ "," <+LINE, SET+> +} . type_declaration = full_type_declaration | incomplete_type_declaration . full_type_declaration = "TYPE" <+SPACE+> IDENTIFIER [ discriminant_part ] <+SPACE+> "IS" <+SPACE+> type_definition ";" . type_definition = enumeration_type_definition | integer_type_definition | real_type_definition | array_type_definition | record_type_definition | access_type_definition | derived_type_definition . subtype_declaration = "SUBTYPE" <+SPACE+> IDENTIFIER <+SPACE+> "IS" <+SPACE+> subtype_indication ";" . subtype_indication = type_mark [ constraint ] . type_mark = [ expanded_name_start ] IDENTIFIER . expanded_name_start = {+ ( simple_name | operator_symbol ) "." +} . constraint = range_constraint | floating_point_constraint | fixed_point_constraint | index_constraint | discriminant_constraint . derived_type_definition = "NEW" <+SPACE+> subtype_indication . range_constraint = <+SPACE+> "RANGE" <+SPACE+> range . range = attribute | simple_expression <+SPACE+> ".." <+SPACE+> simple_expression . enumeration_type_definition = "(" {+ enumeration_literal $ "," <+SPACE+> +} ")" . enumeration_literal = IDENTIFIER | CHARACTER_LITERAL . integer_type_definition = range_constraint . real_type_definition = floating_point_constraint | fixed_point_constraint . floating_point_constraint = floating_accuracy_definition [ range_constraint ] . floating_accuracy_definition = "DIGITS" <+SPACE+> static_simple_expression . static_simple_expression = simple_expression . fixed_point_constraint = fixed_accuracy_definition [ range_constraint ] . fixed_accuracy_definition = "DELTA" <+SPACE+> static_simple_expression . array_type_definition = unconstrained_array_definition | constrained_array_definition . unconstrained_array_definition = "ARRAY" <+SPACE+> "(" {+ index_subtype_definition $ "," <+SPACE+> +} ")" <+SPACE+> "OF" <+SPACE+> subtype_indication . constrained_array_definition = "ARRAY" index_constraint "OF" subtype_indication. index_subtype_definition = type_mark <+SPACE+> "RANGE" <+SPACE+> "<>" . index_constraint = <+SPACE+> "(" {+ discrete_range $ "," +} ")" . discrete_range = discrete_subtype_indication | range . discrete_subtype_indication = type_mark [ range_constraint ] . record_type_definition = <+INCR, LINE, SET+> "RECORD" <+INCR+> component_list <+DECR, LINE, SET+> "END" <+SPACE+> "RECORD" <+DECR+> . component_list = pragmas_opt {+ <+LINE, SET+> component_declaration +} [ <+LINE, SET+> variant_part ] | pragmas_opt <+LINE, SET+> variant_part | <+LINE, SET+> "NULL" ";" pragmas_opt . component_declaration = identifier_list <+SPACE+> ":" <+SPACE+> subtype_indication [ <+SPACE+> ":=" <+SPACE+> expression ] ";" pragmas_opt . discriminant_part = "(" {+ discriminant_specification $ ";" <+SPACE+> +} ")" . discriminant_specification = identifier_list <+SPACE+> ":" <+SPACE+> type_mark [ <+SPACE+> ":=" <+SPACE+> expression ] . discriminant_constraint = "(" discriminant_associations ")" . discriminant_associations = {+ expression $ "," +} { "," {+ simple_name $ VERTICAL_BAR +} "=>" expression } | {+ {+ simple_name $ VERTICAL_BAR +} "=>" expression $ "," +} . variant_part = "CASE" <+SPACE+> simple_name <+SPACE+> "IS" pragmas_opt <+INCR+> variants <+DECR, LINE, SET+> "END" <+SPACE+> "CASE" ";" pragmas_opt. variants = {+ <+LINE, SET+> "WHEN" {+ <+SPACE+> choice $ <+SPACE+> VERTICAL_BAR +} <+SPACE+> "=>" <+INCR+> component_list <+DECR+> +} [ <+LINE, SET+> when_others_choice <+INCR+> component_list <+DECR+> ] | <+LINE, SET+> when_others_choice <+INCR+> component_list <+DECR+> . choice = simple_expression | simple_expression <+SPACE+> ".." <+SPACE+> simple_expression | type_mark range_constraint . when_others_choice = "WHEN" <+SPACE+> "OTHERS" <+SPACE+> "=>" . access_type_definition = "ACCESS" <+SPACE+> subtype_indication . incomplete_type_declaration = "TYPE" IDENTIFIER [ discriminant_part ] ";" . declarative_part = pragmas_opt { <+LINE, INCR, SET+> basic_declarative_item pragmas_opt <+DECR+> } [ <+LINE, LINE, INCR, SET+> body pragmas_opt { <+LINE, LINE, SET+> later_declarative_item pragmas_opt } <+DECR+> ] . basic_declarative_item = basic_declaration | representation_clause | use_clause . later_declarative_item = body | subprogram_declaration | package_declaration | task_declaration | generic_declaration | use_clause | generic_instantiation . body = proper_body | body_stub . proper_body = subprogram_body | package_body | task_body . name_or_function_call = simple_name | [ expanded_name_start ] CHARACTER_LITERAL | name_start {+ name_remainder +} . simple_name = IDENTIFIER . name_start = simple_name | operator_symbol . name_remainder = index_or_slice_or_parameters_remainder | selected_component_remainder | attribute_remainder . index_or_slice_or_parameters_remainder = "(" ( general_associations | simple_expression <+SPACE+> ".." <+SPACE+> simple_expression | type_mark range_constraint ) ")" . general_associations = {+ expression $ "," <+LINE, SET+> +} { "," <+LINE, SET+> formal_parameter <+SPACE+> "=>" <+SPACE+> expression } | {+ formal_parameter <+SPACE+> "=>" <+SPACE+> expression $ "," <+LINE, SET+> +} . formal_parameter = simple_name . selected_component_remainder = "." selector . selector = simple_name | operator_symbol | "ALL" . attribute = name_start { name_remainder } attribute_remainder . attribute_remainder = "'" attribute_designator . attribute_designator = ( simple_name | "DELTA" | "DIGITS" | "RANGE" ) [ "(" universal_static_expression ")" ] . aggregate = <+LINE, INCR, SET+> "(" <+AVANCE+> component_associations ")" <+RECULE, DECR+> . component_associations = expression "," ( {+ <+LINE, SET+> expression $ "," +} { "," named_association } [ "," <+LINE+> other_association ] | {+ named_association $ "," +} [ "," other_association ] | other_association ) | {+ named_association $ "," +} [ "," other_association ] | other_association . named_association = {+ choice $ VERTICAL_BAR +} <+SPACE+> "=>" <+SPACE+> expression . other_association = "OTHERS" <+SPACE+> "=>" <+SPACE+> expression . expression = {+ relation $ <+SPACE+> "AND" <+SPACE+> [ "THEN" <+LINE, SET, SPACE, SPACE+> ] | <+SPACE+> "OR" <+SPACE+> [ "ELSE" <+LINE, SET, SPACE, SPACE+> ] | <+SPACE+> "XOR" <+SPACE+> +} . relation = simple_expression [ <+SPACE+> relational_operator <+SPACE+> simple_expression | [ <+SPACE+> "NOT" ] <+SPACE+> "IN" ( range | type_mark ) ] . simple_expression = [ unary_adding_operator ] {+ term $ <+SPACE+> binary_adding_operator <+SPACE+> +} . term = {+ factor $ <+SPACE+> multiplying_operator <+SPACE+> +} . factor = {+ primary $ "**" +} | "ABS" <+SPACE+> primary | "NOT" <+SPACE+> primary . primary = NUMERIC_LITERAL | "NULL" | aggregate | STRING_LITERAL | name_or_function_call | allocator | qualified_expression | "(" expression ")" . relational_operator = "=" | "/=" | "<" | "<=" | ">" | ">=" . binary_adding_operator = "+" | "-" | "&" . unary_adding_operator = "+" | "-" . multiplying_operator = "*" | "/" | "MOD" | "REM" . qualified_expression = type_mark "'" ( "(" expression ")" | aggregate ) . allocator = "NEW" ( <+SPACE+> type_mark [ index_constraint | <+SPACE+> discriminant_constraint ] | <+SPACE+> qualified_expression ) . sequence_of_statements = pragmas_opt {+ statement pragmas_opt +} . statement = [ {+ <+LINE, SET+> label +} pragmas_opt ] ( <+INCR, SET+> simple_statement <+LINE, DECR+> | <+INCR, SET+> compound_statement <+LINE, DECR+> ). simple_statement = null_statement | assignment_statement | procedure_or_entry_call_statement | exit_statement | return_statement | goto_statement | delay_statement | abort_statement | raise_statement | code_statement . compound_statement = if_statement | case_statement | loop_statement | block_statement | accept_statement | select_statement . label = "<<" simple_name ">>" . null_statement = "NULL" ";" . assignment_statement = name_or_function_call <+SPACE+> ":=" <+SPACE+> expression ";" . if_statement = "IF" <+SPACE+> condition <+SPACE+> "THEN" <+LINE+> sequence_of_statements { <+SET+> "ELSIF" <+SPACE+> condition <+SPACE+> "THEN" <+LINE+> sequence_of_statements } [ <+SET+> "ELSE" <+LINE+> sequence_of_statements ] <+SET+> "END" <+SPACE+> "IF" ";" . condition = expression . case_statement = "CASE" <+SPACE+> expression <+SPACE+> "IS" pragmas_opt <+LINE+> case_statement_alternatives <+SET+> "END" <+SPACE+> "CASE" ";" . case_statement_alternatives = {+ <+INCR, SET+> "WHEN" <+SPACE+> {+ choice $ <+SPACE+> VERTICAL_BAR <+SPACE+> +} <+SPACE+> "=>" <+LINE+> sequence_of_statements <+DECR+> +} [ <+INCR, SET+> when_others_choice <+LINE+> sequence_of_statements <+DECR+> ] | <+INCR, SET+> when_others_choice <+LINE+> sequence_of_statements <+DECR+> . loop_statement = [ simple_name ":" <+LINE, SET+> ] [ iteration_scheme <+SPACE+> ] "LOOP" <+LINE+> sequence_of_statements <+SET+> "END" <+SPACE+> "LOOP" [ <+SPACE+> simple_name ] ";" . iteration_scheme = "WHILE" <+SPACE+> condition | "FOR" <+SPACE+> loop_parameter_specification . loop_parameter_specification = IDENTIFIER <+SPACE+> "IN" [ <+SPACE+> "REVERSE" ] <+SPACE+> discrete_range . block_statement = <+SET+> [ simple_name ":" <+LINE, SET+> ] [ "DECLARE" declarative_part ] begin_end [ <+SPACE+> simple_name ] ";" . begin_end = <+LINE, SET+> "BEGIN" <+LINE+> sequence_of_statements [ <+SET+> "EXCEPTION" pragmas_opt <+LINE+> exception_handlers ] <+SET+> "END" . exit_statement = "EXIT" [ <+SPACE+> loop_name ] [ <+SPACE+> "WHEN" <+SPACE+> condition ] ";" . loop_name = [ expanded_name_start ] IDENTIFIER . return_statement = "RETURN" [ <+SPACE+> expression ] ";" . goto_statement = "GOTO" <+SPACE+> label_name ";" . label_name = [ expanded_name_start ] IDENTIFIER . subprogram_declaration = subprogram_specification ";" . subprogram_specification = procedure_specification | function_specification . procedure_specification = "PROCEDURE" <+SPACE+> simple_name [ <+LINE, INCR, SET+> procedure_or_entry_formal_part <+DECR+> ] . procedure_or_entry_formal_part = "(" <+AVANCE+> {+ <+SET+> identifier_list <+SPACE+> ":" <+SPACE+> mode type_mark [ <+SPACE+> ":=" <+SPACE+> expression ] $ ";" <+LINE, SET+> +} ")" <+RECULE+> . mode = [ "IN" <+SPACE+> ] | "OUT" <+SPACE+> | "IN" <+SPACE+> "OUT" <+SPACE+> . function_specification = "FUNCTION" <+SPACE+> designator [ <+LINE, INCR, SET +> function_formal_part <+DECR+> ] <+LINE, INCR, SET+> "RETURN" <+SPACE+> type_mark <+DECR+> . designator = IDENTIFIER | operator_symbol . operator_symbol = STRING_LITERAL . function_formal_part = "(" <+AVANCE+> {+ <+SET+> identifier_list <+SPACE+> ":" [ <+SPACE+> "IN" ] <+SPACE+> type_mark [ <+SPACE+> ":=" <+SPACE+> expression ] $ ";" <+LINE, SET+> +} ")" <+RECULE+> . subprogram_body = procedure_specification <+SPACE+> "IS" declarative_part begin_end [ <+SPACE+> simple_name ] ";" | function_specification <+SPACE+> "IS" declarative_part begin_end [ <+SPACE+> designator ] ";" . procedure_or_entry_call_statement = procedure_or_entry_name [ <+LINE, INCR, SET+> actual_parameter_part <+DECR+> ] ";" . procedure_or_entry_name = procedure_name | entry_name . procedure_name = [ expanded_name_start ] IDENTIFIER . function_name = [ expanded_name_start ] designator . actual_parameter_part = "(" <+AVANCE, SET+> general_associations ")" <+RECULE+> . package_declaration = <+LINE, SET+> package_specification ";" <+LINE+> . package_specification = "PACKAGE" <+SPACE+> simple_name <+SPACE+> "IS" pragmas_opt { <+LINE, LINE, INCR, SET+> ( basic_declarative_item | private_type_declaration | deferred_constant_declaration ) pragmas_opt <+DECR+> } [ <+LINE, SET+> "PRIVATE" pragmas_opt { <+INCR, LINE, SET+> basic_declarative_item pragmas_opt <+DECR+> } ] <+LINE, LINE, SET+> "END" [ <+SPACE+> simple_name ] . package_body = "PACKAGE" <+SPACE+> "BODY" <+SPACE+> simple_name <+SPACE+> "IS" declarative_part ( begin_end | <+LINE, LINE+> "END" ) [ <+SPACE+> simple_name ] ";" . private_type_declaration = "TYPE" <+SPACE+> IDENTIFIER [ discriminant_part ] <+SPACE+> "IS" [ <+SPACE+> "LIMITED" ] <+SPACE+> "PRIVATE" ";" . deferred_constant_declaration = identifier_list <+SPACE+> ":" <+SPACE+> "CONSTANT" <+SPACE+> type_mark ";" . use_clause = "USE" <+LINE, INCR+> {+ <+SET+> package_name $ "," <+LINE+> +} ";" <+DECR+> . package_name = [ expanded_name_start ] simple_name . renaming_declaration = IDENTIFIER ":" type_mark "RENAMES" object_name ";" | IDENTIFIER ":" "EXCEPTION" "RENAMES" exception_name ";" | "PACKAGE" <+SPACE+> simple_name <+SPACE+> "RENAMES" <+SPACE+> package_name ";" | procedure_specification "RENAMES" procedure_or_entry_name ";" | function_specification "RENAMES" function_equivalent_name ";" . object_name = name_or_function_call . exception_name = [ expanded_name_start ] IDENTIFIER . function_equivalent_name = function_name | attribute | [ expanded_name_start ] CHARACTER_LITERAL . task_declaration = task_specification ";" . task_specification = "TASK" [ <+SPACE+> "TYPE" ] <+SPACE+> simple_name [ <+SPACE+> "IS" pragmas_opt { <+INCR, LINE, SET+> entry_declaration <+DECR+> } { <+INCR, LINE, SET+> representation_clause pragmas_opt <+DECR+> } <+LINE, SET+> "END" [ <+SPACE+> simple_name ] ] . task_body = "TASK" <+SPACE+> "BODY" <+SPACE+> simple_name <+SPACE+> "IS" declarative_part begin_end [ <+SPACE+> simple_name ] ";" . entry_declaration = "ENTRY" <+SPACE+> IDENTIFIER [ "(" discrete_range ")" ] [ <+LINE, INCR, SET+> procedure_or_entry_formal_part <+DECR+> ] ";" pragmas_opt . entry_name = [ task_name "." ] IDENTIFIER [ "(" entry_index ")" ] . entry_call_statement = entry_name [ actual_parameter_part ] ";" . accept_statement = "ACCEPT" <+SPACE+> simple_name [ "(" entry_index ")" ] [ procedure_or_entry_formal_part ] [ <+SPACE+> "DO" <+LINE+> sequence_of_statements <+SET+> "END" [ <+SPACE+> simple_name ] ] ";" . entry_index = expression . delay_statement = "DELAY" <+SPACE+> simple_expression ";" . select_statement = selective_wait | conditional_entry_call | timed_entry_call . selective_wait = "SELECT" {+ select_alternative $ <+LINE, SET+> "OR" +} [ <+LINE, SET+> "ELSE" <+LINE+> sequence_of_statements ] <+SET+> "END" <+SPACE+> "SELECT" ";" . select_alternative = pragmas_opt [ <+LINE, INCR, AVIS_DECR, SET+> "WHEN" <+SPACE+> condition <+SPACE+> "=>" pragmas_opt ] <+LINE, INCR, SET+> select_wait_alternative <+DECR, DECR_EV+> . select_wait_alternative = accept_alternative | delay_alternative | terminate_alternative . accept_alternative = accept_statement ( <+LINE, DECR+> sequence_of_statements <+INCR+> | pragmas_opt ) . delay_alternative = delay_statement ( <+LINE, DECR+> sequence_of_statements <+INCR+> | pragmas_opt ) . terminate_alternative = "TERMINATE" ";" pragmas_opt . conditional_entry_call = "SELECT" pragmas_opt entry_call_statement ( <+LINE+> sequence_of_statements | pragmas_opt ) "ELSE" <+LINE+> sequence_of_statements "END" "SELECT" ";" . timed_entry_call = "SELECT" pragmas_opt entry_call_statement ( <+LINE+> sequence_of_statements | pragmas_opt ) "OR" pragmas_opt delay_alternative "END" "SELECT" ";" . abort_statement = "ABORT" {+ task_name $ "," +} ";" . task_name = name_or_function_call . compilation = {+ <+LINE+> compilation_unit +} . compilation_unit = context_clause library_or_secondary_unit <+LINE+> | pragma . library_or_secondary_unit = subprogram_declaration | package_declaration | generic_declaration | generic_instantiation | subprogram_body | package_body | subunit . context_clause = { with_clause pragmas_opt { <+LINE, LINE+> use_clause pragmas_opt } <+LINE, LINE+> } . with_clause = "WITH" <+LINE, INCR+> {+ <+SET+> simple_name $ "," <+LINE+> +} ";" <+DECR+> . body_stub = subprogram_specification <+SPACE+> "IS" <+SPACE+> "SEPARATE" ";" | "PACKAGE" <+SPACE+> "BODY" <+SPACE+> simple_name <+SPACE+> "IS" <+SPACE+> "SEPARATE" ";" | "TASK" <+SPACE+> "BODY" <+SPACE+> simple_name <+SPACE+> "IS" <+SPACE+> "SEPARATE" ";" . subunit = "SEPARATE" <+SPACE+> "(" parent_unit_name ")" <+LINE+> proper_body . parent_unit_name = [ expanded_name_start ] ( simple_name | operator_symbol ) . exception_declaration = identifier_list <+SPACE+> ":" <+SPACE+> "EXCEPTION" ";" . exception_handlers = {+ <+INCR, SET+> "WHEN" <+SPACE+> {+ exception_name $ <+SPACE+> VERTICAL_BAR +} <+SPACE+> "=>" <+LINE+> sequence_of_statements <+DECR+> +} [ <+INCR, SET+> when_others_choice <+LINE+> sequence_of_statements <+DECR+> ] | <+INCR, SET+> when_others_choice <+LINE+> sequence_of_statements <+DECR+> . raise_statement = "RAISE" [ <+SPACE+> exception_name ] ";" . generic_declaration = generic_specification ";" . generic_specification = generic_formal_part ( subprogram_specification | package_specification ) . generic_formal_part = "GENERIC" pragmas_opt <+LINE, LINE, INCR+> { <+SET+> generic_parameter_declaration pragmas_opt <+LINE, LINE+> } <+DECR+> . generic_parameter_declaration = identifier_list <+SPACE+> ":" ( [ <+SPACE+> "IN" ] | <+SPACE+> "IN" <+SPACE+> "OUT" ) <+SPACE+> type_mark [ <+SPACE+> ":=" <+SPACE+> expression ] ";" | "TYPE" <+SPACE+> IDENTIFIER <+SPACE+> "IS" <+SPACE+> generic_type_definition ";" | private_type_declaration | "WITH" <+SPACE+> procedure_specification [ <+SPACE+> "IS" ( <+SPACE+> procedure_or_entry_name | <+SPACE+> "<>" ) ] ";" | "WITH" <+SPACE+> function_specification [ <+SPACE+> "IS" ( <+SPACE+> function_equivalent_name | <+SPACE+> "<>" ) ] ";" . generic_type_definition = "(" "<>" ")" | "RANGE" <+SPACE+> "<>" | "DIGITS" <+SPACE+> "<>" | "DELTA" <+SPACE+> "<>" | array_type_definition | access_type_definition . generic_instantiation = "PACKAGE" <+SPACE+> simple_name <+SPACE+> "IS" <+INCR, LINE, SET+> "NEW" <+SPACE+> package_name [ generic_actual_part ] ";" <+DECR+> | "PROCEDURE" <+SPACE+> simple_name <+SPACE+> "IS" <+INCR, LINE, SET+> "NEW" <+SPACE+> procedure_name [ generic_actual_part ] ";" <+DECR+> | "FUNCTION" <+SPACE+> designator <+SPACE+> "IS" <+INCR, LINE, SET+> "NEW" <+SPACE+> function_name [ generic_actual_part ] ";" <+DECR+> . generic_actual_part = <+INCR, LINE, SET+> "(" <+AVANCE+> generic_associations ")" <+RECULE, DECR+> . generic_associations = {+ <+SET+> generic_actual_parameter $ "," <+LINE+> +} { "," <+LINE, SET+> generic_formal_parameter <+SPACE+> "=>" <+SPACE+> generic_actual_parameter } | {+ <+SET+> generic_formal_parameter <+SPACE+> "=>" <+SPACE+> generic_actual_parameter $ "," <+LINE+> +} . generic_formal_parameter = simple_name | operator_symbol . generic_actual_parameter = expression . representation_clause = type_representation_clause | address_clause . type_representation_clause = length_clause | enumeration_representation_clause | record_representation_clause . length_clause = "FOR" attribute "USE" simple_expression ";" . enumeration_representation_clause = "FOR" simple_name "USE" aggregate ";" . record_representation_clause = "FOR" <+SPACE+> simple_name <+SPACE+> "USE" <+INCR, LINE, SET+> "RECORD" pragmas_opt [ alignment_clause pragmas_opt ] { <+INCR, LINE, SET+> component_clause pragmas_opt <+DECR+> } <+LINE, SET+> "END" <+SPACE+> "RECORD" ";" <+DECR+> . alignment_clause = <+SPACE+> "AT" <+SPACE+> "MOD" <+SPACE+> static_simple_expression ";" . component_clause = component_name <+SPACE+> "AT" <+SPACE+> static_simple_expression <+SPACE+> "RANGE" <+SPACE+> static_range ";" . component_name = name_or_function_call . static_range = range . address_clause = "FOR" <+SPACE+> simple_name <+SPACE+> "USE" <+INCR, LINE, SET+> "AT" simple_expression ";" <+DECR+>. code_statement = type_mark "'" aggregate ";" .