public Token.Token NextToken() { SkipWhiteSpace(); if (EndOfSource()) { return null; } if ("{}}[]:,".Contains(lookahead)) { Token.Token ret = new Token.Token(Token.TokenType.SYMBOL, lookahead.ToString()); Advance(); return ret; } else if (lookahead == '"') { return String(); } else if (Char.IsDigit(lookahead)) { return Number(); } else { return Word(); } }
private Token.Token String() { String val = ""; char prev = lookahead; while (true) { Advance(); if (prev == '\\') { switch (lookahead) { case 'n': val += '\n'; break; case 'r': val += '\r'; break; case '\\': val += '\\'; break; case '"': val += '"'; break; default: throw new InvalidLexemeException("Invalid escape sequence \\" + lookahead); } } else { if (lookahead == '"') { Token.Token ret = new Token.Token(Token.TokenType.STRING, val); Advance(); return ret; } val += lookahead; } prev = lookahead; } }
private void Advance() { currentToken = lexer.NextToken(); }