From 464ba8c3da64d11bd3ca261e06ac344025aa3595 Mon Sep 17 00:00:00 2001 From: Emmanuel Briot Date: Tue, 25 Oct 2022 09:24:41 +0200 Subject: [PATCH] Range attribute --- corpus/attributes.txt | 89 +++++++++++++++++++++++++++++++++++++++++++ corpus/statements.txt | 14 +++---- grammar.js | 60 +++++++++++++++++++++++++++-- 3 files changed, 153 insertions(+), 10 deletions(-) create mode 100644 corpus/attributes.txt diff --git a/corpus/attributes.txt b/corpus/attributes.txt new file mode 100644 index 0000000..f067778 --- /dev/null +++ b/corpus/attributes.txt @@ -0,0 +1,89 @@ +================================================================================ +Range attribute +================================================================================ + +procedure P is + A : MyArray (B'Range (1)); +begin + for E in Arr'Range loop + null; + end loop; + for E in Arr'Range (1) loop + null; + end loop; +end; + +-------------------------------------------------------------------------------- + +(compilation + (compilation_unit + (proper_body + (subprogram_body + (subprogram_specification + (procedure_specification + (name + (identifier)))) + (non_empty_declarative_part + (declarative_item_pragma + (object_declaration + (defining_identifier_list + (identifier)) + (subtype_indication + (name + (identifier)) + (constraint + (index_constraint + (discrete_range + (range_g + (name + (identifier)) + (tick) + (range_attribute_designator + (expression + (relation + (simple_expression + (term + (factor + (primary + (numeric_literal)))))))))))))))) + (handled_sequence_of_statements + (sequence_of_statements + (statement + (compound_statement + (loop_statement + (iteration_scheme + (loop_parameter_specification + (identifier) + (discrete_subtype_definition + (range_g + (name + (identifier)) + (tick) + (range_attribute_designator))))) + (sequence_of_statements + (statement + (simple_statement + (null_statement))))))) + (statement + (compound_statement + (loop_statement + (iteration_scheme + (loop_parameter_specification + (identifier) + (discrete_subtype_definition + (range_g + (name + (identifier)) + (tick) + (range_attribute_designator + (expression + (relation + (simple_expression + (term + (factor + (primary + (numeric_literal)))))))))))) + (sequence_of_statements + (statement + (simple_statement + (null_statement))))))))))))) diff --git a/corpus/statements.txt b/corpus/statements.txt index 630ca2d..a8d59e2 100644 --- a/corpus/statements.txt +++ b/corpus/statements.txt @@ -92,14 +92,14 @@ end P; (iterator_specification (identifier) (name - (attribute_reference - (name - (identifier) + (identifier) + (name + (attribute_reference (name - (identifier))) - (tick) - (attribute_designator - (identifier)))))) + (identifier)) + (tick) + (attribute_designator + (identifier))))))) (sequence_of_statements (statement (simple_statement diff --git a/grammar.js b/grammar.js index 016d9da..04f7183 100644 --- a/grammar.js +++ b/grammar.js @@ -105,6 +105,10 @@ module.exports = grammar({ // 'type' identifier 'is' 'new' subtype_indication . 'with' . [$.private_extension_declaration, $.derived_type_definition], + // subprogram_specification + // 'with' aspect_mark '=>' 'do' name '(' name . ')' + [$.primary, $.dispatching_operation_specifier], + [$.function_call, $.procedure_call_statement], [$.function_call, $.name], [$.selector_name, $.primary], @@ -418,13 +422,25 @@ module.exports = grammar({ $.delta_constraint, ), range_g: $ => choice( -// $.range_attribute_reference, + field('range_attribute_reference', seq( + $.name, + $.tick, + $.range_attribute_designator, + )), seq( $.simple_expression, '..', $.simple_expression, ), ), + range_attribute_designator: $ => seq( + reservedWord('range'), + optional(seq( + '(', + $.expression, + ')', + )), + ), range_constraint: $ => seq( reservedWord('range'), $.range_g, @@ -1561,12 +1577,50 @@ module.exports = grammar({ optional($.aspect_specification), ';', ), + formal_group_designator: $ => choice( + 'null', + 'all', + ), + extended_global_aspect_definition: $ => choice( + seq( + reservedWord('use'), + field('formal_parameter_designator', choice( + $.formal_group_designator, + $.name, + )), + ), + seq( + reservedWord('do'), + $.dispatching_operation_specifier, + ), + ), + disaptching_operation_set: $ => + comma_separated_list_of($.dispatching_operation_specifier), + dispatching_operation_specifier: $ => seq( + $.name, + '(', + $.name, + ')', + ), + extended_global_aspect_element: $ => choice( + seq( + reservedWord('use'), + field('formal_parameter_set', choice( + $.formal_group_designator, + comma_separated_list_of($.name), + )), + ), + seq( + reservedWord('do'), + comma_separated_list_of($.dispatching_operation_specifier), + ), + ), global_aspect_definition: $ => choice( seq( $.global_mode, // $.global_designator, ), -// $.extended_global_aspect_definition, + $.extended_global_aspect_definition, seq( '(', comma_separated_list_of($.global_aspect_element), @@ -1578,7 +1632,7 @@ module.exports = grammar({ $.global_mode, $.global_set, ), -// $.extended_global_aspect_definition, + $.extended_global_aspect_definition, ), global_mode: $ => choice( $.non_empty_mode,