~ ~
kize_program		PROGRAM IDENTIFIER global_declarations BEGIN procedure_list END

global_declarations	const_declarations type_declarations var_declarations proc_declarations

local_declarations	label_declarations var_declarations

const_declarations	CONSTANTS const_list
const_declarations

const_list		IDENTIFIER : literal ; more_const_list

more_const_list		const_list
more_const_list

literal			NUMBER
literal			DECIMAL
literal			ASTRING
literal			NULL

type_declarations	TYPES type_list
type_declarations

type_list		IDENTIFIER : declaration_type ; more_type_list

more_type_list		type_list
more_type_list

declaration_type	array_type
declaration_type	record_type

array_type		ARRAY [ ub ] OF declared_type

ub			NUMBER
ub			IDENTIFIER

record_type		RECORD fld_list END

fld_list		IDENTIFIER : declared_type ; more_fld_list

more_fld_list		fld_list
more_fld_list

declared_type		atomic_type
declared_type		IDENTIFIER
declared_type		^ declared_type

atomic_type             INT
atomic_type             REAL
atomic_type		STRING

var_declarations	VARIABLES var_list
var_declarations

var_list		IDENTIFIER : declared_type ; more_var_list

more_var_list		var_list
more_var_list

label_declarations	LABELS label_list
label_declarations

label_list		label ; more_label_list

more_label_list		label_list
more_label_list

label			NUMBER

proc_declarations	PROCEDURES proc_list
proc_declarations

proc_list		proc_signature more_proc_list

proc_signature		IDENTIFIER ( formal_arguments ) return_type ;

more_proc_list		proc_list
more_proc_list

formal_arguments	formal_argument more_formal_arguments
formal_arguments

more_formal_arguments	, formal_arguments
more_formal_arguments

formal_argument		call_by IDENTIFIER : defined_type

call_by			VAL
call_by			VAR
call_by

return_type		: atomic_type
return_type

actual_arguments        actual_argument more_actual_arguments
actual_arguments

more_actual_arguments   , actual_arguments
more_actual_arguments

actual_argument         expression

procedure_list          procedure more_procedure_list

more_procedure_list     procedure_list
more_procedure_list

procedure		PROCEDURE IDENTIFIER local_declarations BEGIN statement_list END

statement_list          statement statement_list
statement_list

statement               opt_label executable_statement

opt_label               label
opt_label

executable_statement    read_statement
executable_statement    write_statement
executable_statement    assignment_statement
executable_statement    goto_statement
executable_statement    empty_statement

executable_statement    compound_statement
executable_statement    if_statement
executable_statement    while_statement
executable_statement    repeat_statement
executable_statement    case_statement
executable_statement    for_statement
executable_statement    next_statement
executable_statement    break_statement

executable_statement	call_statement
executable_statement    return_statement

executable_statement    dispose_request

read_statement          READ    ( actual_arguments ) ;
read_statement          READLN  ( actual_arguments ) ;

write_statement         WRITE   ( actual_arguments ) ;
write_statement         WRITELN ( actual_arguments ) ;

assignment_statement    named_item := two_options ;

two_options             expression
two_options             new_request

expression              simple_expression comparison

comparison              compop simple_expression
comparison

simple_expression       sign term more_terms

more_terms              addop term more_terms
more_terms

term                    factor more_factors

more_factors            mulop factor more_factors
more_factors

factor                  named_item
factor                  ( expression )
factor                  NOT factor
factor                  literal
factor                  & named_item

named_item              IDENTIFIER qualifier

addop                   +
addop                   -
addop                   OR

mulop                   *
mulop                   /
mulop                   %
mulop                   NOT

sign                    +
sign			-
sign

compop                  =
compop                  <>
compop                  >
compop                  >=
compop                  <
compop                  <=

goto_statement          GOTO label ;

empty_statement         ;

compound_statement      DO statement_list END ;

if_statement            IF ( expression ) then_clause else_clause

then_clause		THEN statement

else_clause             ELSE statement
else_clause

case_statement          CASE ( expression ) OF case_list

case_list               NUMBER : statement case_list
case_list               DEFAULT : statement

while_statement         WHILE ( expression ) statement

repeat_statement        REPEAT statement_list UNTIL ( expression ) ;

for_statement           FOR IDENTIFIER := initial direction final statement

initial                 expression

final                   expression

direction               UPTO
direction               DOWNTO

next_statement          NEXT ;

break_statement         BREAK ;

call_statement          CALL named_item ;

return_statement        RETURN opt_value ;

opt_value               expression
opt_value

qualifier               procedure_qualifier
qualifier               structure_qualifier

procedure_qualifier     ( actual_arguments )

structure_qualifier     array_qualifier
structure_qualifier     record_qualifier
structure_qualifier     pointer_qualifier
structure_qualifier

array_qualifier         [ expression ] structure_qualifier

record_qualifier        . IDENTIFIER structure_qualifier

pointer_qualifier       ^ structure_qualifier

new_request             NEW defined_type

dispose_request         DISPOSE named_item
