Add if statements

This commit is contained in:
Emmanuel Briot 2022-10-24 13:55:24 +02:00
parent b100bdd8c1
commit 59921871bb
2 changed files with 341 additions and 6 deletions

View File

@ -175,6 +175,9 @@ Return
function F return Boolean is function F return Boolean is
begin begin
return True; return True;
return A : My_Rec := (F => 1) do
null;
end return;
end F; end F;
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
@ -203,7 +206,43 @@ end F;
(factor (factor
(primary (primary
(name (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 (name
(identifier)))))) (identifier))))))
@ -361,3 +400,227 @@ end;
(factor (factor
(primary (primary
(numeric_literal)))))))))))))))))))))))))))) (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))))))))))))))

View File

@ -107,6 +107,7 @@ module.exports = grammar({
[$.function_call, $.procedure_call_statement], [$.function_call, $.procedure_call_statement],
[$.function_call, $.name], [$.function_call, $.name],
[$.selector_name, $.primary],
], ],
@ -184,7 +185,7 @@ module.exports = grammar({
), ),
selector_name: $ => choice( selector_name: $ => choice(
$._direct_name, $._direct_name,
$.character_literal, // $.character_literal, // was in ada-mode, moved to primary instead
// reservedWord('others'), // reservedWord('others'),
), ),
attribute_reference: $ => choice( attribute_reference: $ => choice(
@ -513,6 +514,7 @@ module.exports = grammar({
$.aggregate, $.aggregate,
$.name, $.name,
$.string_literal, // ada-mode puts this in name instead $.string_literal, // ada-mode puts this in name instead
$.character_literal,
// $.allocator, // $.allocator,
), ),
access_type_definition: $ => seq( access_type_definition: $ => seq(
@ -1522,15 +1524,62 @@ module.exports = grammar({
), ),
), ),
compound_statement: $ => choice( compound_statement: $ => choice(
// $.if_statement, $.if_statement,
// $.case_statement, $.case_statement,
$.loop_statement, $.loop_statement,
// $.block_statement, $.block_statement,
// $.extended_return_statement, $.extended_return_statement,
// $.parallel_block_statement, // $.parallel_block_statement,
// $.accept_statement, // $.accept_statement,
// $.select_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( exit_statement: $ => seq(
reservedWord('exit'), reservedWord('exit'),
optional($.name), optional($.name),
@ -1565,6 +1614,29 @@ module.exports = grammar({
optional($.expression), 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( procedure_call_statement: $ => seq(
$.name, $.name,
optional($.actual_parameter_part), optional($.actual_parameter_part),