Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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));
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
 public Core.Expr Desugar(Surface.Expr expr)
 {
     return(expr.Accept(this));
 }
Esempio n. 5
0
 public void Print(Surface.Expr expr)
 {
     expr.Accept(this);
 }