diff options
author | Clyne Sullivan <clyne@bitgloo.com> | 2023-11-05 07:00:38 -0500 |
---|---|---|
committer | Clyne Sullivan <clyne@bitgloo.com> | 2023-11-05 07:00:38 -0500 |
commit | 789791692a20e4da7b798a249ca24ed35cd78b5f (patch) | |
tree | 13a290d4cbbe6e50f1b393dc0161fd4bca31c6ef | |
parent | e175ab21b36e93ed17cd065a4afe2fa284791781 (diff) |
make parser extendable
-rw-r--r-- | libalee/parser.cpp | 19 | ||||
-rw-r--r-- | libalee/parser.hpp | 4 |
2 files changed, 18 insertions, 5 deletions
diff --git a/libalee/parser.cpp b/libalee/parser.cpp index 16281d3..3236ae2 100644 --- a/libalee/parser.cpp +++ b/libalee/parser.cpp @@ -23,6 +23,8 @@ #include <algorithm> #include <cstring> +Error (*Parser::customParse)(State&, Word) = nullptr; + Error Parser::parse(State& state, const char *str) { auto addr = Dictionary::Input; @@ -60,7 +62,11 @@ Error Parser::parseWord(State& state, Word word) auto cw = CoreWords::findi(state, word); if (cw < 0) { - return parseNumber(state, word); + auto r = parseNumber(state, word); + if (r != Error::none) + return customParse ? customParse(state, word) : r; + else + return r; } else { ins = cw; imm = ins == CoreWords::Semicolon; @@ -106,9 +112,14 @@ Error Parser::parseNumber(State& state, Word word) if (inv) result *= -1; - auto value = static_cast<Cell>(result); + processLiteral(state, static_cast<Cell>(result)); + return Error::none; +} + +void Parser::processLiteral(State& state, Cell value) +{ if (state.compiling()) { - auto ins = CoreWords::findi("_lit"); + constexpr auto ins = CoreWords::findi("_lit"); const Cell maxlit = Dictionary::Begin - CoreWords::WordCount; if (value >= 0 && value < maxlit) @@ -120,7 +131,5 @@ Error Parser::parseNumber(State& state, Word word) } else { state.push(value); } - - return Error::none; } diff --git a/libalee/parser.hpp b/libalee/parser.hpp index 6af3ef9..f868afb 100644 --- a/libalee/parser.hpp +++ b/libalee/parser.hpp @@ -26,6 +26,8 @@ class Parser { public: + static Error (*customParse)(State&, Word); + /** * Parses (and evaluates) the given string using the given state. * The string is stored in the state's input buffer, then parseSource() @@ -40,6 +42,8 @@ public: */ static Error parseSource(State&); + static void processLiteral(State&, Cell); + private: /** * Parses the given word using the given state. |