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); }
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()); }
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()); }
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); }
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; } }