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