Change definition of name_list and defining_identifier_list

This solves conflicts
This commit is contained in:
Emmanuel Briot 2022-10-21 14:30:34 +02:00
parent 51a69f0fb4
commit 8f3c5919a7
3 changed files with 200 additions and 239 deletions

View File

@ -15,50 +15,35 @@ use Ada.Text_IO, System;
(with_clause
(name_list
(name
(selected_component
(name
(direct_name
(identifier)))
(selector_name
(direct_name
(identifier)))))
(identifier)
(identifier))
(name
(direct_name
(identifier))))))
(identifier)))))
(comment)
(compilation_unit
(with_clause
(name_list
(name
(direct_name
(identifier))))))
(identifier)))))
(comment)
(compilation_unit
(with_clause
(name_list
(name
(direct_name
(identifier))))))
(identifier)))))
(compilation_unit
(with_clause
(name_list
(name
(direct_name
(identifier))))))
(identifier)))))
(compilation_unit
(use_clause
(name_list
(name
(selected_component
(name
(direct_name
(identifier)))
(selector_name
(direct_name
(identifier)))))
(identifier)
(identifier))
(name
(direct_name
(identifier)))))))
(identifier))))))
=====
Case insensitive
@ -72,7 +57,8 @@ enD;
(compilation
(compilation_unit
(package_specification
(name))))
(name
(identifier)))))
================================================================================
multiple compilation units
@ -93,28 +79,19 @@ end;
(compilation_unit
(package_specification
(name
(direct_name
(identifier)))
(identifier))
(package_specification
(name
(direct_name
(identifier)))
(identifier))
(name
(direct_name
(identifier))))
(identifier)))
(name
(direct_name
(identifier)))))
(identifier))))
(compilation_unit
(package_specification
(name
(selected_component
(name
(direct_name
(identifier)))
(selector_name
(direct_name
(identifier)))))
(identifier)
(identifier))
(comment))))
=========
@ -136,41 +113,29 @@ end Child.P2;
(proper_body
(package_body
(name
(selected_component
(name
(direct_name
(identifier)))
(selector_name
(direct_name
(identifier)))))
(identifier)
(identifier))
(non_empty_declarative_part
(declarative_item_pragma
(proper_body
(package_body
(name
(direct_name
(identifier)))
(identifier))
(handled_sequence_of_statements
(sequence_of_statements
(statement
(simple_statement
(null_statement)))))
(name
(direct_name
(identifier)))))))
(identifier))))))
(handled_sequence_of_statements
(sequence_of_statements
(statement
(simple_statement
(null_statement)))))
(name
(selected_component
(name
(direct_name
(identifier)))
(selector_name
(direct_name
(identifier)))))))))
(identifier)
(identifier))))))
================================================================================
separate
@ -185,10 +150,8 @@ end;
(compilation_unit
(subunit
(name
(direct_name
(identifier)))
(identifier))
(proper_body
(package_body
(name
(direct_name
(identifier))))))))
(identifier)))))))

View File

@ -12,8 +12,7 @@ end P;
(compilation_unit
(package_specification
(name
(direct_name
(identifier)))
(identifier))
(type_declaration
(full_type_declaration
(identifier)
@ -31,8 +30,7 @@ end P;
(primary
(numeric_literal))))))))))
(name
(direct_name
(identifier))))))
(identifier)))))
================================================================================
Derived type
@ -48,8 +46,7 @@ end P;
(compilation_unit
(package_specification
(name
(direct_name
(identifier)))
(identifier))
(type_declaration
(full_type_declaration
(identifier)
@ -57,8 +54,6 @@ end P;
(derived_type_definition
(subtype_indication
(name
(direct_name
(identifier))))))))
(identifier)))))))
(name
(direct_name
(identifier))))))
(identifier)))))

View File

@ -1,18 +1,15 @@
function toCaseInsensitive(a) {
var ca = a.charCodeAt(0);
if (ca>=97 && ca<=122) return `[${a}${a.toUpperCase()}]`;
if (ca>=65 && ca<= 90) return `[${a.toLowerCase()}${a}]`;
return a;
}
function caseInsensitive(keyword) {
//return keyword; // Easier to read conflict messages
return new RegExp(keyword
.split('')
.map(toCaseInsensitive)
.join('')
)
}
/**
* A case-insensitive keyword (copied from VHDL grammar)
*/
const reservedWord = word =>
// word || // when debugging conflict error msgs
alias(reserved(caseInsensitive(word)), word)
;
const reserved = regex => token(prec(2, new RegExp(regex)));
const caseInsensitive = word =>
word.split('')
.map(letter => `[${letter}${letter.toUpperCase()}]`)
.join('');
/**
* A list of rules
@ -42,13 +39,9 @@ module.exports = grammar({
$.comment,
],
// word: $ => $.keyword,
word: $ => $.identifier,
conflicts: $ => [
// "name" can be either a simple name, or a defining_identifier_list
// [$.direct_name, $.defining_identifier_list],
// "function_specification is" could be either an expression function
// specification, or a function specification
// ??? Maybe we can merge both in the grammar
@ -57,7 +50,7 @@ module.exports = grammar({
// ??? Maybe we can merge these
[$.null_procedure_declaration, $.subprogram_specification],
// "'for' direct_name * 'use'" could also be "'for' name * 'use'" as
// "'for' _direct_name * 'use'" could also be "'for' name * 'use'" as
// specified in at_clause.
[$.at_clause, $.name],
@ -78,7 +71,6 @@ module.exports = grammar({
$.compilation_unit,
),
keyword: $ => /[a-zA-Z]+/,
identifier: $ =>
/[a-zA-Z\u{80}-\u{10FFFF}][0-9a-zA-Z_\u{80}-\u{10FFFF}]*/u,
comment: $ => token(seq('--', /.*/)),
@ -86,8 +78,7 @@ module.exports = grammar({
character_literal: $ => token(/'.'/),
numeric_literal: $ => token(
choice(
/[0-9]/,
/[0-9_]+(\.[0-9]+)?([eE][0-9_-]+)?/,
/[0-9][0-9_]*(\.[0-9]+)?([eE][0-9_-]+)?/,
/[0-9]+#[0-9a-fA-F._-]+#/
)
),
@ -99,26 +90,37 @@ module.exports = grammar({
'\'', // But is not the start of a character_literal
),
name_list: $ => comma_separated_list_of($.name),
name: $ => choice(
$.direct_name,
$.explicit_dereference,
$.selected_component,
$.attribute_reference,
$.function_call,
$.character_literal,
$.qualified_expression,
'@',
),
defining_identifier_list: $ => comma_separated_list_of($.identifier),
direct_name: $ => choice(
// Simpler definition for games than the standard grammer
// name: $ => choice(
// $._direct_name,
// $.explicit_dereference,
// $.selected_component,
// $.attribute_reference,
// $.function_call,
// $.character_literal,
// $.qualified_expression,
// '@',
// ),
// _direct_name: $ => choice(
// $.identifier,
// $.string_literal,
// ),
_direct_name: $ => $.identifier,
name: $ => seq(
$.identifier,
$.string_literal,
repeat(seq(
'.',
$.identifier,
)),
),
name_list: $ => comma_separated_list_of($.name),
defining_identifier_list: $ => comma_separated_list_of($.identifier),
explicit_dereference: $ => seq(
$.name,
'.',
caseInsensitive('all'),
reservedWord('all'),
),
selected_component: $ => seq(
$.name,
@ -126,9 +128,9 @@ module.exports = grammar({
$.selector_name,
),
selector_name: $ => choice(
$.direct_name,
$._direct_name,
$.character_literal,
caseInsensitive('others'),
reservedWord('others'),
),
attribute_reference: $ => choice(
seq(
@ -157,7 +159,7 @@ module.exports = grammar({
// value_sequence: $ => seq(
// '[',
// optional(seq(
// field('is_parallel', caseInsensitive('parallel')),
// field('is_parallel', reservedWord('parallel')),
// optional(seq(
// '(',
// $.chunk_specification,
@ -171,18 +173,18 @@ module.exports = grammar({
$.simple_expression,
seq(
$.identifier,
caseInsensitive('in'),
reservedWord('in'),
$.discrete_subtype_definition,
),
),
iterated_element_association: $ => seq(
caseInsensitive('for'),
reservedWord('for'),
choice(
$.loop_parameter_specification,
$.iterator_specification,
),
optional(seq(
caseInsensitive('use'),
reservedWord('use'),
$.expression,
)),
$.assoc_expression,
@ -193,8 +195,8 @@ module.exports = grammar({
),
loop_parameter_specification: $ => seq(
$.identifier,
caseInsensitive('in'),
optional(caseInsensitive('reverse')),
reservedWord('in'),
optional(reservedWord('reverse')),
$.discrete_subtype_definition,
optional($.iterator_filter),
),
@ -203,7 +205,7 @@ module.exports = grammar({
$.access_definition,
),
iterator_filter: $ => seq(
caseInsensitive('when'),
reservedWord('when'),
$.condition,
),
iterator_specification: $ => seq(
@ -213,19 +215,19 @@ module.exports = grammar({
$.loop_parameter_subtype_indication,
)),
choice(
caseInsensitive('in'),
caseInsensitive('of'),
reservedWord('in'),
reservedWord('of'),
),
optional(caseInsensitive('reverse')),
optional(reservedWord('reverse')),
$.name,
optional($.iterator_filter),
),
attribute_designator: $ => choice(
$.identifier,
caseInsensitive('access'),
caseInsensitive('delta'),
caseInsensitive('digits'),
caseInsensitive('mod'),
reservedWord('access'),
reservedWord('delta'),
reservedWord('digits'),
reservedWord('mod'),
),
function_call: $ => seq(
$.name,
@ -239,7 +241,7 @@ module.exports = grammar({
compilation_unit: $ => choice(
$.with_clause,
seq(
optional(caseInsensitive('private')),
optional(reservedWord('private')),
$._declarative_item,
),
$.statement,
@ -276,38 +278,38 @@ module.exports = grammar({
';',
),
package_specification: $ => seq(
caseInsensitive('package'),
field('name', $.name), // $.defining_program_unit_name),
reservedWord('package'),
field('name', $.name),
optional($.aspect_specification),
caseInsensitive('is'),
reservedWord('is'),
optional($._basic_declarative_item_list),
optional(seq(
caseInsensitive('private'),
reservedWord('private'),
optional($._basic_declarative_item_list),
)),
caseInsensitive('end'),
reservedWord('end'),
field('endname', optional($.name)),
),
with_clause: $ => seq(
field('is_limited', optional(caseInsensitive('limited'))),
field('is_private', optional(caseInsensitive('private'))),
caseInsensitive('with'),
field('is_limited', optional(reservedWord('limited'))),
field('is_private', optional(reservedWord('private'))),
reservedWord('with'),
field('names', $.name_list),
';',
),
use_clause: $ => seq(
caseInsensitive('use'),
reservedWord('use'),
optional(seq(
field('is_all', optional(caseInsensitive('all'))),
field('is_type', caseInsensitive('type')),
field('is_all', optional(reservedWord('all'))),
field('is_type', reservedWord('type')),
)),
$.name_list,
';',
),
subunit: $ => seq(
caseInsensitive('separate'),
subunit: $ => seq( // 10.1.3
reservedWord('separate'),
'(',
$.name,
field('parent_unit_name', $.name),
')',
$.proper_body,
),
@ -318,17 +320,17 @@ module.exports = grammar({
// $.protected_body,
),
package_body: $ => seq(
caseInsensitive('package'),
caseInsensitive('body'),
reservedWord('package'),
reservedWord('body'),
$.name,
optional($.aspect_specification),
caseInsensitive('is'),
reservedWord('is'),
optional($.non_empty_declarative_part),
optional(seq(
caseInsensitive('begin'),
reservedWord('begin'),
$.handled_sequence_of_statements,
)),
caseInsensitive('end'),
reservedWord('end'),
optional($.name),
';',
),
@ -355,7 +357,7 @@ module.exports = grammar({
),
),
range_constraint: $ => seq(
caseInsensitive('range'),
reservedWord('range'),
$.range_g,
),
condition: $ => seq(
@ -378,25 +380,25 @@ module.exports = grammar({
),
),
AND_relation_list: $ => repeat1(seq(
caseInsensitive('and'),
reservedWord('and'),
$.relation,
)),
AND_THEN_relation_list: $ => repeat1(seq(
caseInsensitive('and'),
caseInsensitive('then'),
reservedWord('and'),
reservedWord('then'),
$.relation,
)),
OR_relation_list: $ => repeat1(seq(
caseInsensitive('or'),
reservedWord('or'),
$.relation,
)),
OR_ELSE_relation_list: $ => repeat1(seq(
caseInsensitive('or'),
caseInsensitive('else'),
reservedWord('or'),
reservedWord('else'),
$.relation,
)),
XOR_relation_list: $ => repeat1(seq(
caseInsensitive('xor'),
reservedWord('xor'),
$.relation,
)),
relation: $ => choice(
@ -409,8 +411,8 @@ module.exports = grammar({
),
// seq(
// $.simple_expression,
// optional(caseInsensitive('not')),
// caseInsensitive('in'),
// optional(reservedWord('not')),
// reservedWord('in'),
// $.membership_choice_list,
// ),
// $.raise_expression,
@ -439,37 +441,37 @@ module.exports = grammar({
)),
),
seq(
caseInsensitive('abs'),
reservedWord('abs'),
$.primary,
),
seq(
caseInsensitive('not'),
reservedWord('not'),
$.primary,
),
),
primary: $ => choice(
$.numeric_literal,
caseInsensitive('null'),
reservedWord('null'),
$.aggregate,
$.name,
// $.allocator,
),
access_definition: $ => seq(
optional($.null_exclusion),
caseInsensitive('access'),
reservedWord('access'),
choice(
seq(
optional(caseInsensitive('constant')),
optional(reservedWord('constant')),
$.name,
),
seq(
optional(caseInsensitive('protected')),
caseInsensitive('procedure'),
optional(reservedWord('protected')),
reservedWord('procedure'),
optional($.non_empty_parameter_profile),
),
seq(
optional(caseInsensitive('protected')),
caseInsensitive('function'),
optional(reservedWord('protected')),
reservedWord('function'),
$.parameter_and_result_profile,
),
),
@ -523,13 +525,13 @@ module.exports = grammar({
record_component_association_list: $ => choice(
// comma_separated_list_of($.record_component_association),
seq(
caseInsensitive('null'),
caseInsensitive('record'),
reservedWord('null'),
reservedWord('record'),
),
),
null_exclusion: $ => seq(
caseInsensitive('not'),
caseInsensitive('null'),
reservedWord('not'),
reservedWord('null'),
),
index_constraint: $ => seq(
'(',
@ -537,12 +539,12 @@ module.exports = grammar({
')',
),
digits_constraint: $ => seq(
caseInsensitive('digits'),
reservedWord('digits'),
$.simple_expression,
optional($.range_constraint),
),
delta_constraint: $ => seq(
caseInsensitive('delta'),
reservedWord('delta'),
$.simple_expression,
optional($.range_constraint),
),
@ -561,10 +563,10 @@ module.exports = grammar({
),
full_type_declaration: $ => choice(
seq(
caseInsensitive('type'),
reservedWord('type'),
$.identifier,
// optional($.known_discriminant_part),
caseInsensitive('is'),
reservedWord('is'),
$.type_definition,
// optional($.aspect_specification),
';',
@ -587,39 +589,39 @@ module.exports = grammar({
// $.modular_type_definition,
),
signed_integer_type_definition: $ => seq(
caseInsensitive('range'),
reservedWord('range'),
$.simple_expression,
'..',
$.simple_expression,
),
derived_type_definition: $ => seq(
optional(caseInsensitive('abstract')),
optional(caseInsensitive('limited')),
caseInsensitive('new'),
optional(reservedWord('abstract')),
optional(reservedWord('limited')),
reservedWord('new'),
$.subtype_indication,
optional(seq(
// optional(seq(
// caseInsensitive('and'),
// reservedWord('and'),
// $.interface_list,
// )),
$.record_extension_part,
)),
),
record_extension_part: $ => seq(
caseInsensitive('with'),
reservedWord('with'),
$.record_definition,
),
record_definition: $ => choice(
seq(
caseInsensitive('record'),
reservedWord('record'),
$.component_list,
caseInsensitive('end'),
caseInsensitive('record'),
reservedWord('end'),
reservedWord('record'),
optional($.identifier),
),
seq(
caseInsensitive('null'),
caseInsensitive('record'),
reservedWord('null'),
reservedWord('record'),
),
),
component_list: $ => choice(
@ -628,7 +630,7 @@ module.exports = grammar({
// optional($.component_item),
// $.variant_part,
// ),
caseInsensitive('null'),
reservedWord('null'),
),
component_item: $ => seq(
$.component_declaration,
@ -643,7 +645,7 @@ module.exports = grammar({
';'
),
component_definition: $ => seq(
optional(caseInsensitive('aliased')),
optional(reservedWord('aliased')),
choice(
$.subtype_indication,
// $.access_definition,
@ -654,8 +656,8 @@ module.exports = grammar({
abstract_subprogram_declaration: $ => seq(
optional($.overriding_indicator),
$.subprogram_specification,
caseInsensitive('is'),
caseInsensitive('abstract'),
reservedWord('is'),
reservedWord('abstract'),
$.aspect_specification,
';',
),
@ -690,23 +692,24 @@ module.exports = grammar({
),
aspect_mark_list: $ => comma_separated_list_of($.aspect_association),
aspect_specification: $ => seq(
caseInsensitive('with'),
reservedWord('with'),
$.aspect_mark_list,
),
at_clause: $ => seq(
caseInsensitive('for'),
$.direct_name,
caseInsensitive('use'),
caseInsensitive('at'),
reservedWord('for'),
$.identifier,
// $._direct_name,
reservedWord('use'),
reservedWord('at'),
$.expression,
';',
),
attribute_definition_clause: $ => seq(
caseInsensitive('for'),
reservedWord('for'),
$.name,
$.tick,
$.attribute_designator,
caseInsensitive('use'),
reservedWord('use'),
$.expression,
';',
),
@ -719,9 +722,9 @@ module.exports = grammar({
choice_parameter_specification: $ => $.identifier, // ??? inline
component_clause: $ => seq(
$.name,
caseInsensitive('at'),
reservedWord('at'),
field('position', $.expression),
caseInsensitive('range'),
reservedWord('range'),
field('first_bit', $.simple_expression),
'..',
field('last_bit', $.simple_expression),
@ -736,7 +739,7 @@ module.exports = grammar({
),
entry_declaration: $ => seq(
optional($.overriding_indicator),
caseInsensitive('entry'),
reservedWord('entry'),
$.identifier,
optional(seq(
'(',
@ -749,26 +752,26 @@ module.exports = grammar({
),
enumeration_aggregate: $ => $.array_aggregate, // ??? inline
enumeration_representation_clause: $ => seq(
caseInsensitive('for'),
reservedWord('for'),
$.name,
caseInsensitive('use'),
reservedWord('use'),
$.enumeration_aggregate,
';',
),
exception_choice_list: $ => list_of('|', $.exception_choice),
exception_choice: $ => choice(
$.name,
caseInsensitive('others'),
reservedWord('others'),
),
exception_declaration: $ => seq(
$.defining_identifier_list,
':',
caseInsensitive('exception'),
reservedWord('exception'),
optional($.aspect_specification),
';',
),
exception_handler: $ => seq(
caseInsensitive('when'),
reservedWord('when'),
optional(seq(
$.choice_parameter_specification,
':',
@ -784,7 +787,7 @@ module.exports = grammar({
expression_function_declaration: $ => seq(
optional($.overriding_indicator),
$.function_specification,
caseInsensitive('is'),
reservedWord('is'),
'(',
$.expression,
')',
@ -797,7 +800,7 @@ module.exports = grammar({
')',
),
function_specification: $ => seq(
caseInsensitive('function'),
reservedWord('function'),
$.name,
$.parameter_and_result_profile,
),
@ -806,7 +809,7 @@ module.exports = grammar({
$.generic_package_declaration,
),
generic_formal_part: $ => seq(
caseInsensitive('generic'),
reservedWord('generic'),
repeat($.generic_formal_parameter_declaration),
),
generic_formal_parameter_declaration: $ => choice(
@ -830,18 +833,18 @@ module.exports = grammar({
),
generic_instantiation: $ => seq(
choice(
caseInsensitive('package'),
reservedWord('package'),
seq(
optional($.overriding_indicator),
choice(
caseInsensitive('procedure'),
caseInsensitive('function'),
reservedWord('procedure'),
reservedWord('function'),
),
),
),
$.name,
caseInsensitive('is'),
caseInsensitive('new'),
reservedWord('is'),
reservedWord('new'),
$.name, // includes the generic_actual_part
optional($.aspect_specification),
';',
@ -867,7 +870,7 @@ module.exports = grammar({
),
global_mode: $ => choice(
$.non_empty_mode,
caseInsensitive('overriding'),
reservedWord('overriding'),
),
global_set: $ => prec.left(
comma_separated_list_of($.name), // ??? name_list
@ -875,44 +878,44 @@ module.exports = grammar({
handled_sequence_of_statements: $ => seq(
$.sequence_of_statements,
optional(seq(
caseInsensitive('exception'),
reservedWord('exception'),
$.exception_handler_list,
)),
),
label: $ => seq(
'<<',
field('statement_identifier', $.direct_name),
field('statement_identifier', $._direct_name),
'>>',
),
mod_clause: $ => seq(
caseInsensitive('at'),
caseInsensitive('mod'),
reservedWord('at'),
reservedWord('mod'),
$.expression,
';',
),
non_empty_mode: $ => choice(
caseInsensitive('in'),
reservedWord('in'),
seq(
caseInsensitive('in'),
caseInsensitive('out'),
reservedWord('in'),
reservedWord('out'),
),
caseInsensitive('out'),
reservedWord('out'),
),
null_procedure_declaration: $ => seq(
optional($.overriding_indicator),
$.procedure_specification,
caseInsensitive('is'),
caseInsensitive('null'),
reservedWord('is'),
reservedWord('null'),
// optional($.aspect_specification),
),
null_statement: $ => seq(
caseInsensitive('null'),
reservedWord('null'),
';',
),
number_declaration: $ => seq(
$.defining_identifier_list,
';',
caseInsensitive('constant'),
reservedWord('constant'),
// $.assign_value,
';',
),
@ -920,8 +923,8 @@ module.exports = grammar({
seq(
$.defining_identifier_list,
':',
caseInsensitive('aliased'),
caseInsensitive('constant'),
reservedWord('aliased'),
reservedWord('constant'),
choice(
$.subtype_indication,
$.access_definition,
@ -935,8 +938,8 @@ module.exports = grammar({
// $.single_protected_declaration,
),
overriding_indicator: $ => seq(
optional(caseInsensitive('not')),
caseInsensitive('overriding'),
optional(reservedWord('not')),
reservedWord('overriding'),
),
non_empty_parameter_profile: $ => // ??? inline
$.formal_part,
@ -947,7 +950,7 @@ module.exports = grammar({
parameter_specification: $ => seq(
$.defining_identifier_list,
':',
optional(caseInsensitive('aliased')),
optional(reservedWord('aliased')),
optional($.non_empty_mode),
optional($.null_exclusion),
$.name,
@ -958,7 +961,7 @@ module.exports = grammar({
$.parameter_specification,
),
pragma_g: $ => seq(
caseInsensitive('pragma'),
reservedWord('pragma'),
$.identifier,
optional(seq(
'(',
@ -971,19 +974,19 @@ module.exports = grammar({
';'
),
procedure_specification: $ => seq(
caseInsensitive('procedure'),
reservedWord('procedure'),
$.name,
optional($.non_empty_parameter_profile),
),
record_representation_clause: $ => prec.left(seq(
caseInsensitive('for'),
reservedWord('for'),
$.name,
caseInsensitive('use'),
caseInsensitive('record'),
reservedWord('use'),
reservedWord('record'),
optional($.mod_clause),
repeat($.component_clause),
caseInsensitive('end'),
caseInsensitive('record'),
reservedWord('end'),
reservedWord('record'),
optional($.name),
)),
renaming_declaration: $ => choice(
@ -994,7 +997,7 @@ module.exports = grammar({
// $.generic_renaming_declaration,
),
result_profile: $ => seq(
caseInsensitive('return'),
reservedWord('return'),
choice(
seq(
optional($.null_exclusion),
@ -1038,9 +1041,9 @@ module.exports = grammar({
$.function_specification,
),
subtype_declaration: $ => seq(
caseInsensitive('subtype'),
reservedWord('subtype'),
$.identifier,
caseInsensitive('is'),
reservedWord('is'),
$.subtype_indication,
optional($.aspect_specification),
';',