示例#1
0
        private Expression Unary()
        {
            if (look.Tag == '-')
            {
                Move();
                return(new NegateExpression(Unary()));
            }
            if (look.Tag == '!')
            {
                Move();
                return(new NotExpression(Unary()));
            }
            if (look.Tag == Tags.INCR)
            {
                Move();
                Move();
                return(UnaryArithmeticExpression.CreatePreIncrement(VariableUseExpression()));
            }
            if (look.Tag == Tags.DECR)
            {
                Move();
                Move();
                return(UnaryArithmeticExpression.CreatePreDecrement(VariableUseExpression()));
            }

            return(Factor());
        }
示例#2
0
        private Expression Factor()
        {
            Expression expr = null;

            switch (look.Tag)
            {
            case '(':
                Move();
                expr = Bool();
                Match(')');
                return(expr);

            case Tags.NUMBER:
                IntegerToken token = (IntegerToken)look;
                expr = new IntConstantExpression(token.Value);
                Move();
                return(expr);

            case Tags.REAL:
                RealToken realToken = (RealToken)look;
                expr = new FloatConstantExpression(realToken.Value);
                Move();
                return(expr);

            case Tags.TRUE:
                Move();
                return(BoolConstantExpression.True);;

            case Tags.FALSE:
                Move();
                return(BoolConstantExpression.False);

            case Tags.ID:
                Move();

                if (look.Tag == '(')
                {
                    return(FuncCallExpression());
                }
                else
                {
                    VariableUseExpression varUseExpr = VariableUseExpression();
                    if (look.Tag == Tags.INCR)
                    {
                        Expression incrExpr = UnaryArithmeticExpression.CreatePostIncrement(varUseExpr);
                        Move();
                        return(incrExpr);
                    }
                    if (look.Tag == Tags.DECR)
                    {
                        Expression decrExpr = UnaryArithmeticExpression.CreatePostDecrement(varUseExpr);
                        Move();
                        return(decrExpr);
                    }
                    if (look.Tag == '=')
                    {
                        Move();
                        return(new VariableAssignExpression(varUseExpr, Bool()));
                    }

                    return(varUseExpr);
                }
            }

            Error("Syntax error");
            return(null);
        }