<Program>    <Block> | <Block> ;
<DeclList>    <Decl> | <Decl> ; <DeclList> | ε
<Decl>    VAR id : <Type> | TYPE id = <Type> | <ProcDecl>
<ProcDecl>    PROCEDURE id ( <Formals> ) : <Type> = <Block> 
 | PROCEDURE id (<Formals>) = <Block>
<Formals>    <FormalList> | ε
<FormalList>    <Formal> | <FormalList> ; <Formal>
<Formal>    id : <Type>
<Type>    INTEGER | <SubrTy> | <ArrayTy> | id | <ProcTy>
<SubrTy>    [ Number TO Number]
<ArrayTy>    ARRAY <SubrTy> OF <Type>
<ProcTy>    PROCEDURE ( <Formals> ) : <Type> | PROCEDURE (<Formals>)
<Block>    <DeclList> BEGIN <StmtList> END
<StmtList>    <Stmt> | <Stmt> ; <StmtList> | ε
<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> | <ActualList> , <Expr>


Notes: