From 789791692a20e4da7b798a249ca24ed35cd78b5f Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Sun, 5 Nov 2023 07:00:38 -0500 Subject: [PATCH] make parser extendable --- libalee/parser.cpp | 19 ++++++++++++++----- 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 #include +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(result); + processLiteral(state, static_cast(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.