Example #1
0
        public override object Visit(BinaryOperationAstNode node)
        {
            var leftVal  = (dynamic)node.Left.Accept(this);
            var rightVal = (dynamic)node.Right.Accept(this);

            switch (node.Operation.Type)
            {
            // Relop
            case TokenType.EQ:
                return(leftVal == rightVal);

            case TokenType.NEQ:
                return(leftVal != rightVal);

            case TokenType.GT:
                return(leftVal > rightVal);

            case TokenType.LT:
                return(leftVal < rightVal);

            case TokenType.GTE:
                return(leftVal >= rightVal);

            case TokenType.LTE:
                return(leftVal <= rightVal);

            // Addop
            case TokenType.OR:
                return((bool)leftVal || (bool)rightVal);

            case TokenType.PLUS:
                return(leftVal + rightVal);

            case TokenType.MINUS:
                return(leftVal - rightVal);

            // Mulop
            case TokenType.AND:
                return((bool)leftVal && (bool)rightVal);

            case TokenType.MUL:
                return(leftVal * rightVal);

            case TokenType.DIV:
                return(leftVal / rightVal);
            }

            throw Error(node);
        }
Example #2
0
        /// <summary>
        /// simple_expression	: term
        ///						| term addop term
        /// </summary>
        private AstNode ParseSimpleExpression()
        {
            var node = ParseTerm();

            EatWhiteSpace();

            while (AddOp.Contains(CurrentToken.Type))
            {
                var token = CurrentToken;

                Eat(CurrentToken.Type);

                EatWhiteSpace();

                node = new BinaryOperationAstNode(token, node, ParseTerm());
            }

            return(node);
        }
Example #3
0
        /// <summary>
        /// term			: factor (mulop factor)*
        /// </summary>
        private AstNode ParseTerm()
        {
            // First parse the initial factor
            var node = ParseFactor();

            EatWhiteSpace();

            while (MulOp.Contains(CurrentToken.Type))
            {
                var token = CurrentToken;

                Eat(token.Type);

                // Eat further whitespace
                EatWhiteSpace();

                node = new BinaryOperationAstNode(token, node, ParseFactor());
            }

            return(node);
        }
Example #4
0
 public virtual object Visit(BinaryOperationAstNode node)
 {
     return(null);
 }