diff --git a/include/xo/reader/exprstate.hpp b/include/xo/reader/exprstate.hpp index d2c58d67..3e79dee4 100644 --- a/include/xo/reader/exprstate.hpp +++ b/include/xo/reader/exprstate.hpp @@ -171,59 +171,6 @@ namespace xo { x.print(os); return os; } - - // ----- exprstatestack ----- - - /** @class exprstatestack - * @brief A stack of exprstate objects - **/ - class exprstatestack { - public: - exprstatestack() {} - - bool empty() const { return stack_.empty(); } - std::size_t size() const { return stack_.size(); } - - exprstate & top_exprstate(); - void push_exprstate(std::unique_ptr exs); - std::unique_ptr pop_exprstate(); - - /** relative to top-of-stack. - * 0 -> top (last in), z-1 -> bottom (first in) - **/ - std::unique_ptr & operator[](std::size_t i) { - std::size_t z = stack_.size(); - - assert(i < z); - - return stack_[z - i - 1]; - } - - const std::unique_ptr & operator[](std::size_t i) const { - std::size_t z = stack_.size(); - - assert(i < z); - - return stack_[z - i - 1]; - } - - void print (std::ostream & os) const; - - private: - std::vector> stack_; - }; - - inline std::ostream & - operator<< (std::ostream & os, const exprstatestack & x) { - x.print(os); - return os; - } - - inline std::ostream & - operator<< (std::ostream & os, const exprstatestack * x) { - x->print(os); - return os; - } } /*namespace scm*/ } /*namespace xo*/ diff --git a/include/xo/reader/exprstatestack.hpp b/include/xo/reader/exprstatestack.hpp new file mode 100644 index 00000000..c5ee0894 --- /dev/null +++ b/include/xo/reader/exprstatestack.hpp @@ -0,0 +1,66 @@ +/* file exprstatestack.hpp + * + * author: Roland Conybeare, Aug 2024 + */ + +#pragma once + +#include "exprstate.hpp" + +namespace xo { + namespace scm { + /** @class exprstatestack + * @brief A stack of exprstate objects + **/ + class exprstatestack { + public: + exprstatestack() {} + + bool empty() const { return stack_.empty(); } + std::size_t size() const { return stack_.size(); } + + exprstate & top_exprstate(); + void push_exprstate(std::unique_ptr exs); + std::unique_ptr pop_exprstate(); + + /** relative to top-of-stack. + * 0 -> top (last in), z-1 -> bottom (first in) + **/ + std::unique_ptr & operator[](std::size_t i) { + std::size_t z = stack_.size(); + + assert(i < z); + + return stack_[z - i - 1]; + } + + const std::unique_ptr & operator[](std::size_t i) const { + std::size_t z = stack_.size(); + + assert(i < z); + + return stack_[z - i - 1]; + } + + void print (std::ostream & os) const; + + private: + std::vector> stack_; + }; + + inline std::ostream & + operator<< (std::ostream & os, const exprstatestack & x) { + x.print(os); + return os; + } + + inline std::ostream & + operator<< (std::ostream & os, const exprstatestack * x) { + x->print(os); + return os; + } + } /*namespace scm*/ +} /*namespace xo*/ + + +/* end exprstatestack.hpp */ diff --git a/include/xo/reader/parser.hpp b/include/xo/reader/parser.hpp index 3211fd0c..dae3091f 100644 --- a/include/xo/reader/parser.hpp +++ b/include/xo/reader/parser.hpp @@ -5,7 +5,7 @@ #pragma once -#include "exprstate.hpp" +#include "exprstatestack.hpp" #include namespace xo { diff --git a/src/reader/CMakeLists.txt b/src/reader/CMakeLists.txt index 32a4cd5a..0a2f7704 100644 --- a/src/reader/CMakeLists.txt +++ b/src/reader/CMakeLists.txt @@ -5,6 +5,7 @@ set(SELF_SRCS parser.cpp reader.cpp exprstate.cpp + exprstatestack.cpp define_xs.cpp progress_xs.cpp paren_xs.cpp diff --git a/src/reader/define_xs.cpp b/src/reader/define_xs.cpp index 58006125..f0e7924f 100644 --- a/src/reader/define_xs.cpp +++ b/src/reader/define_xs.cpp @@ -1,6 +1,7 @@ /* @file define_xs.cpp */ #include "define_xs.hpp" +#include "exprstatestack.hpp" #include "parserstatemachine.hpp" #include "expect_symbol_xs.hpp" #include "expect_expr_xs.hpp" diff --git a/src/reader/expect_expr_xs.cpp b/src/reader/expect_expr_xs.cpp index 74afec19..3c5001ae 100644 --- a/src/reader/expect_expr_xs.cpp +++ b/src/reader/expect_expr_xs.cpp @@ -5,6 +5,7 @@ #include "expect_expr_xs.hpp" #include "parserstatemachine.hpp" +#include "exprstatestack.hpp" #include "lambda_xs.hpp" #include "paren_xs.hpp" #include "progress_xs.hpp" diff --git a/src/reader/expect_formal_arglist_xs.cpp b/src/reader/expect_formal_arglist_xs.cpp index 3dcd2c2e..1eef0563 100644 --- a/src/reader/expect_formal_arglist_xs.cpp +++ b/src/reader/expect_formal_arglist_xs.cpp @@ -4,9 +4,10 @@ */ #include "expect_formal_arglist_xs.hpp" +#include "parserstatemachine.hpp" +#include "exprstatestack.hpp" #include "expect_formal_xs.hpp" #include "expect_symbol_xs.hpp" -#include "parserstatemachine.hpp" #include "xo/expression/Variable.hpp" #include "xo/indentlog/print/vector.hpp" diff --git a/src/reader/expect_formal_xs.cpp b/src/reader/expect_formal_xs.cpp index 94120e79..8bdcf6b1 100644 --- a/src/reader/expect_formal_xs.cpp +++ b/src/reader/expect_formal_xs.cpp @@ -7,6 +7,7 @@ #include "expect_symbol_xs.hpp" #include "expect_type_xs.hpp" #include "parserstatemachine.hpp" +#include "exprstatestack.hpp" #include "xo/expression/Variable.hpp" namespace xo { diff --git a/src/reader/expect_symbol_xs.cpp b/src/reader/expect_symbol_xs.cpp index bae85927..591f4ca8 100644 --- a/src/reader/expect_symbol_xs.cpp +++ b/src/reader/expect_symbol_xs.cpp @@ -5,6 +5,7 @@ #include "expect_symbol_xs.hpp" #include "parserstatemachine.hpp" +#include "exprstatestack.hpp" namespace xo { namespace scm { diff --git a/src/reader/expect_type_xs.cpp b/src/reader/expect_type_xs.cpp index 90f2932a..97365062 100644 --- a/src/reader/expect_type_xs.cpp +++ b/src/reader/expect_type_xs.cpp @@ -5,6 +5,7 @@ #include "expect_type_xs.hpp" #include "parserstatemachine.hpp" +#include "exprstatestack.hpp" #include "xo/reflect/Reflect.hpp" namespace xo { diff --git a/src/reader/exprseq_xs.cpp b/src/reader/exprseq_xs.cpp index 44f28624..0db1a394 100644 --- a/src/reader/exprseq_xs.cpp +++ b/src/reader/exprseq_xs.cpp @@ -1,9 +1,10 @@ /* @file exprseq_xs.cpp */ #include "exprseq_xs.hpp" +#include "parserstatemachine.hpp" +#include "exprstatestack.hpp" #include "define_xs.hpp" #include "expect_symbol_xs.hpp" -#include "parserstatemachine.hpp" namespace xo { namespace scm { diff --git a/src/reader/exprstate.cpp b/src/reader/exprstate.cpp index 1b9644b6..9a2917e0 100644 --- a/src/reader/exprstate.cpp +++ b/src/reader/exprstate.cpp @@ -1,6 +1,7 @@ /* @file exprstate.cpp */ #include "exprstate.hpp" +#include "exprstatestack.hpp" #include "parserstatemachine.hpp" //#include "formal_arg.hpp" #include "xo/expression/Variable.hpp" @@ -390,67 +391,6 @@ namespace xo { xtag("token", tk), xtag("state", *this))); } - - // ----- exprstatestack ----- - - exprstate & - exprstatestack::top_exprstate() { - std::size_t z = stack_.size(); - - if (z == 0) { - throw std::runtime_error - ("parser::top_exprstate: unexpected empty stack"); - } - - return *(stack_[z-1]); - } - - void - exprstatestack::push_exprstate(std::unique_ptr exs) { - constexpr bool c_debug_flag = true; - scope log(XO_DEBUG(c_debug_flag), - xtag("exs", *exs)); - - std::size_t z = stack_.size(); - - stack_.resize(z+1); - - stack_[z] = std::move(exs); - } - - std::unique_ptr - exprstatestack::pop_exprstate() { - constexpr bool c_debug_flag = true; - scope log(XO_DEBUG(c_debug_flag), - xtag("top.exstype", top_exprstate().exs_type())); - - std::size_t z = stack_.size(); - - if (z > 0) { - std::unique_ptr top = std::move(stack_[z-1]); - - stack_.resize(z-1); - - return top; - } else { - return nullptr; - } - } - - void - exprstatestack::print(std::ostream & os) const { - os << "" << std::endl; - } } /*namespace scm*/ } /*namespace xo*/ diff --git a/src/reader/exprstatestack.cpp b/src/reader/exprstatestack.cpp new file mode 100644 index 00000000..07ca85bb --- /dev/null +++ b/src/reader/exprstatestack.cpp @@ -0,0 +1,71 @@ +/* file exprstatestack.cpp + * + * author: Roland Conybeare + */ + +#include "exprstatestack.hpp" + +namespace xo { + namespace scm { + exprstate & + exprstatestack::top_exprstate() { + std::size_t z = stack_.size(); + + if (z == 0) { + throw std::runtime_error + ("parser::top_exprstate: unexpected empty stack"); + } + + return *(stack_[z-1]); + } + + void + exprstatestack::push_exprstate(std::unique_ptr exs) { + constexpr bool c_debug_flag = true; + scope log(XO_DEBUG(c_debug_flag), + xtag("exs", *exs)); + + std::size_t z = stack_.size(); + + stack_.resize(z+1); + + stack_[z] = std::move(exs); + } + + std::unique_ptr + exprstatestack::pop_exprstate() { + constexpr bool c_debug_flag = true; + scope log(XO_DEBUG(c_debug_flag), + xtag("top.exstype", top_exprstate().exs_type())); + + std::size_t z = stack_.size(); + + if (z > 0) { + std::unique_ptr top = std::move(stack_[z-1]); + + stack_.resize(z-1); + + return top; + } else { + return nullptr; + } + } + + void + exprstatestack::print(std::ostream & os) const { + os << "" << std::endl; + } + } /*namespace scm*/ +} /*namespace xo*/ + +/* end exprstatestack.cpp */ diff --git a/src/reader/lambda_xs.cpp b/src/reader/lambda_xs.cpp index fbde492a..90270b07 100644 --- a/src/reader/lambda_xs.cpp +++ b/src/reader/lambda_xs.cpp @@ -2,6 +2,7 @@ #include "lambda_xs.hpp" #include "parserstatemachine.hpp" +#include "exprstatestack.hpp" #include "expect_formal_arglist_xs.hpp" #include "expect_expr_xs.hpp" #include "xo/expression/Lambda.hpp" diff --git a/src/reader/paren_xs.cpp b/src/reader/paren_xs.cpp index b9dde8f4..96318e4c 100644 --- a/src/reader/paren_xs.cpp +++ b/src/reader/paren_xs.cpp @@ -2,6 +2,7 @@ #include "paren_xs.hpp" #include "parserstatemachine.hpp" +#include "exprstatestack.hpp" #include "progress_xs.hpp" #include "expect_expr_xs.hpp" diff --git a/src/reader/progress_xs.cpp b/src/reader/progress_xs.cpp index 6b474db3..d1bae5c3 100644 --- a/src/reader/progress_xs.cpp +++ b/src/reader/progress_xs.cpp @@ -1,6 +1,7 @@ /* @file progress_xs.cpp */ #include "progress_xs.hpp" +#include "exprstatestack.hpp" #include "expect_expr_xs.hpp" #include "parserstatemachine.hpp" #include "xo/expression/Apply.hpp"