From 59921871bb0cfc5ab61db98f1645b05afc1b6f01 Mon Sep 17 00:00:00 2001 From: Emmanuel Briot Date: Mon, 24 Oct 2022 13:55:24 +0200 Subject: [PATCH] Add if statements --- corpus/statements.txt | 265 +++++++++++++++++++++++++++++++++++++++++- grammar.js | 82 ++++++++++++- 2 files changed, 341 insertions(+), 6 deletions(-) diff --git a/corpus/statements.txt b/corpus/statements.txt index 212f1a5..38532b0 100644 --- a/corpus/statements.txt +++ b/corpus/statements.txt @@ -175,6 +175,9 @@ Return function F return Boolean is begin return True; + return A : My_Rec := (F => 1) do + null; + end return; end F; -------------------------------------------------------------------------------- @@ -203,7 +206,43 @@ end F; (factor (primary (name - (identifier))))))))))))) + (identifier))))))))))) + (statement + (compound_statement + (extended_return_statement + (extended_return_object_declaration + (identifier) + (return_subtype_indication + (subtype_indication + (name + (identifier)))) + (assign_value + (expression + (relation + (simple_expression + (term + (factor + (primary + (aggregate + (record_aggregate + (record_component_association_list + (record_component_association + (component_choice_list + (selector_name + (identifier))) + (assoc_expression + (expression + (relation + (simple_expression + (term + (factor + (primary + (numeric_literal)))))))))))))))))))) + (handled_sequence_of_statements + (sequence_of_statements + (statement + (simple_statement + (null_statement)))))))))) (name (identifier)))))) @@ -361,3 +400,227 @@ end; (factor (primary (numeric_literal)))))))))))))))))))))))))))) + +================================================================================ +if statement +================================================================================ + +procedure P is +begin + if A = 0 or else B = 1 then + declare + begin + null; + end; + elsif A = 1 then + declare + C : Integer; + begin + null; + exception + when Constraint_Error => null; + end; + else + begin + null; + end; + end if; +end P; + +-------------------------------------------------------------------------------- + +(compilation + (compilation_unit + (proper_body + (subprogram_body + (subprogram_specification + (procedure_specification + (name + (identifier)))) + (handled_sequence_of_statements + (sequence_of_statements + (statement + (compound_statement + (if_statement + (expression + (relation + (simple_expression + (term + (factor + (primary + (name + (identifier)))))) + (relational_operator) + (simple_expression + (term + (factor + (primary + (numeric_literal)))))) + (relation + (simple_expression + (term + (factor + (primary + (name + (identifier)))))) + (relational_operator) + (simple_expression + (term + (factor + (primary + (numeric_literal))))))) + (sequence_of_statements + (statement + (compound_statement + (block_statement + (handled_sequence_of_statements + (sequence_of_statements + (statement + (simple_statement + (null_statement))))))))) + (elsif_statement_item + (expression + (relation + (simple_expression + (term + (factor + (primary + (name + (identifier)))))) + (relational_operator) + (simple_expression + (term + (factor + (primary + (numeric_literal))))))) + (sequence_of_statements + (statement + (compound_statement + (block_statement + (non_empty_declarative_part + (declarative_item_pragma + (object_declaration + (defining_identifier_list + (identifier)) + (subtype_indication + (name + (identifier)))))) + (handled_sequence_of_statements + (sequence_of_statements + (statement + (simple_statement + (null_statement)))) + (exception_handler_list + (exception_handler + (exception_choice_list + (exception_choice + (name + (identifier)))) + (sequence_of_statements + (statement + (simple_statement + (null_statement)))))))))))) + (sequence_of_statements + (statement + (compound_statement + (block_statement + (handled_sequence_of_statements + (sequence_of_statements + (statement + (simple_statement + (null_statement)))))))))))))) + (name + (identifier)))))) + +================================================================================ +Case statement +================================================================================ + +procedure P is +begin + case Func(A => 1) is + when '1' .. '2' => + null; + when '3' | '4' => + null; + end case; +end; + +-------------------------------------------------------------------------------- + +(compilation + (compilation_unit + (proper_body + (subprogram_body + (subprogram_specification + (procedure_specification + (name + (identifier)))) + (handled_sequence_of_statements + (sequence_of_statements + (statement + (compound_statement + (case_statement + (expression + (relation + (simple_expression + (term + (factor + (primary + (name + (function_call + (name + (identifier)) + (actual_parameter_part + (parameter_association + (component_choice_list + (selector_name + (identifier))) + (assoc_expression + (expression + (relation + (simple_expression + (term + (factor + (primary + (numeric_literal)))))))))))))))))) + (case_statement_alternative + (discrete_choice_list + (discrete_choice + (range_g + (simple_expression + (term + (factor + (primary + (character_literal))))) + (simple_expression + (term + (factor + (primary + (character_literal)))))))) + (sequence_of_statements + (statement + (simple_statement + (null_statement))))) + (case_statement_alternative + (discrete_choice_list + (discrete_choice + (expression + (relation + (simple_expression + (term + (factor + (primary + (character_literal)))))))) + (discrete_choice + (expression + (relation + (simple_expression + (term + (factor + (primary + (character_literal))))))))) + (sequence_of_statements + (statement + (simple_statement + (null_statement)))))))))))))) diff --git a/grammar.js b/grammar.js index 0d145cf..cfac878 100644 --- a/grammar.js +++ b/grammar.js @@ -107,6 +107,7 @@ module.exports = grammar({ [$.function_call, $.procedure_call_statement], [$.function_call, $.name], + [$.selector_name, $.primary], ], @@ -184,7 +185,7 @@ module.exports = grammar({ ), selector_name: $ => choice( $._direct_name, - $.character_literal, +// $.character_literal, // was in ada-mode, moved to primary instead // reservedWord('others'), ), attribute_reference: $ => choice( @@ -513,6 +514,7 @@ module.exports = grammar({ $.aggregate, $.name, $.string_literal, // ada-mode puts this in name instead + $.character_literal, // $.allocator, ), access_type_definition: $ => seq( @@ -1522,15 +1524,62 @@ module.exports = grammar({ ), ), compound_statement: $ => choice( -// $.if_statement, -// $.case_statement, + $.if_statement, + $.case_statement, $.loop_statement, -// $.block_statement, -// $.extended_return_statement, + $.block_statement, + $.extended_return_statement, // $.parallel_block_statement, // $.accept_statement, // $.select_statement, ), + case_statement_alternative: $ => seq( + reservedWord('when'), + $.discrete_choice_list, + '=>', + $.sequence_of_statements, + ), + case_statement: $ => seq( + reservedWord('case'), + $.expression, + reservedWord('is'), + repeat1($.case_statement_alternative), + reservedWord('end'), + reservedWord('case'), + ';', + ), + block_statement: $ => seq( + optional($.loop_label), + optional(seq( + reservedWord('declare'), + optional($.non_empty_declarative_part), + )), + reservedWord('begin'), + $.handled_sequence_of_statements, + reservedWord('end'), + optional($.identifier), + ';', + ), + if_statement: $ => seq( + reservedWord('if'), + field('condition', $.expression), + reservedWord('then'), + $.sequence_of_statements, + repeat($.elsif_statement_item), + optional(seq( + reservedWord('else'), + $.sequence_of_statements, + )), + reservedWord('end'), + reservedWord('if'), + ';', + ), + elsif_statement_item: $ => seq( + reservedWord('elsif'), + field('condition', $.expression), + reservedWord('then'), + $.sequence_of_statements, + ), exit_statement: $ => seq( reservedWord('exit'), optional($.name), @@ -1565,6 +1614,29 @@ module.exports = grammar({ optional($.expression), ';', ), + extended_return_statement: $ => seq( + reservedWord('return'), + $.extended_return_object_declaration, + optional(seq( + reservedWord('do'), + $.handled_sequence_of_statements, + reservedWord('end'), + reservedWord('return'), + )), + ';', + ), + extended_return_object_declaration: $ => seq( + $.identifier, + ':', + optional(reservedWord('aliased')), + optional(reservedWord('constant')), + $.return_subtype_indication, + optional($.assign_value), + ), + return_subtype_indication: $ => choice( + $.subtype_indication, + $.access_definition, + ), procedure_call_statement: $ => seq( $.name, optional($.actual_parameter_part),