Add support for "or terminate" in select statements

This commit is contained in:
Emmanuel Briot 2022-12-12 11:27:49 +01:00
parent d6ea15a3e0
commit d52ba823fa
6 changed files with 30947 additions and 30388 deletions

View File

@ -579,7 +579,7 @@ module.exports = grammar({
),
),
),
actual_parameter_part: $ => seq(
actual_parameter_part: $ => seq( // ARM 6.4
'(',
choice(
comma_separated_list_of($.parameter_association),
@ -1355,7 +1355,7 @@ module.exports = grammar({
$.exception_handler,
$.pragma_g,
)),
formal_part: $ => seq(
formal_part: $ => seq( // ARM 6.1
'(',
$._parameter_specification_list,
')',
@ -1945,15 +1945,10 @@ module.exports = grammar({
$.access_definition,
),
),
// In general, we do not need a separate node in the tree for the
// sequence of statements, except when queries might make use of that.
_sequence_of_statements: $ => prec.left(seq(
repeat1($.statement),
repeat($.label),
)),
// sequence_of_statements_as_node: $ => $.sequence_of_statements,
_simple_statement: $ => choice(
$.null_statement,
$.assignment_statement,
@ -2041,24 +2036,36 @@ module.exports = grammar({
field('condition', $.expression),
'=>',
),
_guard_select: $ => seq(
$.guard,
$._select_alternative,
select_alternative: $ => choice( // ARM 9.7.1
$.accept_alternative,
$.delay_alternative,
$.terminate_alternative,
),
_select_alternative: $ => seq(
accept_alternative: $ => seq( // ARM 9.7.1
$.accept_statement,
optional($._sequence_of_statements),
),
selective_accept: $ => seq(
delay_alternative: $ => seq( // ARM 9.7.1
$._delay_statement,
optional($._sequence_of_statements),
),
terminate_alternative: $ => seq( // ARM 9.7.1
reservedWord("terminate"),
';',
),
selective_accept: $ => seq( // ARM 9.7.1
reservedWord('select'),
list_of(reservedWord('or'), $._guard_select),
list_of(reservedWord('or'), seq(
optional($.guard),
$.select_alternative,
)),
optional(seq(
reservedWord('else'),
$._sequence_of_statements,
)),
reservedWord('end'),
reservedWord('select'),
reservedWord(';'),
';',
),
abort_statement: $ => seq(
reservedWord('abort'),
@ -2074,20 +2081,20 @@ module.exports = grammar({
)),
';',
),
accept_statement: $ => seq(
accept_statement: $ => seq( // ARM 9.5.2
reservedWord('accept'),
$.identifier,
field('entry_direct_name', $.identifier),
optional(seq(
'(',
field('entry_index', $.expression),
')',
)),
field('parameter_profile', optional($.formal_part)),
optional(field('parameter_profile', $.formal_part)),
optional(seq(
reservedWord('do'),
$.handled_sequence_of_statements,
reservedWord('end'),
optional($.identifier),
optional(field('entry_identifier', $.identifier)),
)),
';',
),

View File

@ -25,6 +25,7 @@
"out"
"pragma"
"renames"
"terminate"
"when"
] @keyword
[

View File

@ -12604,20 +12604,24 @@
}
]
},
"_guard_select": {
"type": "SEQ",
"select_alternative": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "guard"
"name": "accept_alternative"
},
{
"type": "SYMBOL",
"name": "_select_alternative"
"name": "delay_alternative"
},
{
"type": "SYMBOL",
"name": "terminate_alternative"
}
]
},
"_select_alternative": {
"accept_alternative": {
"type": "SEQ",
"members": [
{
@ -12638,6 +12642,31 @@
}
]
},
"terminate_alternative": {
"type": "SEQ",
"members": [
{
"type": "ALIAS",
"content": {
"type": "TOKEN",
"content": {
"type": "PREC",
"value": 2,
"content": {
"type": "PATTERN",
"value": "[tT][eE][rR][mM][iI][nN][aA][tT][eE]"
}
}
},
"named": false,
"value": "terminate"
},
{
"type": "STRING",
"value": ";"
}
]
},
"selective_accept": {
"type": "SEQ",
"members": [
@ -12659,10 +12688,27 @@
},
{
"type": "SEQ",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_guard_select"
"name": "guard"
},
{
"type": "BLANK"
}
]
},
{
"type": "SYMBOL",
"name": "select_alternative"
}
]
},
{
"type": "REPEAT",
@ -12685,9 +12731,26 @@
"named": false,
"value": "or"
},
{
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_guard_select"
"name": "guard"
},
{
"type": "BLANK"
}
]
},
{
"type": "SYMBOL",
"name": "select_alternative"
}
]
}
]
}
@ -12760,19 +12823,7 @@
"value": "select"
},
{
"type": "ALIAS",
"content": {
"type": "TOKEN",
"content": {
"type": "PREC",
"value": 2,
"content": {
"type": "PATTERN",
"value": "[;;]"
}
}
},
"named": false,
"type": "STRING",
"value": ";"
}
]
@ -12925,8 +12976,12 @@
"value": "accept"
},
{
"type": "FIELD",
"name": "entry_direct_name",
"content": {
"type": "SYMBOL",
"name": "identifier"
}
},
{
"type": "CHOICE",
@ -12958,20 +13013,20 @@
]
},
{
"type": "FIELD",
"name": "parameter_profile",
"content": {
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "parameter_profile",
"content": {
"type": "SYMBOL",
"name": "formal_part"
}
},
{
"type": "BLANK"
}
]
}
},
{
"type": "CHOICE",
@ -13019,8 +13074,12 @@
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "entry_identifier",
"content": {
"type": "SYMBOL",
"name": "identifier"
}
},
{
"type": "BLANK"

View File

@ -54,10 +54,53 @@
]
}
},
{
"type": "accept_alternative",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "accept_statement",
"named": true
},
{
"type": "label",
"named": true
},
{
"type": "statement",
"named": true
}
]
}
},
{
"type": "accept_statement",
"named": true,
"fields": {
"entry_direct_name": {
"multiple": false,
"required": true,
"types": [
{
"type": "identifier",
"named": true
}
]
},
"entry_identifier": {
"multiple": false,
"required": false,
"types": [
{
"type": "identifier",
"named": true
}
]
},
"entry_index": {
"multiple": false,
"required": false,
@ -80,16 +123,12 @@
}
},
"children": {
"multiple": true,
"required": true,
"multiple": false,
"required": false,
"types": [
{
"type": "handled_sequence_of_statements",
"named": true
},
{
"type": "identifier",
"named": true
}
]
}
@ -8225,6 +8264,29 @@
]
}
},
{
"type": "select_alternative",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "accept_alternative",
"named": true
},
{
"type": "delay_alternative",
"named": true
},
{
"type": "terminate_alternative",
"named": true
}
]
}
},
{
"type": "selected_component",
"named": true,
@ -8307,10 +8369,6 @@
"multiple": true,
"required": true,
"types": [
{
"type": "accept_statement",
"named": true
},
{
"type": "guard",
"named": true
@ -8319,6 +8377,10 @@
"type": "label",
"named": true
},
{
"type": "select_alternative",
"named": true
},
{
"type": "statement",
"named": true
@ -9399,6 +9461,11 @@
]
}
},
{
"type": "terminate_alternative",
"named": true,
"fields": {}
},
{
"type": "timed_entry_call",
"named": true,
@ -10082,6 +10149,10 @@
"type": "task",
"named": false
},
{
"type": "terminate",
"named": false
},
{
"type": "then",
"named": false

61017
src/parser.c

File diff suppressed because it is too large Load Diff

View File

@ -198,3 +198,53 @@ end;
(statement
(procedure_call_statement
(identifier)))))
================================================================================
Accept
================================================================================
accept Start (A : Integer; B : Integer) do
null;
end Start;
--------------------------------------------------------------------------------
(compilation
(compilation_unit
(statement
(accept_statement
(identifier)
(formal_part
(parameter_specification
(identifier)
(identifier))
(parameter_specification
(identifier)
(identifier)))
(handled_sequence_of_statements
(statement
(null_statement)))
(identifier)))))
================================================================================
Select terminate
================================================================================
select
accept Start;
or
terminate;
end select;
--------------------------------------------------------------------------------
(compilation
(compilation_unit
(statement
(selective_accept
(select_alternative
(accept_alternative
(accept_statement
(identifier))))
(select_alternative
(terminate_alternative))))))