Range attribute

This commit is contained in:
Emmanuel Briot 2022-10-25 09:24:41 +02:00
parent 434dc1a695
commit 464ba8c3da
3 changed files with 153 additions and 10 deletions

89
corpus/attributes.txt Normal file
View File

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

View File

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

View File

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