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]; }
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; }