COMPILER Taste Proc curProc; // current program unit (procedure or main program) CHARACTERS letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz". digit = "0123456789". cr = '\r'. lf = '\n'. tab = '\t'. TOKENS ident = letter {letter | digit}. number = digit {digit}. COMMENTS FROM "/*" TO "*/" NESTED COMMENTS FROM "//" TO lf IGNORE cr + lf + tab PRODUCTIONS /*=================== Program and declarations ============================*/ Taste (. String name; .) = "program" Ident (. curProc = new Proc(name, null, this); .) "{" { VarDecl | ProcDecl } "}" (. for (Obj obj: curProc.locals) { if (obj instanceof Proc) ((Proc)obj).dump(); } .). /*------------------------------------------------------------------------*/ VarDecl (. String name; Type type; .) = Typ Ident (. curProc.add(new Var(name, type)); .) { ',' Ident (. curProc.add(new Var(name, type)); .) } ';'. /*------------------------------------------------------------------------*/ Typ = (. type = Type.INT; .) ( "int" | "bool" (. type = Type.BOOL; .) ). /*------------------------------------------------------------------------*/ ProcDecl (. String name; .) = "void" Ident (. Proc oldProc = curProc; curProc = new Proc(name, oldProc, this); oldProc.add(curProc); .) '(' ')' Block (. curProc = oldProc; .). /*============================= Statements ===============================*/ Block (. Stat s; .) = '{' (. b = new Block(); .) { Stat (. b.add(s); .) | VarDecl } '}' . /*------------------------------------------------------------------------*/ Stat (. String name; Expr e; Stat s2; Block b; .) = (. s = null; .) ( Ident (. Obj obj = curProc.find(name); .) ( '=' Expr ';' (. s = new Assignment(obj, e); .) | '(' ')' ';' (. s = new Call(obj); .) ) | "if" '(' Expr ')' Stat (. s = new If(e, s); .) [ "else" Stat (. s = new IfElse(s, s2); .) ] | "while" '(' Expr ')' Stat (. s = new While(e, s); .) | "read" Ident ';' (. s = new Read(curProc.find(name)); .) | "write" Expr ';' (. s = new Write(e); .) | Block (. s = b; .) ). /*============================ Expressions ===============================*/ Expr (. Operator op; Expr e2; .) = SimExpr [ RelOp SimExpr (. e = new BinExpr(e, op, e2); .) ]. /*------------------------------------------------------------------------*/ SimExpr (. Operator op; Expr e2; .) = Term { AddOp Term (. e = new BinExpr(e, op, e2); .) }. /*------------------------------------------------------------------------*/ Term (. Operator op; Expr e2; .) = Factor { MulOp Factor (. e = new BinExpr(e, op, e2); .) }. /*------------------------------------------------------------------------*/ Factor (. String name; .) = (. e = null; .) ( Ident (. e = new Ident(curProc.find(name)); .) | number (. e = new IntCon(Integer.parseInt(t.val)); .) | '-' Factor (. e = new UnaryExpr(Operator.SUB, e); .) | "true" (. e = new BoolCon(true); .) | "false" (. e = new BoolCon(false); .) ). /*------------------------------------------------------------------------*/ Ident = ident (. name = t.val; .). /*------------------------------------------------------------------------*/ AddOp = (. op = Operator.ADD; .) ( '+' | '-' (. op = Operator.SUB; .) ). /*------------------------------------------------------------------------*/ MulOp = (. op = Operator.MUL; .) ( '*' | '/' (. op = Operator.DIV; .) ). /*------------------------------------------------------------------------*/ RelOp = (. op = Operator.EQU; .) ( "==" | '<' (. op = Operator.LSS; .) | '>' (. op = Operator.GTR; .) ). END Taste.