private Surface.Expr Term() { Surface.Expr left = Factor(); int type = lookahead.Type; switch (type) { case SchoolLexer.MUL: case SchoolLexer.DIV: Consume(); break; default: return(left); } Surface.Expr right = Term(); Surface.Expr expr; switch (type) { case SchoolLexer.MUL: expr = new Surface.Mul(left, right); break; case SchoolLexer.DIV: expr = new Surface.Div(left, right); break; default: throw new ParserException("unreachable code"); } return(expr); }
public static void Main(string[] args) { var input = "1 * (2 + 3) - 4"; Console.Write("Input:\n {0}\n\n", input); var lexer = new SchoolLexer(input); var parser = new SchoolParser(lexer); Surface.Expr expr = parser.Parse(); Console.WriteLine("Print:"); var printer = new Printer(); printer.Print(expr); Console.Write("\n\n"); var desugarer = new Desugarer(); Core.Expr coreExpr = desugarer.Desugar(expr); var evaluator = new Evaluator(); Console.Write("Result:\n{0}\n\n", evaluator.Evaluate(coreExpr)); }
private Surface.Expr Expr() { Surface.Expr left = Term(); int type = lookahead.Type; switch (type) { case SchoolLexer.ADD: case SchoolLexer.SUB: Consume(); break; default: return(left); } Surface.Expr right = Expr(); Surface.Expr expr; switch (type) { case SchoolLexer.ADD: expr = new Surface.Add(left, right); break; case SchoolLexer.SUB: expr = new Surface.Sub(left, right); break; default: throw new ParserException("unreachable code"); } return(expr); }
public Core.Expr Desugar(Surface.Expr expr) { return(expr.Accept(this)); }
public void Print(Surface.Expr expr) { expr.Accept(this); }