diff -r 06a0015b6a5c -r 32ad0523b309 src/Scanner.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Scanner.h Tue Jul 24 23:53:34 2012 -0700 @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2012 David Anderson + * + * This file is part of JITCraft. + * + * JITCraft is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free + * Software Foundation, either version 3 of the License, or (at your option) + * any later version. + * + * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * JITCraft. If not, see http://www.gnu.org/licenses/. + */ +#ifndef _include_jitcraft_scanner_h_ +#define _include_jitcraft_scanner_h_ + +#include +#include "Token.h" +#include "CompileContext.h" + +namespace ke { + +class Scanner +{ + CompileContext &cc_; + const char *stream_; + size_t length_; + bool pushed_; + char saved_; + const char *pos_; + std::string literal_; + TokenKind lastToken_; + SourcePosition last_; + SourcePosition cur_; + SourcePosition begin_; + + private: + char getChar(); + void putChar(char c); + void eatSingleLine(); + bool eatComment(); + void calcNewLine(char c); + int readEscapeCode(); + TokenKind stringLiteral(); + TokenKind numberLiteral(char first); + TokenKind identifier(char first); + + TokenKind next(); + + public: + Scanner(CompileContext &cc, const char *stream, size_t length); + + static double ParseDouble(const char *string); + + TokenKind scan(); + TokenKind peek(); + TokenKind last() const { + return lastToken_; + } + + // Beginning source position of the last instruction. + SourcePosition begin() const { + return begin_; + } + + // Note: the literal may have embedded NUL characters. + const char *literal() const { + return literal_.c_str(); + } + size_t literal_length() const { + return literal_.size(); + } +}; + +} // namespace ke + +#endif // _include_jitcraft_scanner_h_