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( choice(
comma_separated_list_of($.parameter_association), comma_separated_list_of($.parameter_association),
@ -1355,7 +1355,7 @@ module.exports = grammar({
$.exception_handler, $.exception_handler,
$.pragma_g, $.pragma_g,
)), )),
formal_part: $ => seq( formal_part: $ => seq( // ARM 6.1
'(', '(',
$._parameter_specification_list, $._parameter_specification_list,
')', ')',
@ -1945,15 +1945,10 @@ module.exports = grammar({
$.access_definition, $.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( _sequence_of_statements: $ => prec.left(seq(
repeat1($.statement), repeat1($.statement),
repeat($.label), repeat($.label),
)), )),
// sequence_of_statements_as_node: $ => $.sequence_of_statements,
_simple_statement: $ => choice( _simple_statement: $ => choice(
$.null_statement, $.null_statement,
$.assignment_statement, $.assignment_statement,
@ -2041,24 +2036,36 @@ module.exports = grammar({
field('condition', $.expression), field('condition', $.expression),
'=>', '=>',
), ),
_guard_select: $ => seq( select_alternative: $ => choice( // ARM 9.7.1
$.guard, $.accept_alternative,
$._select_alternative, $.delay_alternative,
$.terminate_alternative,
), ),
_select_alternative: $ => seq( accept_alternative: $ => seq( // ARM 9.7.1
$.accept_statement, $.accept_statement,
optional($._sequence_of_statements), 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'), reservedWord('select'),
list_of(reservedWord('or'), $._guard_select), list_of(reservedWord('or'), seq(
optional($.guard),
$.select_alternative,
)),
optional(seq( optional(seq(
reservedWord('else'), reservedWord('else'),
$._sequence_of_statements, $._sequence_of_statements,
)), )),
reservedWord('end'), reservedWord('end'),
reservedWord('select'), reservedWord('select'),
reservedWord(';'), ';',
), ),
abort_statement: $ => seq( abort_statement: $ => seq(
reservedWord('abort'), reservedWord('abort'),
@ -2074,20 +2081,20 @@ module.exports = grammar({
)), )),
';', ';',
), ),
accept_statement: $ => seq( accept_statement: $ => seq( // ARM 9.5.2
reservedWord('accept'), reservedWord('accept'),
$.identifier, field('entry_direct_name', $.identifier),
optional(seq( optional(seq(
'(', '(',
field('entry_index', $.expression), field('entry_index', $.expression),
')', ')',
)), )),
field('parameter_profile', optional($.formal_part)), optional(field('parameter_profile', $.formal_part)),
optional(seq( optional(seq(
reservedWord('do'), reservedWord('do'),
$.handled_sequence_of_statements, $.handled_sequence_of_statements,
reservedWord('end'), reservedWord('end'),
optional($.identifier), optional(field('entry_identifier', $.identifier)),
)), )),
';', ';',
), ),

View File

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

View File

@ -12604,20 +12604,24 @@
} }
] ]
}, },
"_guard_select": { "select_alternative": {
"type": "SEQ", "type": "CHOICE",
"members": [ "members": [
{ {
"type": "SYMBOL", "type": "SYMBOL",
"name": "guard" "name": "accept_alternative"
}, },
{ {
"type": "SYMBOL", "type": "SYMBOL",
"name": "_select_alternative" "name": "delay_alternative"
},
{
"type": "SYMBOL",
"name": "terminate_alternative"
} }
] ]
}, },
"_select_alternative": { "accept_alternative": {
"type": "SEQ", "type": "SEQ",
"members": [ "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": { "selective_accept": {
"type": "SEQ", "type": "SEQ",
"members": [ "members": [
@ -12661,8 +12690,25 @@
"type": "SEQ", "type": "SEQ",
"members": [ "members": [
{ {
"type": "SYMBOL", "type": "SEQ",
"name": "_guard_select" "members": [
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "guard"
},
{
"type": "BLANK"
}
]
},
{
"type": "SYMBOL",
"name": "select_alternative"
}
]
}, },
{ {
"type": "REPEAT", "type": "REPEAT",
@ -12686,8 +12732,25 @@
"value": "or" "value": "or"
}, },
{ {
"type": "SYMBOL", "type": "SEQ",
"name": "_guard_select" "members": [
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "guard"
},
{
"type": "BLANK"
}
]
},
{
"type": "SYMBOL",
"name": "select_alternative"
}
]
} }
] ]
} }
@ -12760,19 +12823,7 @@
"value": "select" "value": "select"
}, },
{ {
"type": "ALIAS", "type": "STRING",
"content": {
"type": "TOKEN",
"content": {
"type": "PREC",
"value": 2,
"content": {
"type": "PATTERN",
"value": "[;;]"
}
}
},
"named": false,
"value": ";" "value": ";"
} }
] ]
@ -12925,8 +12976,12 @@
"value": "accept" "value": "accept"
}, },
{ {
"type": "SYMBOL", "type": "FIELD",
"name": "identifier" "name": "entry_direct_name",
"content": {
"type": "SYMBOL",
"name": "identifier"
}
}, },
{ {
"type": "CHOICE", "type": "CHOICE",
@ -12958,20 +13013,20 @@
] ]
}, },
{ {
"type": "FIELD", "type": "CHOICE",
"name": "parameter_profile", "members": [
"content": { {
"type": "CHOICE", "type": "FIELD",
"members": [ "name": "parameter_profile",
{ "content": {
"type": "SYMBOL", "type": "SYMBOL",
"name": "formal_part" "name": "formal_part"
},
{
"type": "BLANK"
} }
] },
} {
"type": "BLANK"
}
]
}, },
{ {
"type": "CHOICE", "type": "CHOICE",
@ -13019,8 +13074,12 @@
"type": "CHOICE", "type": "CHOICE",
"members": [ "members": [
{ {
"type": "SYMBOL", "type": "FIELD",
"name": "identifier" "name": "entry_identifier",
"content": {
"type": "SYMBOL",
"name": "identifier"
}
}, },
{ {
"type": "BLANK" "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", "type": "accept_statement",
"named": true, "named": true,
"fields": { "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": { "entry_index": {
"multiple": false, "multiple": false,
"required": false, "required": false,
@ -80,16 +123,12 @@
} }
}, },
"children": { "children": {
"multiple": true, "multiple": false,
"required": true, "required": false,
"types": [ "types": [
{ {
"type": "handled_sequence_of_statements", "type": "handled_sequence_of_statements",
"named": true "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", "type": "selected_component",
"named": true, "named": true,
@ -8307,10 +8369,6 @@
"multiple": true, "multiple": true,
"required": true, "required": true,
"types": [ "types": [
{
"type": "accept_statement",
"named": true
},
{ {
"type": "guard", "type": "guard",
"named": true "named": true
@ -8319,6 +8377,10 @@
"type": "label", "type": "label",
"named": true "named": true
}, },
{
"type": "select_alternative",
"named": true
},
{ {
"type": "statement", "type": "statement",
"named": true "named": true
@ -9399,6 +9461,11 @@
] ]
} }
}, },
{
"type": "terminate_alternative",
"named": true,
"fields": {}
},
{ {
"type": "timed_entry_call", "type": "timed_entry_call",
"named": true, "named": true,
@ -10082,6 +10149,10 @@
"type": "task", "type": "task",
"named": false "named": false
}, },
{
"type": "terminate",
"named": false
},
{ {
"type": "then", "type": "then",
"named": false "named": false

61017
src/parser.c

File diff suppressed because it is too large Load Diff

View File

@ -198,3 +198,53 @@ end;
(statement (statement
(procedure_call_statement (procedure_call_statement
(identifier))))) (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))))))