diff --git a/corpus/records.txt b/corpus/records.txt index b0c5b34..00fd544 100644 --- a/corpus/records.txt +++ b/corpus/records.txt @@ -26,9 +26,9 @@ records package P is type R2 is record - A : Integer; - -- B : Integer range 0 .. 2; - -- null; + A : aliased Integer; + B : Integer range 0 .. 2; + C, D : not null access Integer; end record; for R2 use record @@ -57,9 +57,39 @@ end; (component_definition (subtype_indication (name - (identifier))))))) - (comment) - (comment)))))) + (identifier)))))) + (component_item + (component_declaration + (defining_identifier_list + (identifier)) + (component_definition + (subtype_indication + (name + (identifier)) + (constraint + (scalar_constraint + (range_constraint + (range_g + (simple_expression + (term + (factor + (primary + (numeric_literal))))) + (simple_expression + (term + (factor + (primary + (numeric_literal))))))))))))) + (component_item + (component_declaration + (defining_identifier_list + (identifier) + (identifier)) + (component_definition + (access_definition + (null_exclusion) + (name + (identifier)))))))))))) (aspect_clause (record_representation_clause (name @@ -225,67 +255,66 @@ end; -------------------------------------------------------------------------------- - (compilation - (compilation_unit - (package_specification - (name - (identifier)) - (type_declaration - (full_type_declaration - (identifier) - (known_discriminant_part - (discriminant_specification_list - (discriminant_specification - (defining_identifier_list - (identifier)) - (name - (identifier))))) - (type_definition - (record_type_definition - (record_definition - (component_list - (variant_part - (identifier) - (variant_list - (variant - (discrete_choice_list - (discrete_choice - (expression - (relation - (simple_expression - (term - (factor - (primary - (numeric_literal)))))))) - (discrete_choice - (range_g - (simple_expression - (term - (factor - (primary - (numeric_literal))))) - (simple_expression - (term - (factor - (primary - (numeric_literal)))))))) - (component_list - (component_item - (component_declaration - (defining_identifier_list - (identifier)) - (component_definition - (subtype_indication - (name - (identifier)))))))) - (variant - (discrete_choice_list - (discrete_choice +(compilation + (compilation_unit + (package_specification + (name + (identifier)) + (type_declaration + (full_type_declaration + (identifier) + (known_discriminant_part + (discriminant_specification_list + (discriminant_specification + (defining_identifier_list + (identifier)) + (name + (identifier))))) + (type_definition + (record_type_definition + (record_definition + (component_list + (variant_part + (identifier) + (variant_list + (variant + (discrete_choice_list + (discrete_choice + (expression + (relation + (simple_expression + (term + (factor + (primary + (numeric_literal)))))))) + (discrete_choice + (range_g + (simple_expression + (term + (factor + (primary + (numeric_literal))))) + (simple_expression + (term + (factor + (primary + (numeric_literal)))))))) + (component_list + (component_item + (component_declaration + (defining_identifier_list + (identifier)) + (component_definition (subtype_indication (name - (identifier))))) - (component_list))))))))))))) - + (identifier)))))))) + (variant + (discrete_choice_list + (discrete_choice + (subtype_indication + (name + (identifier))))) + (component_list))))))))))))) ================================================================================ interface @@ -299,34 +328,34 @@ end; -------------------------------------------------------------------------------- - (compilation - (compilation_unit - (package_specification - (name - (identifier)) - (type_declaration - (full_type_declaration - (identifier) - (type_definition - (interface_type_definition)))) - (type_declaration - (full_type_declaration - (identifier) - (type_definition - (interface_type_definition - (interface_list - (name - (identifier))))))) - (type_declaration - (full_type_declaration - (identifier) - (type_definition - (derived_type_definition - (subtype_indication - (name - (identifier))) - (interface_list - (name - (identifier))) - (record_extension_part - (record_definition))))))))) +(compilation + (compilation_unit + (package_specification + (name + (identifier)) + (type_declaration + (full_type_declaration + (identifier) + (type_definition + (interface_type_definition)))) + (type_declaration + (full_type_declaration + (identifier) + (type_definition + (interface_type_definition + (interface_list + (name + (identifier))))))) + (type_declaration + (full_type_declaration + (identifier) + (type_definition + (derived_type_definition + (subtype_indication + (name + (identifier))) + (interface_list + (name + (identifier))) + (record_extension_part + (record_definition))))))))) diff --git a/corpus/subprograms.txt b/corpus/subprograms.txt new file mode 100644 index 0000000..a4807d0 --- /dev/null +++ b/corpus/subprograms.txt @@ -0,0 +1,448 @@ +================================================================================ +null procedure +================================================================================ + +package P is + procedure A is null; + overriding procedure B is null; + procedure B is null with Inline; +end; + +-------------------------------------------------------------------------------- + +(compilation + (compilation_unit + (package_specification + (name + (identifier)) + (null_procedure_declaration + (procedure_specification + (name + (identifier)))) + (null_procedure_declaration + (overriding_indicator) + (procedure_specification + (name + (identifier)))) + (null_procedure_declaration + (procedure_specification + (name + (identifier))) + (aspect_specification + (aspect_mark_list + (aspect_association + (aspect_mark + (identifier))))))))) + +================================================================================ +procedures +================================================================================ + +package P is + procedure A (P1, P2 : Integer; P3 : Float) + with Inline; + procedure B is abstract; + procedure C is abstract with Inline; +end; + +-------------------------------------------------------------------------------- + +(compilation + (compilation_unit + (package_specification + (name + (identifier)) + (subprogram_declaration + (subprogram_specification + (procedure_specification + (name + (identifier)) + (non_empty_parameter_profile + (formal_part + (parameter_specification_list + (parameter_specification + (defining_identifier_list + (identifier) + (identifier)) + (name + (identifier))) + (parameter_specification + (defining_identifier_list + (identifier)) + (name + (identifier)))))))) + (aspect_specification + (aspect_mark_list + (aspect_association + (aspect_mark + (identifier)))))) + (abstract_subprogram_declaration + (subprogram_specification + (procedure_specification + (name + (identifier))))) + (abstract_subprogram_declaration + (subprogram_specification + (procedure_specification + (name + (identifier)))) + (aspect_specification + (aspect_mark_list + (aspect_association + (aspect_mark + (identifier))))))))) + +================================================================================ +functions +================================================================================ + +package P is + function F (A, B : Integer) return not null access Integer + with Inline, Convention => C; +end; + +-------------------------------------------------------------------------------- + +(compilation + (compilation_unit + (package_specification + (name + (identifier)) + (subprogram_declaration + (subprogram_specification + (function_specification + (name + (identifier)) + (parameter_and_result_profile + (formal_part + (parameter_specification_list + (parameter_specification + (defining_identifier_list + (identifier) + (identifier)) + (name + (identifier))))) + (result_profile + (access_definition + (null_exclusion) + (name + (identifier))))))) + (aspect_specification + (aspect_mark_list + (aspect_association + (aspect_mark + (identifier))) + (aspect_association + (aspect_mark + (identifier)) + (aspect_definition + (expression + (relation + (simple_expression + (term + (factor + (primary + (name + (identifier)))))))))))))))) + +================================================================================ +subprogram body +================================================================================ + +package body P is + procedure A (B : Integer) is + V : Integer; + begin + null; + end A; +end; + +-------------------------------------------------------------------------------- + +(compilation + (compilation_unit + (proper_body + (package_body + (name + (identifier)) + (non_empty_declarative_part + (declarative_item_pragma + (proper_body + (subprogram_body + (subprogram_specification + (procedure_specification + (name + (identifier)) + (non_empty_parameter_profile + (formal_part + (parameter_specification_list + (parameter_specification + (defining_identifier_list + (identifier)) + (name + (identifier)))))))) + (non_empty_declarative_part + (declarative_item_pragma + (object_declaration + (defining_identifier_list + (identifier)) + (subtype_indication + (name + (identifier)))))) + (handled_sequence_of_statements + (sequence_of_statements + (statement + (simple_statement + (null_statement))))) + (name + (identifier)))))))))) + +================================================================================ +expression function membership +================================================================================ + +function F2 (A : Integer) return Boolean + is (A not in Small_Integer); + +-------------------------------------------------------------------------------- + +(compilation + (compilation_unit + (expression_function_declaration + (function_specification + (name + (identifier)) + (parameter_and_result_profile + (formal_part + (parameter_specification_list + (parameter_specification + (defining_identifier_list + (identifier)) + (name + (identifier))))) + (result_profile + (name + (identifier))))) + (aggregate + (array_aggregate + (positional_array_aggregate + (expression_list + (expression + (relation + (simple_expression + (term + (factor + (primary + (name + (identifier)))))) + (membership_choice_list + (membership_choice + (simple_expression + (term + (factor + (primary + (name + (identifier))))))))))))))))) + +================================================================================ +Expression function raise +================================================================================ + +function F3 return Boolean + is (raise Constraint_Error); + +-------------------------------------------------------------------------------- + +(compilation + (compilation_unit + (expression_function_declaration + (function_specification + (name + (identifier)) + (parameter_and_result_profile + (result_profile + (name + (identifier))))) + (aggregate + (array_aggregate + (positional_array_aggregate + (expression_list + (expression + (relation + (raise_expression + (name + (identifier)))))))))))) + +================================================================================ +Expression function simple +================================================================================ + +function F4 return Boolean is (True); + +-------------------------------------------------------------------------------- + +(compilation + (compilation_unit + (expression_function_declaration + (function_specification + (name + (identifier)) + (parameter_and_result_profile + (result_profile + (name + (identifier))))) + (aggregate + (array_aggregate + (positional_array_aggregate + (expression_list + (expression + (relation + (simple_expression + (term + (factor + (primary + (name + (identifier))))))))))))))) + +================================================================================ +Expression function if +================================================================================ + +function F (A : Integer) return Boolean + is (if A = 0 or A = 1 then True else False); + +-------------------------------------------------------------------------------- + +(compilation + (compilation_unit + (expression_function_declaration + (function_specification + (name + (identifier)) + (parameter_and_result_profile + (formal_part + (parameter_specification_list + (parameter_specification + (defining_identifier_list + (identifier)) + (name + (identifier))))) + (result_profile + (name + (identifier))))) + (aggregate + (conditional_expression + (if_expression + (expression + (relation + (simple_expression + (term + (factor + (primary + (name + (identifier)))))) + (relational_operator) + (simple_expression + (term + (factor + (primary + (numeric_literal)))))) + (relation + (simple_expression + (term + (factor + (primary + (name + (identifier)))))) + (relational_operator) + (simple_expression + (term + (factor + (primary + (numeric_literal))))))) + (expression + (relation + (simple_expression + (term + (factor + (primary + (name + (identifier)))))))) + (expression + (relation + (simple_expression + (term + (factor + (primary + (name + (identifier)))))))))))))) + +================================================================================ +Expression function if extra parenthesis +================================================================================ + +function F5 (A : Integer) return Boolean + is ((if A = 0 then True else False)); + +-------------------------------------------------------------------------------- + +(compilation + (compilation_unit + (expression_function_declaration + (function_specification + (name + (identifier)) + (parameter_and_result_profile + (formal_part + (parameter_specification_list + (parameter_specification + (defining_identifier_list + (identifier)) + (name + (identifier))))) + (result_profile + (name + (identifier))))) + (aggregate + (array_aggregate + (positional_array_aggregate + (expression_list + (expression + (relation + (simple_expression + (term + (factor + (primary + (aggregate + (conditional_expression + (if_expression + (expression + (relation + (simple_expression + (term + (factor + (primary + (name + (identifier)))))) + (relational_operator) + (simple_expression + (term + (factor + (primary + (numeric_literal))))))) + (expression + (relation + (simple_expression + (term + (factor + (primary + (name + (identifier)))))))) + (expression + (relation + (simple_expression + (term + (factor + (primary + (name + (identifier)))))))))))))))))))))))) diff --git a/grammar.js b/grammar.js index 54658cb..813b2aa 100644 --- a/grammar.js +++ b/grammar.js @@ -75,6 +75,10 @@ module.exports = grammar({ // 'for' name 'use' '(' 'for' identifier 'in' name . 'use' [$.iterator_specification, $.subtype_indication], + // 'type' identifier 'is' 'mod' 'raise' name . 'with' ... + // ??? This appears legal Ada per the grammar, but doesn't make sense. + // ??? This results in a large slowdown of the parser + [$.raise_expression], ], @@ -326,11 +330,23 @@ module.exports = grammar({ $.proper_body, ), proper_body: $ => choice( -// $.subprogram_body, + $.subprogram_body, $.package_body, // $.task_body, // $.protected_body, ), + subprogram_body: $ => seq( + optional($.overriding_indicator), + $.subprogram_specification, + optional($.aspect_specification), + reservedWord('is'), + optional($.non_empty_declarative_part), + reservedWord('begin'), + $.handled_sequence_of_statements, + reservedWord('end'), + optional($.name), + ';' + ), package_body: $ => seq( reservedWord('package'), reservedWord('body'), @@ -380,12 +396,11 @@ module.exports = grammar({ comma_separated_list_of($.expression), ), expression: $ => choice( - $.relation, - seq($.relation, $.AND_relation_list), - seq($.relation, $.AND_THEN_relation_list), - seq($.relation, $.OR_relation_list), - seq($.relation, $.OR_ELSE_relation_list), - seq($.relation, $.XOR_relation_list), + list_of(reservedWord('and'), $.relation), + list_of(seq(reservedWord('and'), reservedWord('then')), $.relation), + list_of(reservedWord('or'), $.relation), + list_of(seq(reservedWord('or'), reservedWord('else')), $.relation), + list_of(reservedWord('xor'), $.relation), ), assoc_expression: $ => seq( '=>', @@ -394,43 +409,36 @@ module.exports = grammar({ '<>', ), ), - AND_relation_list: $ => repeat1(seq( - reservedWord('and'), - $.relation, - )), - AND_THEN_relation_list: $ => repeat1(seq( - reservedWord('and'), - reservedWord('then'), - $.relation, - )), - OR_relation_list: $ => repeat1(seq( - reservedWord('or'), - $.relation, - )), - OR_ELSE_relation_list: $ => repeat1(seq( - reservedWord('or'), - reservedWord('else'), - $.relation, - )), - XOR_relation_list: $ => repeat1(seq( - reservedWord('xor'), - $.relation, - )), relation: $ => choice( seq( $.simple_expression, optional(seq( $.relational_operator, $.simple_expression, - )) + )), ), -// seq( -// $.simple_expression, -// optional(reservedWord('not')), -// reservedWord('in'), -// $.membership_choice_list, -// ), -// $.raise_expression, + seq( + $.simple_expression, + optional(reservedWord('not')), + reservedWord('in'), + $.membership_choice_list, + ), + $.raise_expression, + ), + raise_expression: $ => seq( + reservedWord('raise'), + $.name, + optional(seq( + reservedWord('with'), + $.simple_expression, + )), + ), + membership_choice_list: $ => prec.right( + list_of('|', $.membership_choice), + ), + membership_choice: $ => choice( + $.simple_expression, + $.range_g, ), simple_expression: $ => seq( optional($.unary_adding_operator), @@ -495,7 +503,7 @@ module.exports = grammar({ '(', choice( comma_separated_list_of($.parameter_association), -// $.conditional_expression, + $.conditional_expression, // $.quantified_expression, // $.declare_expression, ), @@ -509,28 +517,26 @@ module.exports = grammar({ $.expression, '<>', ), - component_choice_list: $ => choice( - $.selector_name, - seq( - $.component_choice_list, - '|', - $.selector_name, - ), + conditional_expression: $ => choice( + $.if_expression, +// $.case_expression, ), + component_choice_list: $ => + list_of('|', $.selector_name), aggregate: $ => choice( $.record_aggregate, // $.extension_aggregate, $.array_aggregate, // $.delta_aggregate, -// seq( -// '(', -// choice( -// $.conditional_expression, + seq( + '(', + choice( + $.conditional_expression, // $.quantified_expression, // $.declare_expression, -// ), -// ')', -// ), + ), + ')', + ), ), record_aggregate: $ => seq( '(', @@ -787,7 +793,7 @@ module.exports = grammar({ optional(reservedWord('aliased')), choice( $.subtype_indication, -// $.access_definition, + $.access_definition, ), ), abstract_subprogram_declaration: $ => seq( @@ -795,7 +801,7 @@ module.exports = grammar({ $.subprogram_specification, reservedWord('is'), reservedWord('abstract'), - $.aspect_specification, + optional($.aspect_specification), ';', ), array_aggregate: $ => choice( @@ -982,9 +988,7 @@ module.exports = grammar({ optional($.overriding_indicator), $.function_specification, reservedWord('is'), - '(', - $.expression, - ')', + $.aggregate, optional($.aspect_specification), ';', ), @@ -1100,7 +1104,8 @@ module.exports = grammar({ $.procedure_specification, reservedWord('is'), reservedWord('null'), -// optional($.aspect_specification), + optional($.aspect_specification), + ';', ), null_statement: $ => seq( reservedWord('null'), @@ -1161,12 +1166,34 @@ module.exports = grammar({ '(', choice( // $.pragma_argument_association_list, -// $.conditional_quantified_expression, + $.conditional_quantified_expression, ), ')', )), ';' ), + conditional_quantified_expression: $ => choice( + $.if_expression, +// $.case_expression, +// $.quantified_expression, + ), + if_expression: $ => seq( + reservedWord('if'), + field('condition', $.expression), + reservedWord('then'), + $.expression, + repeat($.elsif_expression_item), + optional(seq( + reservedWord('else'), + $.expression, + )), + ), + elsif_expression_item: $ => seq( + reservedWord('elsif'), + field('condition', $.expression), + reservedWord('then'), + $.expression, + ), procedure_specification: $ => seq( reservedWord('procedure'), $.name,