Allow empty statements of declarations in gnatprep

All runtime files and all the code from Deep Blue Capital are now
parsed without errors.
This commit is contained in:
Emmanuel Briot 2022-12-14 14:15:47 +01:00
parent faa006e5fd
commit d625712fe1
5 changed files with 41028 additions and 39034 deletions

View File

@ -2215,16 +2215,16 @@ module.exports = grammar({
reservedWord('#if'), reservedWord('#if'),
field('condition', $.expression), field('condition', $.expression),
reservedWord('then'), reservedWord('then'),
$.non_empty_declarative_part, repeat($._declarative_item_pragma),
repeat(seq( repeat(seq(
reservedWord('#elsif'), reservedWord('#elsif'),
field('condition', $.expression), field('condition', $.expression),
reservedWord('then'), reservedWord('then'),
$.non_empty_declarative_part, repeat($._declarative_item_pragma),
)), )),
optional(seq( optional(seq(
reservedWord('#else'), reservedWord('#else'),
$.non_empty_declarative_part, repeat($._declarative_item_pragma),
)), )),
reservedWord('#end'), reservedWord('#end'),
reservedWord('if'), reservedWord('if'),
@ -2234,16 +2234,16 @@ module.exports = grammar({
reservedWord('#if'), reservedWord('#if'),
field('condition', $.expression), field('condition', $.expression),
reservedWord('then'), reservedWord('then'),
field('statements', $._sequence_of_statements), repeat($._statement), // can be empty
repeat(seq( repeat(seq(
reservedWord('#elsif'), reservedWord('#elsif'),
field('condition', $.expression), field('condition', $.expression),
reservedWord('then'), reservedWord('then'),
field('statements', $._sequence_of_statements), repeat($._statement), // can be empty
)), )),
optional(seq( optional(seq(
reservedWord('#else'), reservedWord('#else'),
field('else_statements', $._sequence_of_statements), repeat($._statement), // can be empty
)), )),
reservedWord('#end'), reservedWord('#end'),
reservedWord('if'), reservedWord('if'),

View File

@ -13820,8 +13820,11 @@
"value": "then" "value": "then"
}, },
{ {
"type": "REPEAT",
"content": {
"type": "SYMBOL", "type": "SYMBOL",
"name": "non_empty_declarative_part" "name": "_declarative_item_pragma"
}
}, },
{ {
"type": "REPEAT", "type": "REPEAT",
@ -13869,8 +13872,11 @@
"value": "then" "value": "then"
}, },
{ {
"type": "REPEAT",
"content": {
"type": "SYMBOL", "type": "SYMBOL",
"name": "non_empty_declarative_part" "name": "_declarative_item_pragma"
}
} }
] ]
} }
@ -13898,8 +13904,11 @@
"value": "#else" "value": "#else"
}, },
{ {
"type": "REPEAT",
"content": {
"type": "SYMBOL", "type": "SYMBOL",
"name": "non_empty_declarative_part" "name": "_declarative_item_pragma"
}
} }
] ]
}, },
@ -13990,11 +13999,10 @@
"value": "then" "value": "then"
}, },
{ {
"type": "FIELD", "type": "REPEAT",
"name": "statements",
"content": { "content": {
"type": "SYMBOL", "type": "SYMBOL",
"name": "_sequence_of_statements" "name": "_statement"
} }
}, },
{ {
@ -14043,11 +14051,10 @@
"value": "then" "value": "then"
}, },
{ {
"type": "FIELD", "type": "REPEAT",
"name": "statements",
"content": { "content": {
"type": "SYMBOL", "type": "SYMBOL",
"name": "_sequence_of_statements" "name": "_statement"
} }
} }
] ]
@ -14076,11 +14083,10 @@
"value": "#else" "value": "#else"
}, },
{ {
"type": "FIELD", "type": "REPEAT",
"name": "else_statements",
"content": { "content": {
"type": "SYMBOL", "type": "SYMBOL",
"name": "_sequence_of_statements" "name": "_statement"
} }
} }
] ]

View File

@ -6105,10 +6105,134 @@
}, },
"children": { "children": {
"multiple": true, "multiple": true,
"required": true, "required": false,
"types": [ "types": [
{ {
"type": "non_empty_declarative_part", "type": "at_clause",
"named": true
},
{
"type": "attribute_definition_clause",
"named": true
},
{
"type": "body_stub",
"named": true
},
{
"type": "enumeration_representation_clause",
"named": true
},
{
"type": "exception_declaration",
"named": true
},
{
"type": "exception_renaming_declaration",
"named": true
},
{
"type": "expression_function_declaration",
"named": true
},
{
"type": "full_type_declaration",
"named": true
},
{
"type": "generic_instantiation",
"named": true
},
{
"type": "generic_package_declaration",
"named": true
},
{
"type": "generic_renaming_declaration",
"named": true
},
{
"type": "generic_subprogram_declaration",
"named": true
},
{
"type": "gnatprep_declarative_if_statement",
"named": true
},
{
"type": "incomplete_type_declaration",
"named": true
},
{
"type": "null_procedure_declaration",
"named": true
},
{
"type": "number_declaration",
"named": true
},
{
"type": "object_declaration",
"named": true
},
{
"type": "object_renaming_declaration",
"named": true
},
{
"type": "package_body",
"named": true
},
{
"type": "package_renaming_declaration",
"named": true
},
{
"type": "package_specification",
"named": true
},
{
"type": "pragma_g",
"named": true
},
{
"type": "private_extension_declaration",
"named": true
},
{
"type": "private_type_declaration",
"named": true
},
{
"type": "protected_body",
"named": true
},
{
"type": "record_representation_clause",
"named": true
},
{
"type": "subprogram_body",
"named": true
},
{
"type": "subprogram_declaration",
"named": true
},
{
"type": "subprogram_renaming_declaration",
"named": true
},
{
"type": "subtype_declaration",
"named": true
},
{
"type": "task_body",
"named": true
},
{
"type": "use_clause",
"named": true "named": true
} }
] ]
@ -6127,8 +6251,9 @@
"named": true "named": true
} }
] ]
}
}, },
"else_statements": { "children": {
"multiple": true, "multiple": true,
"required": false, "required": false,
"types": [ "types": [
@ -6229,109 +6354,6 @@
"named": true "named": true
} }
] ]
},
"statements": {
"multiple": true,
"required": true,
"types": [
{
"type": "abort_statement",
"named": true
},
{
"type": "accept_statement",
"named": true
},
{
"type": "assignment_statement",
"named": true
},
{
"type": "asynchronous_select",
"named": true
},
{
"type": "block_statement",
"named": true
},
{
"type": "case_statement",
"named": true
},
{
"type": "conditional_entry_call",
"named": true
},
{
"type": "delay_relative_statement",
"named": true
},
{
"type": "delay_until_statement",
"named": true
},
{
"type": "exit_statement",
"named": true
},
{
"type": "extended_return_statement",
"named": true
},
{
"type": "gnatprep_if_statement",
"named": true
},
{
"type": "goto_statement",
"named": true
},
{
"type": "if_statement",
"named": true
},
{
"type": "label",
"named": true
},
{
"type": "loop_statement",
"named": true
},
{
"type": "null_statement",
"named": true
},
{
"type": "pragma_g",
"named": true
},
{
"type": "procedure_call_statement",
"named": true
},
{
"type": "raise_statement",
"named": true
},
{
"type": "requeue_statement",
"named": true
},
{
"type": "selective_accept",
"named": true
},
{
"type": "simple_return_statement",
"named": true
},
{
"type": "timed_entry_call",
"named": true
}
]
}
} }
}, },
{ {

79538
src/parser.c

File diff suppressed because it is too large Load Diff

View File

@ -23,13 +23,12 @@ end;
(term (term
(factor_not (factor_not
(identifier)))) (identifier))))
(non_empty_declarative_part
(pragma_g (pragma_g
(identifier) (identifier)
(pragma_argument_association (pragma_argument_association
(expression (expression
(term (term
(identifier)))))))) (identifier)))))))
(handled_sequence_of_statements (handled_sequence_of_statements
(null_statement))))) (null_statement)))))
@ -53,3 +52,32 @@ end;
(expression (expression
(term (term
(gnatprep_identifier))))))) (gnatprep_identifier)))))))
================================================================================
Preprocess empty (GNAT)
================================================================================
procedure P is
#if not CHECKING_MODE then
-- pragma Suppress (Access_Checks);
#end if;
begin
null;
end;
--------------------------------------------------------------------------------
(compilation
(compilation_unit
(subprogram_body
(procedure_specification
(identifier))
(non_empty_declarative_part
(gnatprep_declarative_if_statement
(expression
(term
(factor_not
(identifier))))
(comment)))
(handled_sequence_of_statements
(null_statement)))))