Initial support for subprograms

This commit is contained in:
Emmanuel Briot 2022-10-21 17:40:19 +02:00
parent 5e5c9f5bc6
commit 8e44c8bc3b
3 changed files with 659 additions and 155 deletions

View File

@ -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
@ -286,7 +316,6 @@ end;
(identifier)))))
(component_list)))))))))))))
================================================================================
interface
================================================================================

448
corpus/subprograms.txt Normal file
View File

@ -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))))))))))))))))))))))))

View File

@ -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,