private RqlTupleExpression ParseTuple(RqlToken leftParenToken) { var constants = new List <RqlConstantExpression>(); Type itemType = null; while (true) { RqlToken token = tokenizer.Next(); if (token.IsConstant) { if (itemType == null) { itemType = token.Data.GetType(); } else if (token.Data.GetType() != itemType) { throw new RqlParseException(token, "Tuple items must all be of the same type"); } constants.Add(RqlExpression.Constant(token)); } else { throw new RqlParseException(token); } token = tokenizer.Next(); if (token.IsComma) { continue; } else if (token.IsRightParen) { break; } else { throw new RqlParseException(token); } } return(RqlExpression.Tuple(leftParenToken, constants)); }
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)); }