private AST Group2()
        {
            var ast = Group1();

            if (CurrentToken.TokenType == TokenType.Function)
            {
                if (ast != null)
                {
                    ThrowUnexpectedTokenTypeException();
                }

                switch (CurrentToken.Value)
                {
                case "ToString":
                    ast = new ToStringFunction(CurrentToken);
                    break;

                case "DateTime.Now":
                    ast = new DateTimeFunction(CurrentToken);
                    break;

                case "string.Concat":
                    ast = new StringConcatFunction(CurrentToken);
                    break;

                case "AddMonths":
                    ast = new AddMonths(CurrentToken);
                    break;

                default:
                    ThrowUnexpectedTokenTypeException();
                    break;
                }

                CurrentToken = _lexer.GetNextToken();

                if (CurrentToken.TokenType != TokenType.OpenParenthesis)
                {
                    ThrowUnexpectedTokenTypeException();
                }

                CurrentToken = _lexer.GetNextToken();

                while (CurrentToken.TokenType != TokenType.CloseParenthesis)
                {
                    ast.ChildNodes.Add(Group10());

                    if (CurrentToken.TokenType == TokenType.Separator)
                    {
                        CurrentToken = _lexer.GetNextToken();
                    }
                }

                CurrentToken = _lexer.GetNextToken();
            }

            return(ast);
        }
        private AST Group10()
        {
            var ast = Group6();

            if (ast == null)
            {
                ThrowUnexpectedTokenTypeException();
            }

            while (CurrentToken.TokenType == TokenType.StringConcat)
            {
                var token = CurrentToken;

                CurrentToken = _lexer.GetNextToken();

                ast = new StringConcatFunction(ast, token, Group6());
            }

            return(ast);
        }