aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClyne Sullivan <clyne@bitgloo.com>2023-11-05 07:00:38 -0500
committerClyne Sullivan <clyne@bitgloo.com>2023-11-05 07:00:38 -0500
commit789791692a20e4da7b798a249ca24ed35cd78b5f (patch)
tree13a290d4cbbe6e50f1b393dc0161fd4bca31c6ef
parente175ab21b36e93ed17cd065a4afe2fa284791781 (diff)
make parser extendable
-rw-r--r--libalee/parser.cpp19
-rw-r--r--libalee/parser.hpp4
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.