Пример #1
0
        private void ReadWhitespace()
        {
            PreCondition.AssertTrue(this.characters.HasCurrent(), "this.characters.HasCurrent()");
            PreCondition.AssertTrue(PkgdefTokenizer.IsWhitespaceCharacter(this.characters.GetCurrent()), "PkgdefTokenizer.IsWhitespaceCharacter(this.characters.GetCurrent())");

            PkgdefToken   newLineToken = null;
            int           startIndex   = this.characters.GetCurrentIndex();
            StringBuilder builder      = new StringBuilder();

            while (this.characters.HasCurrent() && PkgdefTokenizer.IsWhitespaceCharacter(this.characters.GetCurrent()))
            {
                if (this.characters.GetCurrent() != '\r')
                {
                    builder.Append(this.characters.TakeCurrent());
                }
                else
                {
                    int newLineStartIndex = this.characters.GetCurrentIndex();
                    if (this.characters.Next() && this.characters.GetCurrent() == '\n')
                    {
                        newLineToken = PkgdefToken.NewLine(newLineStartIndex, "\r\n");
                        this.characters.Next();
                        break;
                    }
                    else
                    {
                        builder.Append('\r');
                    }
                }
            }

            if (builder.Length > 0)
            {
                this.tokenQueue.Enqueue(PkgdefToken.Whitespace(startIndex, builder.ToString()));
            }
            if (newLineToken != null)
            {
                this.tokenQueue.Enqueue(newLineToken);
            }
        }
Пример #2
0
        /// <inheritdoc/>
        public override bool MoveNext()
        {
            this.characters.EnsureHasStarted();
            this.hasStarted = true;

            if (this.HasCurrent())
            {
                this.tokenQueue.Dequeue();
            }

            if (this.characters.HasCurrent())
            {
                switch (this.characters.GetCurrent())
                {
                case '/':
                    this.tokenQueue.Enqueue(PkgdefToken.ForwardSlash(this.characters.GetCurrentIndex()));
                    this.characters.Next();
                    break;

                case '\\':
                    this.tokenQueue.Enqueue(PkgdefToken.Backslash(this.characters.GetCurrentIndex()));
                    this.characters.Next();
                    break;

                case '\"':
                    this.tokenQueue.Enqueue(PkgdefToken.DoubleQuote(this.characters.GetCurrentIndex()));
                    this.characters.Next();
                    break;

                case '@':
                    this.tokenQueue.Enqueue(PkgdefToken.AtSign(this.characters.GetCurrentIndex()));
                    this.characters.Next();
                    break;

                case '\n':
                    this.tokenQueue.Enqueue(PkgdefToken.NewLine(this.characters.GetCurrentIndex(), "\n"));
                    this.characters.Next();
                    break;

                case '=':
                    this.tokenQueue.Enqueue(PkgdefToken.EqualsSign(this.characters.GetCurrentIndex()));
                    this.characters.Next();
                    break;

                case '$':
                    this.tokenQueue.Enqueue(PkgdefToken.DollarSign(this.characters.GetCurrentIndex()));
                    this.characters.Next();
                    break;

                case '[':
                    this.tokenQueue.Enqueue(PkgdefToken.LeftSquareBracket(this.characters.GetCurrentIndex()));
                    this.characters.Next();
                    break;

                case ']':
                    this.tokenQueue.Enqueue(PkgdefToken.RightSquareBracket(this.characters.GetCurrentIndex()));
                    this.characters.Next();
                    break;

                case ':':
                    this.tokenQueue.Enqueue(PkgdefToken.Colon(this.characters.GetCurrentIndex()));
                    this.characters.Next();
                    break;

                case '{':
                    this.tokenQueue.Enqueue(PkgdefToken.LeftCurlyBracket(this.characters.GetCurrentIndex()));
                    this.characters.Next();
                    break;

                case '}':
                    this.tokenQueue.Enqueue(PkgdefToken.RightCurlyBracket(this.characters.GetCurrentIndex()));
                    this.characters.Next();
                    break;

                case '-':
                    this.tokenQueue.Enqueue(PkgdefToken.Dash(this.characters.GetCurrentIndex()));
                    this.characters.Next();
                    break;

                default:
                    if (PkgdefTokenizer.IsWhitespaceCharacter(this.characters.GetCurrent()))
                    {
                        this.ReadWhitespace();
                    }
                    else if (PkgdefTokenizer.IsLetter(this.characters.GetCurrent()))
                    {
                        this.ReadLetters();
                    }
                    else if (PkgdefTokenizer.IsDigit(this.characters.GetCurrent()))
                    {
                        this.ReadDigits();
                    }
                    else
                    {
                        this.tokenQueue.Enqueue(PkgdefToken.Unrecognized(characters.GetCurrentIndex(), characters.GetCurrent()));
                        this.characters.Next();
                    }
                    break;
                }
            }

            return(this.HasCurrent());
        }