Add support for "or terminate" in select statements
This commit is contained in:
parent
d6ea15a3e0
commit
d52ba823fa
43
grammar.js
43
grammar.js
|
|
@ -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)),
|
||||
)),
|
||||
';',
|
||||
),
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@
|
|||
"out"
|
||||
"pragma"
|
||||
"renames"
|
||||
"terminate"
|
||||
"when"
|
||||
] @keyword
|
||||
[
|
||||
|
|
|
|||
133
src/grammar.json
133
src/grammar.json
|
|
@ -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": [
|
||||
|
|
@ -12661,8 +12690,25 @@
|
|||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "_guard_select"
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "guard"
|
||||
},
|
||||
{
|
||||
"type": "BLANK"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "select_alternative"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "REPEAT",
|
||||
|
|
@ -12686,8 +12732,25 @@
|
|||
"value": "or"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "_guard_select"
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"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": "SYMBOL",
|
||||
"name": "identifier"
|
||||
"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": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "FIELD",
|
||||
"name": "parameter_profile",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "formal_part"
|
||||
},
|
||||
{
|
||||
"type": "BLANK"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "BLANK"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "CHOICE",
|
||||
|
|
@ -13019,8 +13074,12 @@
|
|||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "identifier"
|
||||
"type": "FIELD",
|
||||
"name": "entry_identifier",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "identifier"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "BLANK"
|
||||
|
|
|
|||
|
|
@ -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
61017
src/parser.c
File diff suppressed because it is too large
Load Diff
|
|
@ -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))))))
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user