program --> program_heading block full_stop program_heading --> program_keyword identifier left_parenthesis file_identifier_list right_parenthesis semicolon file_identifier_list --> file_identifier comma file_identifier_list | file_identifier file_identifier --> identifier block --> label_declaration_part constant_definition_part type_definition_part variable_declaration_part procedure_and_function_declaration_part statement_part label_declaration_part --> label_keyword label_list semicolon | label_list --> label comma label_list | label label --> unsigned_integer constant_definition_part --> const_keyword constant_definition_list semicolon | constant_definition_list --> constant_definition semicolon constant_definition_list | constant_definition constant_definition --> identifier equal_sign constant constant --> unsigned_number | sign unsigned_number | constant_identifier | sign constant_identifier | string unsigned_number --> unsigned_integer | unsigned_real constant_identifier --> identifier type_definition_part --> type_keyword type_definition_list semicolon | type_definition_list --> type_definition semicolon type_definition_list | type_definition type_definition --> identifier equal_sign type type --> simple_type | structured_type | pointer_type simple_type --> scalar_type | subrange_type | type_identifier scalar_type --> left_parenthesis identifier_list right_parenthesis identifier_list --> identifier comma identifier_list | identifier subrange_type --> constant two_dots constant type_identifier --> identifier structured_type --> packed_keyword unpacked_structured_type | unpacked_structured_type unpacked_structured_type --> array_type | record_type | set_type | file_type array_type --> array_keyword left_bracket index_type_list right_bracket of_keyword component_type index_type_list --> index_type comma index_type_list | index_type index_type --> simple_type component_type --> type record_type --> record_keyword field_list end_keyword field_list --> fixed_part semicolon variant_part | fixed_part | variant_part | fixed_part --> record_section_list record_section_list --> record_section semicolon record_section_list | record_section record_section --> field_identifier_list colon type field_identifier_list --> field_identifier comma field_identifier_list | field_identifier field_identifier --> identifier variant_part --> case_keyword tag_field type_identifier of_keyword variant_list variant_list --> variant semicolon variant_list | variant tag_field --> field_identifier colon | variant --> case_label_list colon left_parenthesis field_list right_parenthesis case_label_list --> case_label comma case_label_list | case_label case_label --> constant set_type --> set_keyword of_keyword base_type base_type --> simple_type file_type --> file_keyword of_keyword type pointer_type --> up_arrow type_identifier variable_declaration_part --> var_keyword variable_declaration_list semicolon | variable_declaration_list --> variable_declaration semicolon variable_declaration_list | variable_declaration variable_declaration --> identifier_list colon type procedure_and_function_declaration_part --> procedure_or_function_declaration_list procedure_or_function_declaration_list --> procedure_or_function_declaration semicolon procedure_or_function_declaration_list | procedure_or_function_declaration --> procedure_declaration | function_declaration procedure_declaration --> procedure_heading block procedure_heading --> procedure_keyword identifier semicolon | procedure_keyword identifier left_parenthesis formal_parameter_section_list right_parenthesis semicolon formal_parameter_section_list --> formal_parameter_section semicolon formal_parameter_section_list | formal_parameter_section formal_parameter_section --> parameter_group | var_keyword parameter_group | function_keyword parameter_group | procedure_keyword identifier_list parameter_group --> identifier_list colon type_identifier function_declaration --> function_heading block function_heading --> function_keyword identifier colon result_type semicolon | function_keyword identifier left_parenthesis formal_parameter_section_list right_parenthesis colon result_type semicolon result_type --> type_identifier statement_part --> compound_statement statement --> label colon unlabelled_statement | unlabelled_statement unlabelled_statement --> structured_statement | simple_statement simple_statement --> assignment_statement | procedure_statement | go_to_statement | empty_statement assignment_statement --> variable assignment_sign expression | function_identifier assignment_sign expression variable --> entire_variable specifier_list | entire_variable entire_variable --> identifier specifier_list --> specifier specifier_list | specifier specifier --> up_arrow | record_field | array_index record_field --> full_stop field_identifier array_index --> left_bracket expression_list right_bracket expression_list --> expression comma expression_list | expression expression --> simple_expression relational_operator simple_expression | simple_expression relational_operator --> equal_sign | unequal_sign | less_sign | less_equal_sign | greater_equal_sign | greater_sign | in_keyword simple_expression --> term adding_operator simple_expression | term | sign term adding_operator --> plus_sign | minus_sign | or_keyword term --> factor multiplying_operator term | factor multiplying_operator --> asterisk_sign | slash_sign | div_keyword | mod_keyword | and_keyword factor --> unsigned_number | string | nil_keyword | left_parenthesis expression right_parenthesis | set | not_keyword factor | function_identifier left_parenthesis actual_parameter_list right_parenthesis | variable | constant_identifier | function_identifier function_identifier --> identifier set --> left_bracket element_list right_bracket element_list --> element comma element_list | element --> expression two_dots expression | expression procedure_statement --> procedure_identifier left_parenthesis actual_parameter_list right_parenthesis | procedure_identifier procedure_identifier --> identifier actual_parameter_list --> actual_parameter comma actual_parameter_list | actual_parameter actual_parameter --> expression | procedure_identifier | function_identifier go_to_statement --> goto_keyword label empty_statement --> structured_statement --> compound_statement | conditional_statement | repetitive_statement | with_statement compound_statement --> begin_keyword statement_list end_keyword conditional_statement --> if_statement | case_statement if_statement --> if_keyword expression then_keyword statement else_keyword statement | if_keyword expression then_keyword statement case_statement --> case_keyword expression of_keyword case_list end_keyword case_list --> case_list_element semicolon case_list | case_list_element case_list_element --> case_label_list colon statement | repetitive_statement --> while_statement | repeat_statement | for_statement while_statement --> while_keyword expression do_keyword statement repeat_statement --> repeat_keyword statement_list until_keyword expression statement_list --> statement semicolon statement_list | statement for_statement --> for_keyword control_variable assignment_sign for_list do_keyword statement for_list --> initial_value to_keyword final_value | initial_value downto_keyword final_value control_variable --> identifier initial_value --> expression final_value --> expression with_statement --> with_keyword record_variable_list do_keyword statement record_variable_list --> variable comma record_variable_list | variable sign --> plus_sign | minus_sign