Original PSub Grammar
program
--> program id ; var_decls subprogram_decls compound_statement .
var_decls
--> var decl_list
| epsilon
decl_list
--> decl_list declaration
| declaration
declaration
--> identifier_list : type ;
identifier_list
--> identifier_list , id
| id
type
--> standard_type
| array [ num .. num ] of standard_type
standard_type
--> integer
| real
| boolean
subprogram_decls
--> subprogram_decls subprogram_declaration
| epsilon
subprogram_declaration
--> subprogram_head var_decls compound_statement ;
subprogram_head
--> function id arguments : standard_type ;
| procedure id arguments ;
arguments
--> ( parameter_list )
| epsilon
parameter_list
--> parameter_list ; parameter
| parameter
parameter
--> identifier_list : standard_type
| var identifier_list : standard_type
compound_statement
--> begin statement_list end
statement_list
--> statement_list ; statement
| statement
statement
--> variable := expression
| procedure_statement
| compound_statement
| if expression then statement else statement
| while expression do statement
| repeat statement_list until expression
| epsilon
variable
--> id [ expression ]
| id
procedure_statement
--> id ( expression_list )
| id
expression_list
--> expression_list , expression
| expression
expression
--> simple_expression relop simple_expression
| simple_expression
simple_expression
--> simple_expression add_operator term
| addop term
| term
add_operator
--> addop
| or
term
--> term mul_operator factor
| factor
mul_operator
--> mulop
| and
| div
| mod
factor
--> variable
| num
| id ( expression_list )
| ( expression )
| not factor