From ccfd0660d5e30b99760dad93adf03b1150f18bc1 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Fri, 9 Aug 2024 11:41:40 -0400 Subject: [PATCH] xo-reader: wip: + paren_xs impl [not used] --- include/xo/reader/paren_xs.hpp | 88 +++++++++++++ src/reader/CMakeLists.txt | 3 +- src/reader/paren_xs.cpp | 222 +++++++++++++++++++++++++++++++++ 3 files changed, 312 insertions(+), 1 deletion(-) create mode 100644 include/xo/reader/paren_xs.hpp create mode 100644 src/reader/paren_xs.cpp diff --git a/include/xo/reader/paren_xs.hpp b/include/xo/reader/paren_xs.hpp new file mode 100644 index 00000000..a8211d96 --- /dev/null +++ b/include/xo/reader/paren_xs.hpp @@ -0,0 +1,88 @@ +/** @file paren_xs.hpp + * + * Author: Roland Conybeare + **/ + +#pragma once + +#include "exprstate.hpp" +//#include + +namespace xo { + namespace scm { + enum class parenexprstatetype { + invalid = -1, + + lparen_0, + lparen_1, + + n_parenexprstatetype, + }; + + /** @class paren_xs + * @brief state machine for handling parentheses in expressions + **/ + class paren_xs : public exprstate { + public: + //paren_xs(rp valex); + virtual ~paren_xs() = default; + + static const paren_xs * from(const exprstate * x) { return dynamic_cast(x); } + + //static std::unique_ptr make(); + + virtual bool admits_definition() const override; + virtual bool admits_symbol() const override; + virtual bool admits_colon() const override; + virtual bool admits_semicolon() const override; + virtual bool admits_singleassign() const override; + virtual bool admits_leftparen() const override; + virtual bool admits_rightparen() const override; + virtual bool admits_f64() const override; + + // virtual void on_f64(..) override + virtual void on_def(exprstatestack * p_stack) override; + + virtual void on_expr(ref::brw expr, + exprstatestack * p_stack, + rp * p_emit_expr) override; + virtual void on_symbol(const std::string & symbol, + exprstatestack * p_stack, + rp * p_emit_expr) override; + virtual void on_typedescr(TypeDescr td, + exprstatestack * /*p_stack*/, + rp * /*p_emit_expr*/) override; + + virtual void on_symbol(const token_type & tk, + exprstatestack * p_stack, + rp * p_emit_expr) override; + virtual void on_colon(exprstatestack * p_stack) override; + virtual void on_semicolon(exprstatestack * p_stack, + rp * /*p_emit_expr*/) override; + virtual void on_singleassign(exprstatestack * p_stack) override; + virtual void on_leftparen(exprstatestack * p_stack, + rp * /*p_emit_expr*/) override; + virtual void on_rightparen(exprstatestack * p_stack, + rp * /*p_emit_expr*/) override; + virtual void on_f64(const token_type & tk, + exprstatestack * p_stack, + rp * /*p_emit_expr*/) override; + + virtual void print(std::ostream & os) const override; + + private: +#ifdef NOT_YET + /** + * ( foo ... ) + * ^ + * | + * lparen_0 + **/ + parenexprstatetype parenxs_type_; +#endif + }; + } /*namespace scm*/ +} /*namespace xo*/ + + +/** end paren_xs.hpp **/ diff --git a/src/reader/CMakeLists.txt b/src/reader/CMakeLists.txt index 29bb9155..4741fa3d 100644 --- a/src/reader/CMakeLists.txt +++ b/src/reader/CMakeLists.txt @@ -6,7 +6,8 @@ set(SELF_SRCS reader.cpp exprstate.cpp define_xs.cpp - progress_xs.cpp) + progress_xs.cpp + paren_xs.cpp) xo_add_shared_library4(${SELF_LIB} ${PROJECT_NAME}Targets ${PROJECT_VERSION} 1 ${SELF_SRCS}) xo_dependency(${SELF_LIB} xo_expression) diff --git a/src/reader/paren_xs.cpp b/src/reader/paren_xs.cpp new file mode 100644 index 00000000..3fe5e40d --- /dev/null +++ b/src/reader/paren_xs.cpp @@ -0,0 +1,222 @@ +/* @file paren_xs.cpp */ + +#include "paren_xs.hpp" +#include "progress_xs.hpp" + +namespace xo { + namespace scm { + bool + paren_xs::admits_definition() const { return false; } + + bool + paren_xs::admits_symbol() const { return true; } + + bool + paren_xs::admits_colon() const { return false; } + + bool + paren_xs::admits_semicolon() const { return false; } + + bool + paren_xs::admits_singleassign() const { return false; } + + bool + paren_xs::admits_leftparen() const { /*unreachable*/ return false; } + + /** TODO: fixme **/ + bool + paren_xs::admits_rightparen() const { return exprstate::admits_rightparen(); } + + /** TODO: fixme **/ + bool + paren_xs::admits_f64() const { return exprstate::admits_f64(); } + + void + paren_xs::on_def(exprstatestack * /*p_stack*/) { + constexpr const char * c_self_name = "paren_xs::on_def"; + + throw std::runtime_error(tostr(c_self_name, + ": unexpected keyword 'def' for parsing state", + xtag("state", *this))); + } + + void + paren_xs::on_symbol(const token_type & /*tk*/, + exprstatestack * p_stack, + rp * /*p_emit_expr*/) + { + constexpr bool c_debug_flag = true; + scope log(XO_DEBUG(c_debug_flag)); + + log && log(xtag("exstype", p_stack->top_exprstate().exs_type())); + + //constexpr const char * self_name = "paren_xs::on_symbol"; + + /* TODO: lparen_0: treat as variable reference */ + + assert(false); + } + + void + paren_xs::on_typedescr(TypeDescr /*td*/, + exprstatestack * /*p_stack*/, + rp * /*p_emit_expr*/) + { + assert(false); + return; + } + + void + paren_xs::on_colon(exprstatestack * /*p_stack*/) + { + constexpr const char * c_self_name = "paren_xs::on_colon"; + + throw std::runtime_error(tostr(c_self_name, + ": unexpected colon for parsing state", + xtag("state", *this))); + } + + void + paren_xs::on_semicolon(exprstatestack * /*p_stack*/, + rp * /*p_emit_expr*/) + { + constexpr const char * c_self_name = "paren_xs::on_semicolon"; + + throw std::runtime_error(tostr(c_self_name, + ": unexpected semicolon for parsing state", + xtag("state", *this))); + } + + void + paren_xs::on_singleassign(exprstatestack * /*p_stack*/) + { + constexpr const char * c_self_name = "paren_xs::on_singleassign"; + + throw std::runtime_error(tostr(c_self_name, + ": unexpected equals for parsing state", + xtag("state", *this))); + } + + void + paren_xs::on_leftparen(exprstatestack * /*p_stack*/, + rp * /*p_emit_expr*/) + { + constexpr const char * c_self_name = "paren_xs::on_leftparen"; + + throw std::runtime_error(tostr(c_self_name, + ": unexpected leftparen '(' for parsing state", + xtag("state", *this))); + } + + void + paren_xs::on_rightparen(exprstatestack * p_stack, + rp * p_emit_expr) + { + constexpr bool c_debug_flag = true; + scope log(XO_DEBUG(c_debug_flag)); + + constexpr const char * self_name = "paren_xs::on_rightparen"; + + if (!this->admits_rightparen()) + { + throw std::runtime_error(tostr(self_name, + ": unexpected rightparen ')' for parsing state", + xtag("state", *this))); + } + + if (this->exs_type_ == exprstatetype::lparen_1) { + rp expr = this->gen_expr_; + + std::unique_ptr self = p_stack->pop_exprstate(); + + p_stack->top_exprstate().on_expr(expr, p_stack, p_emit_expr); + } + } + + void + paren_xs::on_f64(const token_type & /*tk*/, + exprstatestack * /*p_stack*/, + rp * /*p_emit_expr*/) + { + constexpr bool c_debug_flag = true; + scope log(XO_DEBUG(c_debug_flag)); + + constexpr const char * c_self_name = "paren_xs::on_f64"; + + if (!this->admits_f64()) + { + throw std::runtime_error(tostr(c_self_name, + ": unexpected floating-point literal for parsing state", + xtag("state", *this))); + } + + assert(false); + } + + void + paren_xs::on_expr(ref::brw expr, + exprstatestack * p_stack, + rp * /*p_emit_expr*/) + { + constexpr bool c_debug_flag = true; + scope log(XO_DEBUG(c_debug_flag)); + + log && log(xtag("exstype", this->exs_type_), + xtag("expr", expr)); + + switch (this->exs_type_) { + case exprstatetype::lparen_0: { + this->exs_type_ = exprstatetype::lparen_1; /* wants on_rightparen */ + p_stack->push_exprstate(progress_xs::make(expr.promote())); + + return; + } + + case exprstatetype::lparen_1: { + this->gen_expr_ = expr.promote(); + + /* expect immediate incoming call, this time to on_rightparen() */ + return; + } + + default: + /* unreachable */ + assert(false); + return; + } + } /*on_expr*/ + + void + paren_xs::on_symbol(const std::string & /*symbol_name*/, + exprstatestack * /*p_stack*/, + rp * /*p_emit_expr*/) + { + switch(this->exs_type_) { + case exprstatetype::lparen_0: + case exprstatetype::lparen_1: + /* NOT IMPLEMENTED */ + assert(false); + return; + + default: + /* unreachable */ + assert(false); + return; + } + } + + void + paren_xs::print(std::ostream & os) const { + os << ""; + } + + + } /*namespace scm*/ +} /*namespace xo*/ + + +/* end paren_xs.cpp */