defining_identifier ::= identifier type_name ::= identifier |INTEGER | FLOAT | BOOLEAN declaration ::= type_declation | object_declaration declarations ::= {declaration} type_declaration ::= TYPE defining_identifier IS ARRAY OF type_name; object_declaration ::= defining_identifier : object_definition; object_definition ::= type_name | type_name '[' integer_literal ']' name ::= identifier | indexed_component indexed_component ::= name '[' expression ']' expression ::= relation [and expression] | relation [or expression] relation ::= simple_expression [relational_operator simple_expression] simple_expression ::= term [binary_adding_operator simple_expression] term ::= factor [multiplying_operator term] factor ::= primary [** primary] primary ::= numeric_literal | string_literal | name | ( expression ) | function_call function_call ::= identifier ( expression {, expression} ) relational_operator ::= = | /= | < | > | <= | >= binary_adding_operator ::= + | - multiplying_operator := * | / sequence_of_statements ::= statement {statement} statement ::= simple_statement | compound_statement simple_statement ::= assignment_statement | exit_statement | procedure_call_statement | return_statement compound_statement ::= if_statement | loop_statement assignment_statement ::= name := expression ";" if_statement ::= IF condition THEN sequence_of_statements [ELSE sequence_of_statements] END; condition ::= expression loop_statement ::= iteration_scheme LOOP sequence_of_statements END ";" iteration_scheme ::= WHILE condition | FOR loop_parameter_specification loop_parameter_specification ::= defining_identifier IN expression .. expression exit_statement ::= EXIT WHEN condition ";" return_statement ::= RETURN [expression] ";" procedure_call_statement ::= identifier [ ( expression {, expression}) ] ";" function_declaration ::= FUNCTION defining_identifier ( parameter_list ) RETURN type_name IS declarations BEGIN sequence_of_statements END ";" parameter_specification ::= defining_identifier : type_name parameter_list ::= parameter_specification {; parameter_specification} procedure_declaration ::= PROCEDURE defining_identifier [ ( parameter_list ) ] IS declarations BEGIN sequence_of_statements END ";" package_declaration ::= PACKAGE defining_identifier is declarations END ";" program ::= [package_declaration] {function_declaration | procedure_declaration}