diff options
Diffstat (limited to 'third_party/wasm2c/include/wabt/wast-lexer.h')
-rw-r--r-- | third_party/wasm2c/include/wabt/wast-lexer.h | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/third_party/wasm2c/include/wabt/wast-lexer.h b/third_party/wasm2c/include/wabt/wast-lexer.h new file mode 100644 index 0000000000..80bdfe7bb4 --- /dev/null +++ b/third_party/wasm2c/include/wabt/wast-lexer.h @@ -0,0 +1,117 @@ +/* + * Copyright 2016 WebAssembly Community Group participants + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef WABT_WAST_LEXER_H_ +#define WABT_WAST_LEXER_H_ + +#include <cstddef> +#include <cstdio> +#include <memory> + +#include "wabt/common.h" +#include "wabt/error.h" +#include "wabt/lexer-source-line-finder.h" +#include "wabt/literal.h" +#include "wabt/opcode.h" +#include "wabt/token.h" + +namespace wabt { + +class ErrorHandler; +class LexerSource; + +class WastLexer { + public: + WABT_DISALLOW_COPY_AND_ASSIGN(WastLexer); + + WastLexer(std::unique_ptr<LexerSource> source, + std::string_view filename, + Errors*); + + // Convenience functions. + static std::unique_ptr<WastLexer> CreateBufferLexer(std::string_view filename, + const void* data, + size_t size, + Errors*); + + Token GetToken(); + + // TODO(binji): Move this out of the lexer. + std::unique_ptr<LexerSourceLineFinder> MakeLineFinder() { + return std::make_unique<LexerSourceLineFinder>(source_->Clone()); + } + + private: + static constexpr int kEof = -1; + enum class CharClass { IdChar = 1, Keyword = 2, HexDigit = 4, Digit = 8 }; + + Location GetLocation(); + std::string_view GetText(size_t offset = 0); + + Token BareToken(TokenType); + Token LiteralToken(TokenType, LiteralType); + Token TextToken(TokenType, size_t offset = 0); + + int PeekChar(); + int ReadChar(); + bool MatchChar(char); + bool MatchString(std::string_view); + void Newline(); + bool ReadBlockComment(); // Returns false if EOF. + bool ReadLineComment(); // Returns false if EOF. + void ReadWhitespace(); + + static bool IsCharClass(int c, CharClass); + static bool IsDigit(int c) { return IsCharClass(c, CharClass::Digit); } + static bool IsHexDigit(int c) { return IsCharClass(c, CharClass::HexDigit); } + static bool IsKeyword(int c) { return IsCharClass(c, CharClass::Keyword); } + static bool IsIdChar(int c) { return IsCharClass(c, CharClass::IdChar); } + + bool ReadNum(); + bool ReadHexNum(); + + enum class ReservedChars { None, Some, Id }; + ReservedChars ReadReservedChars(); + bool NoTrailingReservedChars() { + return ReadReservedChars() == ReservedChars::None; + } + void ReadSign(); + Token GetStringToken(); + Token GetNumberToken(TokenType); + Token GetHexNumberToken(TokenType); + Token GetInfToken(); + Token GetNanToken(); + Token GetNameEqNumToken(std::string_view name, TokenType); + Token GetIdChars(); + Token GetKeywordToken(); + Token GetReservedToken(); + + std::unique_ptr<LexerSource> source_; + std::string filename_; + int line_; + const char* buffer_; + const char* buffer_end_; + const char* line_start_; + const char* token_start_; + const char* cursor_; + + Errors* errors_; + void WABT_PRINTF_FORMAT(3, 4) Error(Location, const char* format, ...); +}; + +} // namespace wabt + +#endif /* WABT_WAST_LEXER_H_ */ |