private RqlExpression ParseExpression(RqlToken functionToken) { RqlToken token = tokenizer.Next(); if (!token.IsLeftParen) { throw new RqlParseException(token); } var arguments = new List <RqlExpression>(); while (true) { token = tokenizer.Next(); RqlExpression argument = null; if (token.IsIdentifier) { if (tokenizer.PeekNext().IsLeftParen) { argument = ParseExpression(token); } else { argument = RqlExpression.Identifier(token); } } else if (token.IsConstant) { argument = RqlExpression.Constant(token); } else if (token.IsLeftParen) { argument = ParseTuple(token); } else { throw new RqlParseException(token); } arguments.Add(argument); token = tokenizer.Next(); if (token.IsComma) { continue; } else if (token.IsRightParen) { break; } else { throw new RqlParseException(token); } } return(RqlExpression.FunctionCall(functionToken, arguments)); }