Programs and Blocks
- program::= program_heading semicolon program_block,
program hi(out); begin writeln('Hello, World!'); end.
- program_heading::="program" identifier ("(" O( program_parameters) ")" |),
program merge(infile1, infile2, mergedfile);
- program_block::= block ".",
begin writeln('Hi'); writeln('there!'); end .
- block::= label_declarations constant_definitions type_definitions variable_declarations procedure_function_declarations statement_part,
const n=1; m=2; begin writeln(m+n); end
- program_parameters::= List(identifier),
in,out,waveItAllAbout
Declarations and Definitions
- label_declarations::= O("label" List(label) semicolon ),
- label::= digit_sequence,
label 1,2,3,911;
- constant_definitions::= O("const" S(constant_definition) semicolon),
- constant_definition::= identifier "=" constant,
- type_definitions::= O("type" type_definition semicolon #(type_definition semicolon) ),
- type_definition::= identifier "=" type_denoter,
- variable_declarations::= O("var" variable_declaration semicolon #(variable_declaration semicolon) ),
- variable_declaration::= identifier_list ":" type_denoter,
- procedure_function_declarations::= #( procedure_declaration | function_declaration ) semicolon,
Subprogram Declarations
- subprogram_declaration::=procedure_declaration | function_declaration.
Procedure Declarations
- procedure_declaration::= procedure_heading semicolon directive | procedure_identification semicolon procedure_block | procedure_heading semicolon procedure_block,
- procedure_heading::= "procedure" identifier O(formal_parameter_list),
- procedure_identification::= "procedure" procedure_identifier,
- procedure_block::= block,
- procedure_identifier::= identifier,
- directive::= letter #(letter | digit),
- type_denoter::= type_identifier | new_type,
Function Declarations
- function_declaration::= function_heading semicolon directive | function_identification semicolon function_block | function_heading semicolon function_block,
- function_heading::= "function" identifier (formal_parameter_list |) ":" result_type,
- function_block::= block.
Formal Parameters and Arguments
- formal_parameter_list::= formal_parameter_section #( semicolon formal_parameter_section),
- formal_parameter_section::= value_parameter_specification | variable_parameter_specification | procedural_parameter_specification | functional_parameter_specification | conformant_array_parameter_specification,
- value_parameter_specification::= identifier_list ":" type_identifier,
- variable_parameter_specification::= "var" identifier_list ":" type_identifier,
- procedural_parameter_specification::= procedure_heading,
- functional_parameter_specification::= function_heading,
- conformant_array_parameter_specification::= value_conformant_array_specification | variable_conformant_array_specification,
- value_conformant_array_specification::= identifier_list ":" conformant_array_schema,
- variable_conformant_array_specification::= "var" identifier_list ":" conformant_array_schema,
- conformant_array_schema::= packed_conformant_array_schema | unpacked_conformant_array_schema,
- packed_conformant_array_schema::= "packed" "array" O(index_type_specification ) "of" type_identifier,
- unpacked_conformant_array_schema::= "array" O(index_type_specification #(semicolon index_type_specification) ) "of" type_identifier | conformant_array_schema,
- index_type_specfication::= identifier ".." identifier ":" ordinal_type_identifier,
Constants
- constant::= signed_number | constant_identifier | character_string,
- unsigned_constant::= unsigned_number | character_string | constant_identifier | "nil",
- unsigned_number::= unsigned_integer | unsigned_real,
- constant_identifier::= identifier,
Types
- type_identifier::= identifier,
- new_type::= new_ordinal_type | new_structured_type | new_pointer_type,
- result_type::= simple_type_identifier | pointer_type_identifier,
- new_ordinal_type::= enumerated_type | subrange_type,
- new_structured_type::= O("packed") unpacked_structured_type,
- new_pointer_type::= "^" domain_type,
- simple_type_identifier::= type_identifier,
- pointer_type_identifier::= type_identifier,
- enumerated_type::= identifier_list,
- subrange_type::= constant ".." constant,
- unpacked_structured_type::= array_type | record_type | set_type | file_type,
- domain_type::= type_identifier,
- array_type::= "array" #(index_type #("," index_type) ) "of" component_type,
- set_type::= "set of" base_type,
- file_type::= "file of" component_type,
- index_type::= ordinal_type,
- component_type::= type_denoter,
- base_type::= ordinal_type,
- ordinal_type::= new_ordinal_type | ordinal_type_identifier,
- ordinal_type_identifier::= type_identifier,
- record_type::= "record" field_list "end",
- record_section::= identifier_list ":" type_denoter,
- field_list::= O( fixed_part #( semicolon variant_part ) ,
- fixed_part::= record_section #( semicolon record_section),
- variant_part::= "case" variant_selector "of" variant #( semicolon variant),
- variant_selector::= O( tag_field ":" ) tag_type,
- variant::= case_constant_list ":" field_list,
- tag_field::= identifier,
- tag_type::= ordinal_type_identifier,
- case_constant_list::= case_constant #( "," case_constant),
- case_constant::= constant,
Statements
- procedure_statement::= procedure_identifier O(actual_parameter_list ) | IO_procedure_statement,
- IO_procedure_statement::= "read" read_parameter_list | "readln" readln_parameter_list | "write" write_parameter_list | "writeln" writeln_parameter_list,
- actual_parameter_list::= actual_parameter #( "," actual_parameter),
- optional_file::=O(file_variable ","),
- read_parameter_list::= optional_file variable_access #( "," variable_access),
- readln_parameter_list::= O( optional_file variable_access #( "," variable_access) ),
- write_parameter_list::= optional_file write_parameter #( "," write_parameter),
- writeln_parameter_list::= O(optional_file write_parameter #( "," write_parameter) ),
- actual_parameter::= expression | variable_access | procedure_identifier | function_identifier,
- file_variable::= variable_access,
- variable_access::= entire_variable | component_variable | identified_variable | buffer_varible,
- write_parameter::= expression O( ":" O(":" expression ) ),
- statement_part::= compound_statement,
- compound_statement::= "begin" statement_sequence "end",
- statement_sequence::= statement #(semicolon statement),
- statement::= O( label ":" ) (simple_statement | structured_statement),
- simple_statement::= empty_statement | assignment_statement | procedure_statement | goto_statement,
- structured_statement::= compound_statement | conditional_statement | repetitive_statement | with_statement,
- empty_statement::=,
- assignment_statement::= variable_access | function_identifier ":=" expression,
- goto_statement::= "goto" label,
- conditional_statement::= if_statement | case_statement,
- repetitive_statement::= repeat_statement | while_statement | for_statement,
- loop::= repeat_statement | while_statement | for_statement,
- with_statement::= "with" record_variable_list "do" statement,
- if_statement::= "if" boolean_expression "then" statement O(else_part ),
- case_statement::= "case" case_index "of" case_list_element #(semicolon case_list_element) O(semicolon |) "end",
- repeat_statement::= "repeat" statement_sequence "until" boolean_expression,
- while_statement::= "while" boolean_expression "do" statement,
- for_statement::= "for" control_variable ":=" initial_value ("to" | "downto") final_value "do" statement,
- record_variable_list::= record_variable #("," record_variable),
- boolean_expression::= expression,
- else_part::= "else" statement,
- case_index::= expression,
- case_list_element::= case_constant_list ":" statement,
- control_variable::= entire_variable,
- initial_value::= expression,
- final_value::= expression,
Expressions and Variables
- expression::= simple_expression #(relational_operator simple_expression ),
- function_identifier::= identifier,
- entire_variable::= variable_identifier,
- component_variable::= indexed_variable | field_designator,
- identified_variable::= pointer_variable "^",
- buffer_variable::= file_variable "^",
- simple_expression::= O(sign) term #(adding_operator term),
- variable_identifier::= identifier,
- indexed_variable::= array_variable "[" O(index_expression #("," index_expression) ) "]" ,
- field_designator::= record_variable "." field_specifier | field_designator_identifier,
- pointer_variable::= variable_access,
- term::= factor #(multiplying_operator factor),
- array_variable::= variable_access,
- index_expression::= expression,
- record_variable::= variable_access,
- field_specifier::= field_identifier,
- field_designator_identifier::= identifier,
- factor::= variable_access | unsigned_constant | function_designator | set_constructor | expression | "not" factor, | bound_identifier,
- field_identifier::= identifier,
- set_constructor::= O( #(member_designator #("," member_designator)) ),
- bound_identifier::= identifier,
- member_designator::= expression #(".." expression),
- function_identification::= "function" function_identifier,
- function_designator::= function_identifier O(actual_parameter_list ),