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], [$.generic_package_declaration, $._package_declaration],
[$.attribute_definition_clause, $.attribute_reference], [$.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 . '=>' ... // 'for' name 'use' '(' name . '=>' ...
// The name could either be from a primary or a subtype_indication. // 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' // 'for' name 'use' '(' 'for' identifier 'in' name . 'use'
[$.iterator_specification, $.subtype_indication], [$.iterator_specification, $.subtype_indication],
], ],
rules: { rules: {
@ -575,7 +580,7 @@ module.exports = grammar({
seq( seq(
reservedWord('type'), reservedWord('type'),
$.identifier, $.identifier,
// optional($.known_discriminant_part), optional($.known_discriminant_part),
reservedWord('is'), reservedWord('is'),
$.type_definition, $.type_definition,
optional($.aspect_specification), optional($.aspect_specification),
@ -584,15 +589,34 @@ module.exports = grammar({
// $.task_type_declaration, // $.task_type_declaration,
// $.protected_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( 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,
// $.record_type_definition, $.record_type_definition,
// $.access_type_definition, // $.access_type_definition,
$.derived_type_definition, $.derived_type_definition,
// $.interface_type_definition, $.interface_type_definition,
), ),
array_type_definition: $ => choice( array_type_definition: $ => choice(
$.unconstrained_array_definition, $.unconstrained_array_definition,
@ -683,21 +707,44 @@ module.exports = grammar({
'..', '..',
$.simple_expression, $.simple_expression,
), ),
derived_type_definition: $ => prec.left(seq( derived_type_definition: $ => seq(
optional(reservedWord('abstract')), optional(reservedWord('abstract')),
optional(reservedWord('limited')), optional(reservedWord('limited')),
reservedWord('new'), reservedWord('new'),
$.subtype_indication, $.subtype_indication,
optional(seq( optional(seq(
// optional(seq( optional(seq(
// reservedWord('and'), reservedWord('and'),
// $.interface_list, $.interface_list,
// )), )),
$.record_extension_part, $.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( 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,
), ),
record_definition: $ => choice( record_definition: $ => choice(
@ -715,13 +762,16 @@ module.exports = grammar({
), ),
component_list: $ => choice( component_list: $ => choice(
repeat1($.component_item), repeat1($.component_item),
// seq( seq(
// optional($.component_item), optional($.component_item),
// $.variant_part, $.variant_part,
// ), ),
reservedWord('null'), seq(
reservedWord('null'),
reservedWord(';'),
),
), ),
component_item: $ => seq( component_item: $ => choice(
$.component_declaration, $.component_declaration,
$.aspect_clause, $.aspect_clause,
), ),
@ -740,8 +790,6 @@ module.exports = grammar({
// $.access_definition, // $.access_definition,
), ),
), ),
abstract_subprogram_declaration: $ => seq( abstract_subprogram_declaration: $ => seq(
optional($.overriding_indicator), optional($.overriding_indicator),
$.subprogram_specification, $.subprogram_specification,
@ -1134,6 +1182,7 @@ module.exports = grammar({
reservedWord('end'), reservedWord('end'),
reservedWord('record'), reservedWord('record'),
optional($.name), optional($.name),
';',
)), )),
renaming_declaration: $ => choice( renaming_declaration: $ => choice(
// $.object_renaming_declaration, // $.object_renaming_declaration,
@ -1194,5 +1243,21 @@ module.exports = grammar({
optional($.aspect_specification), 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,
),
} }
}); });