make parser extendable

optimize
Clyne 11 months ago
parent e175ab21b3
commit 789791692a
Signed by: clyne
GPG Key ID: 3267C8EBF3F9AFC7

@ -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;
}

@ -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.

Loading…
Cancel
Save