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