Example #1
0
        private static Token ReadSymbol(LocatedTextReaderWrapper input)
        {
            var curToken = "";

            while(input.Peek() >= 0) {
                char nextCharacter = (char)input.Peek();

                if(!IsSymbolChar(nextCharacter)) {
                    break;
                }

                string newToken = curToken + nextCharacter;

                if(!IsSymbolStart(newToken)) {
                    break;
                }

                curToken = newToken;

                input.Read();   // Discard.
            }

            return new Token(TokenType.Symbol, curToken);
        }
Example #2
0
        private static Token ReadString(LocatedTextReaderWrapper input)
        {
            var str = new StringBuilder();

            input.Read(); // Consume ".

            while(true) {
                int rawChar = input.Read();

                if(rawChar < 0) {
                    throw new MissingDataException("End-of-string terminator", input.Location);
                }

                char nextCharacter = (char)rawChar;

                if(nextCharacter == '"') {
                    break;
                }

                if(nextCharacter == '\\') {
                    nextCharacter = ReadEscapeCode(input);
                }

                str.Append(nextCharacter);
            }

            return new Token(TokenType.String, str.ToString());
        }
Example #3
0
        private static Token ReadIdentifier(LocatedTextReaderWrapper input)
        {
            var token = new StringBuilder();

            while(input.Peek() >= 0) {
                char nextCharacter = (char)input.Peek();

                if(!IsIdentifierChar(nextCharacter)) {
                    break;
                }

                token.Append(nextCharacter);

                input.Read();   // Discard.
            }

            return new Token(TokenType.Identifier, token.ToString());
        }
Example #4
0
        private static Token ReadNumber(LocatedTextReaderWrapper input)
        {
            var startLocation = input.Location.Clone();

            var numberString = new StringBuilder();

            while(IsNumberChar((char)input.Peek())) {
                numberString.Append((char)input.Read());
            }

            double number;

            if(!double.TryParse(numberString.ToString(), NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, Parser.DefaultCulture, out number)) {
                throw new BadDataException("Number", startLocation);
            }

            return new Token(TokenType.Number, number);
        }
Example #5
0
        private static char ReadEscapeCode(LocatedTextReaderWrapper input)
        {
            int nextCharacter = input.Read();

            if(nextCharacter < 0) {
                throw new MissingDataException("Code following \\", input.Location);
            }

            switch((char)nextCharacter) {
                case 'n':
                    return '\n';

                case 't':
                    return '\t';

                case 'r':
                    return '\r';

                case '\\':
                    return '\\';

                case '"':
                    return '"';

                default:
                    var e = new BadDataException("Unknown escape character", input.Location);
                    e.Data["character"] = (char)nextCharacter;
                    throw e;
            }
        }