diff --git a/include/xo/reader2/ParserStateMachine.hpp b/include/xo/reader2/ParserStateMachine.hpp index aa2797d0..f8a0a796 100644 --- a/include/xo/reader2/ParserStateMachine.hpp +++ b/include/xo/reader2/ParserStateMachine.hpp @@ -106,6 +106,8 @@ namespace xo { obj cmpne_pm() const; /** polymorphich less-than comparison. Use to implement infix op< **/ obj cmplt_pm() const; + /** polymorphich less-or-equal comparison. Use to implement infix op<= **/ + obj cmple_pm() const; /** true iff state machine is currently idle (at top-level) **/ bool is_at_toplevel() const noexcept; @@ -418,6 +420,7 @@ namespace xo { Binding cmpeq_binding_; Binding cmpne_binding_; Binding cmplt_binding_; + Binding cmple_binding_; /** current output from parser **/ ParserResult result_; diff --git a/src/reader2/ParserStateMachine.cpp b/src/reader2/ParserStateMachine.cpp index 2b2ade05..71c52791 100644 --- a/src/reader2/ParserStateMachine.cpp +++ b/src/reader2/ParserStateMachine.cpp @@ -144,6 +144,12 @@ namespace xo { assert(name); this->cmplt_binding_ = global_symtab_->lookup_binding(name); } + + { + const DUniqueString * name = stringtable_.lookup("_cmple"); + assert(name); + this->cmple_binding_ = global_symtab_->lookup_binding(name); + } } ParserStateMachine::~ParserStateMachine() @@ -220,6 +226,15 @@ namespace xo { return retval; } + obj + ParserStateMachine::cmple_pm() const + { + obj retval = global_env_->lookup_value(cmple_binding_); + assert(retval); + + return retval; + } + bool ParserStateMachine::is_at_toplevel() const noexcept {