Program --> VarDeclList FunDeclList VarDeclList --> epsilon VarDecl VarDeclList VarDecl --> Type id ; Type id [ num] ; FunDeclList --> FunDecl FunDecl FunDeclList FunDecl --> Type id ( ParamDecList ) Block ParamDeclList --> epsilon ParamDeclListTail ParamDeclListTail --> ParamDecl ParamDecl, ParamDeclListTail ParamDecl --> Type id Type id[] Block --> { VarDeclList StmtList } Type --> int char StmtList --> Stmt Stmt StmtList Stmt --> ; Expr ; return Expr ; read id ; write Expr ; writeln ; break ; if ( Expr ) Stmt else Stmt while ( Expr ) Stmt Block Expr --> Primary UnaryOp Expr Expr BinOp Expr id = Expr id [ Expr ] = Expr Primary --> id num ( Expr ) id ( ExprList ) id [ Expr ] ExprList --> epsilon ExprListTail ExprListTail --> Expr Expr , ExprListTail UnaryOp --> - | ! BinOp --> + | - | * | / == | != < | <= | > | >= && | ||