コード例 #1
0
        private IExpressionNode ParseBinaryExpression(IExpressionNode left, IExpressionNode right, TokenType token, bool isInternalCall)
        {
            bool returnEmptyNode = false;
            List<IExpressionNode> nodes = null;
            List<TokenType> tokens = null;
            if (isInternalCall)
            {
                nodes = _nodes;
                tokens = _tokens;
                returnEmptyNode = nodes != null;
            }

            if (!IsBinaryToken() && !returnEmptyNode)
                return new BinaryExpressionNode(left, right, token);
            if (nodes == null)
                nodes = new List<IExpressionNode>();
            if (tokens == null)
                tokens = new List<TokenType>();
            nodes.Add(left);
            nodes.Add(right);
            tokens.Add(token);

            var oldTokens = _tokens;
            var oldNodes = _nodes;
            _nodes = nodes;
            _tokens = tokens;
            try
            {
                do
                {
                    token = Tokenizer.Token;
                    if (!BinaryOperationTokens.ContainsKey(token))
                        token = BinaryOperationAliases[Tokenizer.Value];
                    NextToken(true);
                    tokens.Add(token);
                    nodes.AddIfNotNull(ParseUnary());
                } while (IsBinaryToken());
            }
            finally
            {
                _tokens = oldTokens;
                _nodes = oldNodes;
            }
            if (returnEmptyNode)
                return null;

            int index = GetMaxPriorityTokenIndex(tokens);
            while (index != -1)
            {
                token = tokens[index];
                tokens.RemoveAt(index);
                nodes[index] = new BinaryExpressionNode(nodes[index], nodes[index + 1], token);
                nodes.RemoveAt(index + 1);
                index = GetMaxPriorityTokenIndex(tokens);
            }
            return nodes[0];
        }
コード例 #2
0
 protected virtual IExpressionNode ParseBinaryExpression(IExpressionNode left = null)
 {
     if (left == null)
         left = ParseUnary();
     if (IsBinaryToken())
     {
         TokenType token = Tokenizer.Token;
         if (!BinaryOperationTokens.ContainsKey(token))
             token = BinaryOperationAliases[Tokenizer.Value];
         NextToken(true);
         IExpressionNode right = ParseUnary();
         left = ParseBinaryExpression(left, right, token, false);
     }
     if (Tokenizer.Token == TokenType.Question)
     {
         NextToken(true);
         IExpressionNode expr1 = ParseExpression();
         ValidateToken(TokenType.Colon);
         NextToken(true);
         IExpressionNode expr2 = ParseExpression();
         left = new ConditionExpressionNode(left, expr1, expr2);
     }
     if (Tokenizer.Token == TokenType.DoubleQuestion)
     {
         NextToken(true);
         IExpressionNode right = ParseExpression();
         left = new BinaryExpressionNode(left, right, TokenType.DoubleQuestion);
     }
     return left;
 }