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);
        }
Exemplo n.º 2
0
        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);
        }