Support for record types

This commit is contained in:
Emmanuel Briot 2022-10-21 17:12:31 +02:00
parent 160d197c59
commit 5e5c9f5bc6
2 changed files with 416 additions and 19 deletions

332
corpus/records.txt Normal file
View File

@ -0,0 +1,332 @@
================================================================================
null record
================================================================================
package P is
type R is null record;
end;
--------------------------------------------------------------------------------
(compilation
(compilation_unit
(package_specification
(name
(identifier))
(type_declaration
(full_type_declaration
(identifier)
(type_definition
(record_type_definition
(record_definition))))))))
================================================================================
records
================================================================================
package P is
type R2 is record
A : Integer;
-- B : Integer range 0 .. 2;
-- null;
end record;
for R2 use record
A at 0 range 0 .. 31;
end record;
end;
--------------------------------------------------------------------------------
(compilation
(compilation_unit
(package_specification
(name
(identifier))
(type_declaration
(full_type_declaration
(identifier)
(type_definition
(record_type_definition
(record_definition
(component_list
(component_item
(component_declaration
(defining_identifier_list
(identifier))
(component_definition
(subtype_indication
(name
(identifier)))))))
(comment)
(comment))))))
(aspect_clause
(record_representation_clause
(name
(identifier))
(component_clause
(name
(identifier))
(expression
(relation
(simple_expression
(term
(factor
(primary
(numeric_literal)))))))
(simple_expression
(term
(factor
(primary
(numeric_literal)))))
(simple_expression
(term
(factor
(primary
(numeric_literal)))))))))))
================================================================================
Multiple fields on one line
================================================================================
package P is
type R is record
A, B : Integer;
end record;
end;
--------------------------------------------------------------------------------
(compilation
(compilation_unit
(package_specification
(name
(identifier))
(type_declaration
(full_type_declaration
(identifier)
(type_definition
(record_type_definition
(record_definition
(component_list
(component_item
(component_declaration
(defining_identifier_list
(identifier)
(identifier))
(component_definition
(subtype_indication
(name
(identifier)))))))))))))))
================================================================================
Discriminated
================================================================================
package P is
type R (A : Integer; B : Integer) is record
F : Float;
end record;
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)))
(discriminant_specification
(defining_identifier_list
(identifier))
(name
(identifier)))))
(type_definition
(record_type_definition
(record_definition
(component_list
(component_item
(component_declaration
(defining_identifier_list
(identifier))
(component_definition
(subtype_indication
(name
(identifier)))))))))))))))
================================================================================
tagged
================================================================================
package P is
type T is abstract tagged limited null record;
type T2 is new T with record
F : Integer;
end record;
end;
--------------------------------------------------------------------------------
(compilation
(compilation_unit
(package_specification
(name
(identifier))
(type_declaration
(full_type_declaration
(identifier)
(type_definition
(record_type_definition
(record_definition)))))
(type_declaration
(full_type_declaration
(identifier)
(type_definition
(derived_type_definition
(subtype_indication
(name
(identifier)))
(record_extension_part
(record_definition
(component_list
(component_item
(component_declaration
(defining_identifier_list
(identifier))
(component_definition
(subtype_indication
(name
(identifier))))))))))))))))
================================================================================
Variant
================================================================================
package P is
type R (A : Integer) is record
case A is
when 0 | 1 .. 2 =>
B : Integer;
when others =>
null;
end case;
end record;
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
(subtype_indication
(name
(identifier)))))
(component_list)))))))))))))
================================================================================
interface
================================================================================
package P is
type R is interface;
type R2 is interface and Intf1;
type R3 is new Root and R with null record;
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)))))))))

View File

@ -62,7 +62,11 @@ module.exports = grammar({
[$.generic_package_declaration, $._package_declaration],
[$.attribute_definition_clause, $.attribute_reference],
[$.record_extension_part, $.derived_type_definition],
// 'type' identifier 'is' 'new' subtype_indication . 'with'
// which could be either a record_extension_part or
// an aspect_specification.
[$.derived_type_definition],
// 'for' name 'use' '(' name . '=>' ...
// The name could either be from a primary or a subtype_indication.
@ -71,6 +75,7 @@ module.exports = grammar({
// 'for' name 'use' '(' 'for' identifier 'in' name . 'use'
[$.iterator_specification, $.subtype_indication],
],
rules: {
@ -575,7 +580,7 @@ module.exports = grammar({
seq(
reservedWord('type'),
$.identifier,
// optional($.known_discriminant_part),
optional($.known_discriminant_part),
reservedWord('is'),
$.type_definition,
optional($.aspect_specification),
@ -584,15 +589,34 @@ module.exports = grammar({
// $.task_type_declaration,
// $.protected_type_declaration,
),
known_discriminant_part: $ => seq(
'(',
$.discriminant_specification_list,
')',
),
discriminant_specification_list: $ =>
list_of(';', $.discriminant_specification),
discriminant_specification: $ => seq(
$.defining_identifier_list,
':',
choice(
seq(
optional($.null_exclusion),
$.name,
),
$.access_definition,
),
optional($.assign_value),
),
type_definition: $ => choice(
$.enumeration_type_definition,
$.integer_type_definition,
$.real_type_definition,
$.array_type_definition,
// $.record_type_definition,
$.record_type_definition,
// $.access_type_definition,
$.derived_type_definition,
// $.interface_type_definition,
$.interface_type_definition,
),
array_type_definition: $ => choice(
$.unconstrained_array_definition,
@ -683,21 +707,44 @@ module.exports = grammar({
'..',
$.simple_expression,
),
derived_type_definition: $ => prec.left(seq(
derived_type_definition: $ => seq(
optional(reservedWord('abstract')),
optional(reservedWord('limited')),
reservedWord('new'),
$.subtype_indication,
optional(seq(
// optional(seq(
// reservedWord('and'),
// $.interface_list,
// )),
optional(seq(
reservedWord('and'),
$.interface_list,
)),
$.record_extension_part,
)),
),
interface_type_definition: $ => seq(
optional(choice(
reservedWord('limited'),
reservedWord('task'),
reservedWord('protected'),
reservedWord('synchronized'),
)),
reservedWord('interface'),
optional(seq(
reservedWord('and'),
$.interface_list,
)),
),
interface_list: $ =>
list_of(reservedWord('and'), $.name),
record_extension_part: $ => seq(
reservedWord('with'),
reservedWord('with'), // record_extension_part in Ada grammar
$.record_definition,
),
record_type_definition: $ => seq(
optional(seq(
optional(reservedWord('abstract')),
reservedWord('tagged'),
)),
optional(reservedWord('limited')),
$.record_definition,
),
record_definition: $ => choice(
@ -715,13 +762,16 @@ module.exports = grammar({
),
component_list: $ => choice(
repeat1($.component_item),
// seq(
// optional($.component_item),
// $.variant_part,
// ),
reservedWord('null'),
seq(
optional($.component_item),
$.variant_part,
),
component_item: $ => seq(
seq(
reservedWord('null'),
reservedWord(';'),
),
),
component_item: $ => choice(
$.component_declaration,
$.aspect_clause,
),
@ -740,8 +790,6 @@ module.exports = grammar({
// $.access_definition,
),
),
abstract_subprogram_declaration: $ => seq(
optional($.overriding_indicator),
$.subprogram_specification,
@ -1134,6 +1182,7 @@ module.exports = grammar({
reservedWord('end'),
reservedWord('record'),
optional($.name),
';',
)),
renaming_declaration: $ => choice(
// $.object_renaming_declaration,
@ -1194,5 +1243,21 @@ module.exports = grammar({
optional($.aspect_specification),
';',
),
variant_part: $ => seq(
reservedWord('case'),
$._direct_name,
reservedWord('is'),
$.variant_list,
reservedWord('end'),
reservedWord('case'),
';',
),
variant_list: $ => repeat1($.variant),
variant: $ => seq(
reservedWord('when'),
$.discrete_choice_list,
'=>',
$.component_list,
),
}
});