Support for enumerations

This commit is contained in:
Emmanuel Briot 2022-10-21 15:33:09 +02:00
parent cac7dd6bec
commit 1f837154de
2 changed files with 146 additions and 6 deletions

View File

@ -104,7 +104,7 @@ end P;
(identifier))))) (identifier)))))
================================================================================ ================================================================================
Fixed points Floats
================================================================================ ================================================================================
package P is package P is
@ -190,3 +190,69 @@ end P;
(numeric_literal)))))))))))) (numeric_literal))))))))))))
(name (name
(identifier))))) (identifier)))))
================================================================================
Enumerations
================================================================================
package P is
type E is (VAL1, VAL2);
for E use (VAL1 => 1, VAL2 => 2);
end P;
--------------------------------------------------------------------------------
(compilation
(compilation_unit
(package_specification
(name
(identifier))
(type_declaration
(full_type_declaration
(identifier)
(type_definition
(enumeration_type_definition
(identifier)
(identifier)))))
(aspect_clause
(enumeration_representation_clause
(name
(identifier))
(enumeration_aggregate
(array_aggregate
(named_array_aggregate
(array_component_association
(discrete_choice_list
(discrete_choice
(expression
(relation
(simple_expression
(term
(factor
(primary
(name
(identifier))))))))))
(assoc_expression
(expression
(relation
(simple_expression
(term
(factor
(primary
(numeric_literal)))))))))
(array_component_association
(discrete_choice_list
(discrete_choice
(subtype_indication
(name
(identifier)))))
(assoc_expression
(expression
(relation
(simple_expression
(term
(factor
(primary
(numeric_literal))))))))))))))
(name
(identifier)))))

View File

@ -64,6 +64,13 @@ module.exports = grammar({
[$.attribute_definition_clause, $.attribute_reference], [$.attribute_definition_clause, $.attribute_reference],
[$.record_extension_part, $.derived_type_definition], [$.record_extension_part, $.derived_type_definition],
// 'for' name 'use' '(' name . '=>' ...
// The name could either be from a primary or a subtype_indication.
[$.subtype_indication, $.primary],
// 'for' name 'use' '(' 'for' identifier 'in' name . 'use'
[$.iterator_specification, $.subtype_indication],
], ],
rules: { rules: {
@ -364,6 +371,9 @@ module.exports = grammar({
$.expression, $.expression,
';', ';',
), ),
expression_list: $ => prec.left(
comma_separated_list_of($.expression),
),
expression: $ => choice( expression: $ => choice(
$.relation, $.relation,
seq($.relation, $.AND_relation_list), seq($.relation, $.AND_relation_list),
@ -505,7 +515,7 @@ module.exports = grammar({
aggregate: $ => choice( aggregate: $ => choice(
$.record_aggregate, $.record_aggregate,
// $.extension_aggregate, // $.extension_aggregate,
// $.array_aggregate, $.array_aggregate,
// $.delta_aggregate, // $.delta_aggregate,
// seq( // seq(
// '(', // '(',
@ -575,7 +585,7 @@ module.exports = grammar({
// $.protected_type_declaration, // $.protected_type_declaration,
), ),
type_definition: $ => choice( type_definition: $ => choice(
// $.enumeration_type_definition, $.enumeration_type_definition,
$.integer_type_definition, $.integer_type_definition,
$.real_type_definition, $.real_type_definition,
// $.array_type_definition, // $.array_type_definition,
@ -584,6 +594,17 @@ module.exports = grammar({
$.derived_type_definition, $.derived_type_definition,
// $.interface_type_definition, // $.interface_type_definition,
), ),
enumeration_type_definition: $ => seq(
'(',
$._enumeration_literal_list,
')',
),
_enumeration_literal_list: $ =>
comma_separated_list_of($._enumeration_literal_specification),
_enumeration_literal_specification: $ => choice(
$.identifier,
$.character_literal,
),
integer_type_definition: $ => choice( integer_type_definition: $ => choice(
$.signed_integer_type_definition, $.signed_integer_type_definition,
$.modular_type_definition, $.modular_type_definition,
@ -697,9 +718,62 @@ module.exports = grammar({
';', ';',
), ),
array_aggregate: $ => choice( array_aggregate: $ => choice(
// $.position_array_aggregate, $.positional_array_aggregate,
// $.null_array_aggregate, $.null_array_aggregate,
// $.named_array_aggregate, $.named_array_aggregate,
),
positional_array_aggregate: $ => choice(
seq(
'(',
$.expression_list,
optional(seq(
',',
reservedWord('others'),
$.assoc_expression,
)),
')',
),
seq(
'[',
$.expression_list,
optional(seq(
',',
reservedWord('others'),
$.assoc_expression,
)),
']',
),
),
null_array_aggregate: $ => seq(
'[',
']',
),
named_array_aggregate: $ => choice(
seq(
'(',
$._array_component_association_list,
')',
),
seq(
'[',
$._array_component_association_list,
']',
),
),
_array_component_association_list: $ =>
comma_separated_list_of($.array_component_association),
array_component_association: $ => choice(
seq(
$.discrete_choice_list,
$.assoc_expression,
),
$.iterated_element_association,
),
discrete_choice_list: $ => list_of('|', $.discrete_choice),
discrete_choice: $ => choice(
$.expression,
$.subtype_indication,
$.range_g,
), ),
aspect_association: $ => seq( aspect_association: $ => seq(
$.aspect_mark, $.aspect_mark,