public TSQLArgumentList Parse(ITSQLTokenizer tokenizer) { List <TSQLToken> tokens = new List <TSQLToken>(); // need to do this before starting the argument loop // so we can handle an empty argument list of just whitespace // and comments TSQLTokenParserHelper.ReadCommentsAndWhitespace( tokenizer, tokens); TSQLValueAsTypeExpression argument = new TSQLValueAsTypeExpression(); TSQLExpression expression = new TSQLValueExpressionParser().Parse(tokenizer); argument.Expression = expression; tokens.AddRange(expression.Tokens); TSQLTokenParserHelper.ReadCommentsAndWhitespace( tokenizer, tokens); if (!tokenizer.Current.IsKeyword(TSQLKeywords.AS)) { throw new InvalidOperationException("AS expected."); } tokens.Add(tokenizer.Current); TSQLTokenParserHelper.ReadThroughAnyCommentsOrWhitespace( tokenizer, tokens); argument.DataType = tokenizer.Current.AsIdentifier; tokens.Add(tokenizer.Current); // reading until closing paren TSQLTokenParserHelper.ReadThroughAnyCommentsOrWhitespace( tokenizer, tokens); TSQLArgumentList argList = new TSQLArgumentList( new List <TSQLExpression> { argument }); argList.Tokens.AddRange(tokens); return(argList); }
public TSQLArgumentList Parse(ITSQLTokenizer tokenizer) { List <TSQLExpression> arguments = new List <TSQLExpression>(); TSQLValueExpressionParser factory = new TSQLValueExpressionParser(); List <TSQLToken> tokens = new List <TSQLToken>(); // need to do this before starting the argument loop // so we can handle an empty argument list of just whitespace // and comments TSQLTokenParserHelper.ReadCommentsAndWhitespace( tokenizer, tokens); while ( tokenizer.Current != null && !tokenizer.Current.IsCharacter(TSQLCharacters.CloseParentheses)) { TSQLTokenParserHelper.ReadCommentsAndWhitespace( tokenizer, tokens); TSQLExpression argument = factory.Parse(tokenizer); tokens.AddRange(argument.Tokens); arguments.Add(argument); if (tokenizer.Current.IsCharacter(TSQLCharacters.Comma)) { tokens.Add(tokenizer.Current); tokenizer.MoveNext(); TSQLTokenParserHelper.ReadCommentsAndWhitespace( tokenizer, tokens); } } TSQLArgumentList argList = new TSQLArgumentList( arguments); argList.Tokens.AddRange(tokens); return(argList); }
public TSQLOperatorExpression Parse( ITSQLTokenizer tokenizer, TSQLExpression leftSide) { TSQLOperatorExpression opExpression = new TSQLOperatorExpression(); opExpression.LeftSide = leftSide; opExpression.Operator = tokenizer.Current.AsOperator; if (leftSide != null) { opExpression.Tokens.AddRange(leftSide.Tokens); } opExpression.Tokens.Add(tokenizer.Current); while ( tokenizer.MoveNext() && ( tokenizer.Current.IsWhitespace() || tokenizer.Current.IsComment() )) { opExpression.Tokens.Add(tokenizer.Current); } TSQLExpression rightSide = new TSQLValueExpressionParser().Parse( tokenizer); // a + (b + (c + d)) if ( tokenizer.Current != null && tokenizer.Current.Type.In( TSQLTokenType.Operator)) { rightSide = Parse( tokenizer, rightSide); } opExpression.RightSide = rightSide; opExpression.Tokens.AddRange(rightSide.Tokens); return(opExpression); }
public TSQLVariableAssignmentExpression Parse( ITSQLTokenizer tokenizer, TSQLVariableExpression variable) { TSQLVariableAssignmentExpression opExpression = new TSQLVariableAssignmentExpression(); opExpression.Variable = variable.Variable; opExpression.Operator = tokenizer.Current.AsOperator; opExpression.Tokens.AddRange(variable.Tokens); opExpression.Tokens.Add(tokenizer.Current); while ( tokenizer.MoveNext() && ( tokenizer.Current.IsWhitespace() || tokenizer.Current.IsComment() )) { opExpression.Tokens.Add(tokenizer.Current); } TSQLExpression rightSide = new TSQLValueExpressionParser().Parse( tokenizer); // TODO: add test for nested operators like below // a + (b + (c + d)) if ( tokenizer.Current != null && tokenizer.Current.Type.In( TSQLTokenType.Operator)) { rightSide = new TSQLOperatorExpressionParser().Parse( tokenizer, rightSide); } opExpression.ValueExpression = rightSide; opExpression.Tokens.AddRange(rightSide.Tokens); return(opExpression); }