summaryrefslogtreecommitdiff
path: root/src/parser/lexer.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser/lexer.h')
-rw-r--r--src/parser/lexer.h113
1 files changed, 9 insertions, 104 deletions
diff --git a/src/parser/lexer.h b/src/parser/lexer.h
index 64d1fc6be..c44152b35 100644
--- a/src/parser/lexer.h
+++ b/src/parser/lexer.h
@@ -41,52 +41,6 @@ struct TextPos {
friend std::ostream& operator<<(std::ostream& os, const TextPos& pos);
};
-// ======
-// Tokens
-// ======
-
-enum Sign { NoSign, Pos, Neg };
-
-struct IntTok {
- uint64_t n;
- Sign sign;
-
- bool operator==(const IntTok&) const;
- friend std::ostream& operator<<(std::ostream&, const IntTok&);
-};
-
-struct FloatTok {
- // The payload if we lexed a nan with payload. We cannot store the payload
- // directly in `d` because we do not know at this point whether we are parsing
- // an f32 or f64 and therefore we do not know what the allowable payloads are.
- // No payload with NaN means to use the default payload for the expected float
- // width.
- std::optional<uint64_t> nanPayload;
- double d;
-
- bool operator==(const FloatTok&) const;
- friend std::ostream& operator<<(std::ostream&, const FloatTok&);
-};
-
-struct Token {
- using Data = std::variant<IntTok, FloatTok>;
- std::string_view span;
- Data data;
-
- // ====================
- // Token classification
- // ====================
-
- template<typename T> std::optional<T> getU() const;
- template<typename T> std::optional<T> getS() const;
- template<typename T> std::optional<T> getI() const;
- std::optional<double> getF64() const;
- std::optional<float> getF32() const;
-
- bool operator==(const Token&) const;
- friend std::ostream& operator<<(std::ostream& os, const Token&);
-};
-
// ===========
// Annotations
// ===========
@@ -105,7 +59,6 @@ extern Name srcAnnotationKind;
struct Lexer {
private:
size_t index = 0;
- std::optional<Token> curr;
std::vector<Annotation> annotations;
public:
@@ -140,9 +93,7 @@ public:
if (takeString()) {
continue;
}
- if (!curr) {
- ++index;
- }
+ ++index;
advance();
}
}
@@ -159,59 +110,16 @@ public:
std::optional<uint64_t> takeOffset();
std::optional<uint32_t> takeAlign();
- template<typename T> std::optional<T> takeU() {
- if (curr) {
- if (auto n = curr->getU<T>()) {
- advance();
- return n;
- }
- }
- return std::nullopt;
- }
-
- template<typename T> std::optional<T> takeI() {
- if (curr) {
- if (auto n = curr->getI<T>()) {
- advance();
- return n;
- }
- }
- return std::nullopt;
- }
-
std::optional<uint64_t> takeU64() { return takeU<uint64_t>(); }
-
std::optional<uint64_t> takeI64() { return takeI<uint64_t>(); }
-
std::optional<uint32_t> takeU32() { return takeU<uint32_t>(); }
-
std::optional<uint32_t> takeI32() { return takeI<uint32_t>(); }
-
std::optional<uint16_t> takeI16() { return takeI<uint16_t>(); }
-
std::optional<uint8_t> takeU8() { return takeU<uint8_t>(); }
-
std::optional<uint8_t> takeI8() { return takeI<uint8_t>(); }
- std::optional<double> takeF64() {
- if (curr) {
- if (auto d = curr->getF64()) {
- advance();
- return d;
- }
- }
- return std::nullopt;
- }
-
- std::optional<float> takeF32() {
- if (curr) {
- if (auto f = curr->getF32()) {
- advance();
- return f;
- }
- }
- return std::nullopt;
- }
+ std::optional<double> takeF64();
+ std::optional<float> takeF32();
std::optional<std::string> takeString();
@@ -247,10 +155,9 @@ public:
void advance() {
annotations.clear();
skipSpace();
- lexToken();
}
- bool empty() const { return !curr && index == buffer.size(); }
+ bool empty() const { return index == buffer.size(); }
TextPos position(const char* c) const;
TextPos position(size_t i) const { return position(buffer.data() + i); }
@@ -259,12 +166,7 @@ public:
}
TextPos position() const { return position(getPos()); }
- size_t getPos() const {
- if (curr) {
- return getIndex() - curr->span.size();
- }
- return getIndex();
- }
+ size_t getPos() const { return index; }
[[nodiscard]] Err err(size_t pos, std::string reason) {
std::stringstream msg;
@@ -282,8 +184,11 @@ public:
}
private:
+ template<typename T> std::optional<T> takeU();
+ template<typename T> std::optional<T> takeS();
+ template<typename T> std::optional<T> takeI();
+
void skipSpace();
- void lexToken();
};
} // namespace wasm::WATParser