⟨Program⟩ → ⟨Block⟩
| ⟨Block⟩ ';'
⟨Decls⟩ → ⟨DeclList⟩
| ε
⟨DeclList⟩ → ⟨Decl⟩
| ⟨Decl⟩ ; ⟨DeclList⟩
⟨Decl⟩ → 'VAR' id ⟨OptType⟩
| 'TYPE' id '=' ⟨Type⟩
| ⟨ProcDecl⟩
⟨OptType⟩ → ε
| ':' ⟨Type⟩
⟨ProcDecl⟩ → 'PROC' id '(' ⟨Formals⟩ ')' ⟨OptType⟩ '=' ⟨Block⟩
| 'PROC' id '(' ⟨Formals⟩ ')' '=' ⟨Block⟩
⟨Formals⟩ → ⟨FormalList⟩
| ε
⟨FormalList⟩ → ⟨Formal⟩
| ⟨FormalList⟩ ',' ⟨Formal⟩
⟨Formal⟩ → id ':' ⟨Type⟩
⟨Type⟩ → 'INT'
| ⟨SubrTy⟩
| ⟨ArrayTy⟩
| id
| ⟨ProcTy⟩
⟨SubrTy⟩ → '[' number 'TO' number ']'
⟨ArrayTy⟩ → 'ARRAY' ⟨SubrTy⟩ 'OF' ⟨Type⟩
⟨ProcTy⟩ → 'PROC' '(' ⟨Formals⟩ ')' ⟨OptType⟩
⟨Block⟩ → ⟨Decls⟩ 'BEGIN' ⟨Stmts⟩ 'END'
⟨Stmts⟩ → ⟨StmtList⟩
| ε
⟨StmtList⟩ → ⟨Stmt⟩
| ⟨StmtList⟩ ';' ⟨Stmt⟩
⟨Stmt⟩ → ⟨Assignment⟩
| ⟨Return⟩
| ⟨Block⟩
| ⟨Conditional⟩
| ⟨Iteration⟩
| ⟨Output⟩
| ⟨Expr⟩
⟨Assignment⟩ → ⟨Expr⟩ ':=' ⟨Expr⟩
⟨Return⟩ → 'RETURN' ⟨Expr⟩
⟨Conditional⟩ → 'IF' ⟨Expr⟩ 'THEN' ⟨StmtList⟩ 'ELSE' ⟨StmtList⟩ 'END'
⟨Iteration⟩ → 'WHILE' ⟨Expr⟩ 'DO' ⟨StmtList⟩ 'END'
⟨Output⟩ → 'PRINT' ⟨Expr⟩
⟨Expr⟩ → ⟨Operand⟩
| ⟨Expr⟩ ⟨Operator⟩ ⟨Operand⟩
⟨Operand⟩ → number
| id
| ⟨Operand⟩ '[' ⟨Expr⟩ ']'
| ⟨Operand⟩ '(' ⟨Actuals⟩ ')'
| '(' ⟨Expr⟩ ')'
⟨Operator⟩ → '+'
| '>'
| '=='
| 'AND'
⟨Actuals⟩ → ⟨ActualList⟩
| ε
⟨ActualList⟩ → ⟨Expr⟩
| ⟨Actuals⟩ ',' ⟨Expr⟩

where number is a terminal symbol that describes integer numbers, and id is a terminal symbol that describes identifiers made up of a single letter followed by a sequences of letters and digits.