From 8cae38817bd7cecbf541809a52e57cfd59ec4527 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Mon, 19 Aug 2024 00:54:45 -0400 Subject: [PATCH] xo-reader: refactor: parserstatemachine w/ exprstate.on_lambda_token --- include/xo/reader/expect_expr_xs.hpp | 3 +-- include/xo/reader/exprstate.hpp | 3 +-- include/xo/reader/lambda_xs.hpp | 3 +-- src/reader/expect_expr_xs.cpp | 7 +++++-- src/reader/exprstate.cpp | 5 ++--- src/reader/lambda_xs.cpp | 12 ++++++++---- src/reader/parser.cpp | 5 ++++- 7 files changed, 22 insertions(+), 16 deletions(-) diff --git a/include/xo/reader/expect_expr_xs.hpp b/include/xo/reader/expect_expr_xs.hpp index 85686d96..f7bcb097 100644 --- a/include/xo/reader/expect_expr_xs.hpp +++ b/include/xo/reader/expect_expr_xs.hpp @@ -20,8 +20,7 @@ namespace xo { static void start(exprstatestack * p_stack); virtual void on_lambda_token(const token_type & tk, - exprstatestack * p_stack, - rp * p_emit_expr) override; + parserstatemachine * p_psm) override; virtual void on_leftparen_token(const token_type & tk, exprstatestack * p_stack, rp * p_emit_expr) override; diff --git a/include/xo/reader/exprstate.hpp b/include/xo/reader/exprstate.hpp index e36972fa..f0bbf2f3 100644 --- a/include/xo/reader/exprstate.hpp +++ b/include/xo/reader/exprstate.hpp @@ -123,8 +123,7 @@ namespace xo { parserstatemachine * p_psm); /** handle incoming 'lambda' token **/ virtual void on_lambda_token(const token_type & tk, - exprstatestack * p_stack, - rp * p_emit_expr); + parserstatemachine * p_psm); /** handle incoming symbol token **/ virtual void on_symbol_token(const token_type & tk, exprstatestack * p_stack, diff --git a/include/xo/reader/lambda_xs.hpp b/include/xo/reader/lambda_xs.hpp index e1880039..7597e937 100644 --- a/include/xo/reader/lambda_xs.hpp +++ b/include/xo/reader/lambda_xs.hpp @@ -43,8 +43,7 @@ namespace xo { static void start(exprstatestack * p_stack, rp * p_emit_expr); virtual void on_lambda_token(const token_type & tk, - exprstatestack * p_stack, - rp * p_emit_expr) override; + parserstatemachine * p_psm) override; virtual void on_formal_arglist(const std::vector> & argl, exprstatestack * p_stack, rp * p_emit_expr) override; diff --git a/src/reader/expect_expr_xs.cpp b/src/reader/expect_expr_xs.cpp index 8ecc2e5b..bb90047f 100644 --- a/src/reader/expect_expr_xs.cpp +++ b/src/reader/expect_expr_xs.cpp @@ -4,6 +4,7 @@ */ #include "expect_expr_xs.hpp" +#include "parserstatemachine.hpp" #include "lambda_xs.hpp" #include "paren_xs.hpp" #include "progress_xs.hpp" @@ -32,14 +33,16 @@ namespace xo { void expect_expr_xs::on_lambda_token(const token_type & /*tk*/, - exprstatestack * p_stack, - rp * p_emit_expr) + parserstatemachine * p_psm) { constexpr bool c_debug_flag = true; scope log(XO_DEBUG(c_debug_flag)); //constexpr const char * self_name = "exprstate::on_leftparen"; + auto p_stack = p_psm->p_stack_; + auto p_emit_expr = p_psm->p_emit_expr_; + /* push lparen_0 to remember to look for subsequent rightparen. */ lambda_xs::start(p_stack, p_emit_expr); //p_stack->top_exprstate().on_lambda_token(tk, p_stack, p_emit_expr); diff --git a/src/reader/exprstate.cpp b/src/reader/exprstate.cpp index d5f72881..cd1342ff 100644 --- a/src/reader/exprstate.cpp +++ b/src/reader/exprstate.cpp @@ -60,8 +60,7 @@ namespace xo { void exprstate::on_lambda_token(const token_type & tk, - exprstatestack * /*p_stack*/, - rp * /*p_emit_expr*/) + parserstatemachine * /*p_psm*/) { this->illegal_input_error("exprstate::on_lambda_token", tk); } @@ -264,7 +263,7 @@ namespace xo { return; case tokentype::tk_lambda: - this->on_lambda_token(tk, p_stack, p_emit_expr); + this->on_lambda_token(tk, p_psm); return; case tokentype::tk_i64: diff --git a/src/reader/lambda_xs.cpp b/src/reader/lambda_xs.cpp index 1b28cf11..f861d1aa 100644 --- a/src/reader/lambda_xs.cpp +++ b/src/reader/lambda_xs.cpp @@ -1,6 +1,7 @@ /* @file lambda_xs.cpp */ #include "lambda_xs.hpp" +#include "parserstatemachine.hpp" #include "expect_formal_arglist_xs.hpp" #include "expect_expr_xs.hpp" #include "xo/expression/Lambda.hpp" @@ -18,23 +19,26 @@ namespace xo { lambda_xs::start(exprstatestack * p_stack, rp * p_emit_expr) { + parserstatemachine psm(p_stack, p_emit_expr); + p_stack->push_exprstate(lambda_xs::make()); p_stack->top_exprstate() - .on_lambda_token(token_type::lambda(), p_stack, p_emit_expr); + .on_lambda_token(token_type::lambda(), &psm); } lambda_xs::lambda_xs() : exprstate(exprstatetype::lambdaexpr) {} void lambda_xs::on_lambda_token(const token_type & tk, - exprstatestack * p_stack, - rp * p_emit_expr) + parserstatemachine * p_psm) { + auto p_stack = p_psm->p_stack_; + if (lmxs_type_ == lambdastatetype::lm_0) { this->lmxs_type_ = lambdastatetype::lm_1; expect_formal_arglist_xs::start(p_stack); } else { - exprstate::on_lambda_token(tk, p_stack, p_emit_expr); + exprstate::on_lambda_token(tk, p_psm); } } diff --git a/src/reader/parser.cpp b/src/reader/parser.cpp index 5c2a99bb..9c9d373e 100644 --- a/src/reader/parser.cpp +++ b/src/reader/parser.cpp @@ -4,6 +4,7 @@ */ #include "parser.hpp" +#include "parserstatemachine.hpp" #include "define_xs.hpp" #include "exprseq_xs.hpp" #include "xo/expression/DefineExpr.hpp" @@ -50,7 +51,9 @@ namespace xo { rp retval; - xs_stack_.top_exprstate().on_input(tk, &xs_stack_, &retval); + parserstatemachine psm(&xs_stack_, &retval); + + xs_stack_.top_exprstate().on_input(tk, &psm); log && log(xtag("retval", retval));