Пример #1
0
        private StatementTail ParseSingleStatementTail(Stream stream, StatementTail tail)
        {
            var statementList = ParseStatement(stream);

            //Parrot.Debugger.Debug.WriteLine("Found Single statement tail");
            if (tail == null)
            {
                tail = new StatementTail();
            }
            tail.Children = statementList;

            return(tail);
        }
Пример #2
0
        private Statement GetStatementFromToken(Token identifier, StatementTail tail, Token previousToken = null)
        {
            var value = identifier != null ? identifier.Content : "";

            if (identifier != null)
            {
                switch (identifier.Type)
                {
                case TokenType.StringLiteral:
                case TokenType.QuotedStringLiteral:
                    return(new StringLiteral(value, tail)
                    {
                        Index = identifier.Index
                    });

                case TokenType.StringLiteralPipe:
                    return(new StringLiteralPipe(value.Substring(1), tail)
                    {
                        Index = identifier.Index
                    });
                }
            }

            if (previousToken != null)
            {
                switch (previousToken.Type)
                {
                case TokenType.At:
                    return(new EncodedOutput(value)
                    {
                        Index = previousToken.Index
                    });

                case TokenType.Equal:
                    return(new RawOutput(value)
                    {
                        Index = previousToken.Index
                    });
                }
            }

            return(new Statement(value, tail)
            {
                Index = identifier.Index
            });
        }
Пример #3
0
        private Statement GetStatementFromToken(Token identifier, StatementTail tail)
        {
            var value = identifier != null ? identifier.Content : "";
            if (identifier != null)
            {
                switch (identifier.Type)
                {
                    case TokenType.StringLiteral:
                        return new StringLiteral(_host, value);
                    case TokenType.QuotedStringLiteral:
                        return new StringLiteral(_host, value);
                    case TokenType.StringLiteralPipe:
                        return new StringLiteralPipe(_host, value.Substring(1));
                    case TokenType.MultiLineStringLiteral:
                        return new StringLiteral(_host, value);
                }
            }

            return new Statement(_host, value, tail);
        }
Пример #4
0
        private Statement GetStatementFromToken(Token identifier, StatementTail tail)
        {
            var value = identifier != null ? identifier.Content : "";

            if (identifier != null)
            {
                switch (identifier.Type)
                {
                case TokenType.StringLiteral:
                    return(new StringLiteral(_host, value));

                case TokenType.QuotedStringLiteral:
                    return(new StringLiteral(_host, value));

                case TokenType.StringLiteralPipe:
                    return(new StringLiteralPipe(_host, value.Substring(1)));

                case TokenType.MultiLineStringLiteral:
                    return(new StringLiteral(_host, value));
                }
            }

            return(new Statement(_host, value, tail));
        }
Пример #5
0
 public StringLiteralPipe(string value, StatementTail statementTail)
     : base("\"" + value + "\"", statementTail)
 {
 }
Пример #6
0
        /// <summary>
        /// Parses a token stream creating the largest statement possible
        /// </summary>
        /// <param name="stream">Stream of tokens to parse</param>
        /// <returns>Statement</returns>
        private StatementList ParseStatement(Stream stream)
        {
            var previousToken = stream.Peek();

            if (previousToken == null)
            {
                Errors.Add(new EndOfStreamException());
                return(new StatementList());
            }

            var   tokenType  = previousToken.Type;
            Token identifier = null;

            switch (tokenType)
            {
            case TokenType.Identifier:
                //standard identifier
                identifier = stream.Next();
                break;

            case TokenType.OpenBracket:
            case TokenType.OpenParenthesis:
                //ignore these
                break;

            case TokenType.StringLiteral:
            case TokenType.StringLiteralPipe:
            case TokenType.QuotedStringLiteral:
                //string statement
                identifier = stream.Next();
                break;

            case TokenType.At:
                stream.GetNextNoReturn();
                identifier = stream.Next();
                break;

            case TokenType.Equal:
                stream.GetNextNoReturn();
                identifier = stream.Next();
                break;

            default:
                Errors.Add(new UnexpectedToken(previousToken));
                return(new StatementList());
                //throw new ParserException(stream.Peek());
            }


            Statement     statement;
            StatementTail tail = null;

            while (stream.Peek() != null)
            {
                var token = stream.Peek();
                if (token == null)
                {
                    break;
                }

                switch (token.Type)
                {
                case TokenType.OpenParenthesis:
                case TokenType.OpenBracket:
                case TokenType.OpenBrace:
                    tail = ParseStatementTail(stream);
                    break;

                case TokenType.GreaterThan:
                    //consume greater than
                    stream.NextNoReturn();

                    //might be a single child or a statement list of siblings
                    tail = ParseSingleStatementTail(stream, tail);
                    break;

                case TokenType.StringLiteralPipe:
                    if (previousToken is StringLiteralPipeToken)
                    {
                        //if the previous token was a string literal pipe then we don't continue processing
                        goto default;
                    }
                    //this overrides all previous tail elements
                    tail = ParseSingleStatementTail(stream, tail);
                    break;

                default:
                    GetStatementFromToken(identifier, tail);
                    goto checkForSiblings;
                }
            }


checkForSiblings:
            statement = GetStatementFromToken(identifier, tail, previousToken);


            var list = new StatementList();

            list.Add(statement);

            while (stream.Peek() != null)
            {
                //Parrot.Debugger.Debug.WriteLine("Looking for siblings");
                if (stream.Peek().Type == TokenType.Plus)
                {
                    //it's now a statementlist not a statement
                    stream.NextNoReturn();
                    var siblings = ParseStatement(stream);
                    foreach (var sibling in siblings)
                    {
                        list.Add(sibling);
                    }
                }
                else
                {
                    break;
                }
            }

            return(list);
        }
Пример #7
0
 public StringLiteralPipe(string value, StatementTail statementTail) : base("\"" + value + "\"", statementTail)
 {
 }
Пример #8
0
        /// <summary>
        /// Parses a token stream creating the largest statement possible
        /// </summary>
        /// <param name="stream">Stream of tokens to parse</param>
        /// <returns>Statement</returns>
        private StatementList ParseStatement(Stream stream)
        {
            var   tokenType  = stream.Peek().Type;
            Token identifier = null;

            switch (tokenType)
            {
            case TokenType.Identifier:
                //standard identifier
                identifier = stream.Next();
                break;

            case TokenType.OpenBracket:
            case TokenType.OpenParenthesis:
                //ignore these
                break;

            case TokenType.StringLiteral:
            case TokenType.MultiLineStringLiteral:
            case TokenType.StringLiteralPipe:
            case TokenType.QuotedStringLiteral:
                //string statement
                identifier = stream.Next();
                break;
            }


            Statement     statement = null;
            StatementTail tail      = null;

            while (stream.Peek() != null)
            {
                var token = stream.Peek();
                if (token == null)
                {
                    break;
                }

                switch (token.Type)
                {
                case TokenType.OpenParenthesis:
                case TokenType.OpenBrace:
                case TokenType.OpenBracket:
                    tail = ParseStatementTail(stream);
                    break;

                case TokenType.GreaterThan:
                    //consume greater than
                    stream.NextNoReturn();

                    //might be a single child or a statement list of siblings
                    tail = ParseSingleStatementTail(stream);
                    break;

                case TokenType.Colon:
                    //next thing must be an identifier
                    var colon = stream.Next();
                    identifier = stream.Next();
                    statement  = new EncodedOutput(_host, identifier.Content);
                    goto checkForSiblings;

                case TokenType.Equal:
                    //next thing must be an identifier
                    var equal = stream.Next();
                    identifier = stream.Next();
                    statement  = new RawOutput(_host, identifier.Content);
                    goto checkForSiblings;

                default:
                    statement = GetStatementFromToken(identifier, tail);
                    goto checkForSiblings;
                }
            }

            statement = GetStatementFromToken(identifier, tail);

checkForSiblings:


            var list = new StatementList(_host);

            list.Add(statement);

            while (stream.Peek() != null)
            {
                //Parrot.Debugger.Debug.WriteLine("Looking for siblings");
                if (stream.Peek().Type == TokenType.Plus)
                {
                    //it's now a statementlist not a statement
                    stream.NextNoReturn();
                    var siblings = ParseStatement(stream);
                    foreach (var sibling in siblings)
                    {
                        list.Add(sibling);
                    }
                }
                else
                {
                    break;
                }
            }

            return(list);
        }