From a68aaf41ece2fd850ec819b0bc1a6b2481b6bfec Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 12 Mar 2026 23:41:21 -0500 Subject: [PATCH] xo-reader2: + op>= support --- .../include/xo/numeric/FloatIntegerOps.hpp | 4 +++ xo-numeric/include/xo/numeric/FloatOps.hpp | 2 ++ xo-numeric/include/xo/numeric/IntegerOps.hpp | 2 ++ .../include/xo/numeric/NumericDispatch.hpp | 11 +++++-- xo-numeric/include/xo/numeric/NumericOps.hpp | 13 ++++++--- xo-numeric/src/numeric/FloatIntegerOps.cpp | 16 ++++++++++ xo-numeric/src/numeric/FloatOps.cpp | 29 ++++++++++++++----- xo-numeric/src/numeric/IntegerOps.cpp | 7 +++++ xo-numeric/src/numeric/NumericDispatch.cpp | 12 ++++++++ .../src/numeric/numeric_register_facets.cpp | 12 +++++--- .../numeric/numeric_register_primitives.cpp | 2 ++ .../include/xo/reader2/ParserStateMachine.hpp | 7 +++-- xo-reader2/src/reader2/DApplySsm.cpp | 2 +- xo-reader2/src/reader2/DDefineSsm.cpp | 2 +- xo-reader2/src/reader2/DDeftypeSsm.cpp | 2 +- xo-reader2/src/reader2/DExpectExprSsm.cpp | 2 +- .../src/reader2/DExpectFormalArgSsm.cpp | 2 +- .../src/reader2/DExpectFormalArglistSsm.cpp | 2 +- xo-reader2/src/reader2/DExpectListTypeSsm.cpp | 2 +- xo-reader2/src/reader2/DExpectQArraySsm.cpp | 2 +- xo-reader2/src/reader2/DExpectQListSsm.cpp | 2 +- xo-reader2/src/reader2/DExpectQLiteralSsm.cpp | 2 +- xo-reader2/src/reader2/DExpectSymbolSsm.cpp | 2 +- xo-reader2/src/reader2/DExpectTypeSsm.cpp | 2 +- xo-reader2/src/reader2/DIfElseSsm.cpp | 2 +- xo-reader2/src/reader2/DLambdaSsm.cpp | 2 +- xo-reader2/src/reader2/DParenSsm.cpp | 2 +- xo-reader2/src/reader2/DProgressSsm.cpp | 12 ++++++-- xo-reader2/src/reader2/DQuoteSsm.cpp | 2 +- xo-reader2/src/reader2/DSequenceSsm.cpp | 2 +- xo-reader2/src/reader2/DToplevelSeqSsm.cpp | 2 +- xo-reader2/src/reader2/ParserStateMachine.cpp | 15 ++++++++++ .../include/xo/tokenizer2/tokentype.hpp | 2 +- xo-tokenizer2/src/tokenizer2/Tokenizer.cpp | 2 +- xo-tokenizer2/src/tokenizer2/tokentype.cpp | 2 +- 35 files changed, 143 insertions(+), 43 deletions(-) diff --git a/xo-numeric/include/xo/numeric/FloatIntegerOps.hpp b/xo-numeric/include/xo/numeric/FloatIntegerOps.hpp index da13d7c4..8508402f 100644 --- a/xo-numeric/include/xo/numeric/FloatIntegerOps.hpp +++ b/xo-numeric/include/xo/numeric/FloatIntegerOps.hpp @@ -36,6 +36,8 @@ namespace xo { DFloat * x, DInteger * y); static obj cmp_lessequal(obj rcx, DFloat * x, DInteger * y); + static obj cmp_greatequal(obj rcx, + DFloat * x, DInteger * y); }; class IntegerFloatOps { @@ -60,6 +62,8 @@ namespace xo { DInteger * x, DFloat * y); static obj cmp_lessequal(obj rcx, DInteger * x, DFloat * y); + static obj cmp_greatequal(obj rcx, + DInteger * x, DFloat * y); }; } diff --git a/xo-numeric/include/xo/numeric/FloatOps.hpp b/xo-numeric/include/xo/numeric/FloatOps.hpp index 3c32960b..3eaabc9c 100644 --- a/xo-numeric/include/xo/numeric/FloatOps.hpp +++ b/xo-numeric/include/xo/numeric/FloatOps.hpp @@ -35,6 +35,8 @@ namespace xo { DFloat * x, DFloat * y); static obj cmp_lessequal(obj rcx, DFloat * x, DFloat * y); + static obj cmp_greatequal(obj rcx, + DFloat * x, DFloat * y); }; } diff --git a/xo-numeric/include/xo/numeric/IntegerOps.hpp b/xo-numeric/include/xo/numeric/IntegerOps.hpp index 4612e365..b8342555 100644 --- a/xo-numeric/include/xo/numeric/IntegerOps.hpp +++ b/xo-numeric/include/xo/numeric/IntegerOps.hpp @@ -37,6 +37,8 @@ namespace xo { DInteger * x, DInteger * y); static obj cmp_lessequal(obj rcx, DInteger * x, DInteger * y); + static obj cmp_greatequal(obj rcx, + DInteger * x, DInteger * y); }; diff --git a/xo-numeric/include/xo/numeric/NumericDispatch.hpp b/xo-numeric/include/xo/numeric/NumericDispatch.hpp index 3680a508..53b35b97 100644 --- a/xo-numeric/include/xo/numeric/NumericDispatch.hpp +++ b/xo-numeric/include/xo/numeric/NumericDispatch.hpp @@ -113,6 +113,11 @@ namespace xo { obj x, obj y); + /** compare two numeric values for greater-or-equal **/ + static obj cmp_greatequal(obj rcx, + obj x, + obj y); + /** report memory use for owned arenas to @p visitor **/ void visit_pools(const MemorySizeVisitor & visitor); @@ -129,7 +134,8 @@ namespace xo { typename NumericOps::BinaryOp_Impl cmpeq_fn, typename NumericOps::BinaryOp_Impl cmpne_fn, typename NumericOps::BinaryOp_Impl cmplt_fn, - typename NumericOps::BinaryOp_Impl cmple_fn) { + typename NumericOps::BinaryOp_Impl cmple_fn, + typename NumericOps::BinaryOp_Impl cmpge_fn) { KeyType key(typeseq::id().seqno(), typeseq::id().seqno()); @@ -143,7 +149,8 @@ namespace xo { cmpeq_fn, cmpne_fn, cmplt_fn, - cmple_fn); + cmple_fn, + cmpge_fn); } private: diff --git a/xo-numeric/include/xo/numeric/NumericOps.hpp b/xo-numeric/include/xo/numeric/NumericOps.hpp index d8916133..5d983a98 100644 --- a/xo-numeric/include/xo/numeric/NumericOps.hpp +++ b/xo-numeric/include/xo/numeric/NumericOps.hpp @@ -29,9 +29,10 @@ namespace xo { BinaryOp cmpeq, BinaryOp cmpne, BinaryOp cmplt, - BinaryOp cmple) + BinaryOp cmple, + BinaryOp cmpge) : multiply_{multiply}, divide_{divide}, add_{add}, subtract_{subtract}, - cmpeq_{cmpeq}, cmpne_{cmpne}, cmplt_{cmplt}, cmple_{cmple} {} + cmpeq_{cmpeq}, cmpne_{cmpne}, cmplt_{cmplt}, cmple_{cmple}, cmpge_{cmpge} {} BinaryOp multiply_ = nullptr; BinaryOp divide_ = nullptr; @@ -46,6 +47,8 @@ namespace xo { BinaryOp cmplt_ = nullptr; /** compare numerics (<=) **/ BinaryOp cmple_ = nullptr; + /** compare numerics (>=) **/ + BinaryOp cmpge_ = nullptr; }; template @@ -64,7 +67,8 @@ namespace xo { BinaryOp_Impl cmpeq, BinaryOp_Impl cmpne, BinaryOp_Impl cmplt, - BinaryOp_Impl cmple) { + BinaryOp_Impl cmple, + BinaryOp_Impl cmpge) { return AnonymizedNumericOps(reinterpret_cast(multiply), reinterpret_cast(divide), reinterpret_cast(add), @@ -72,7 +76,8 @@ namespace xo { reinterpret_cast(cmpeq), reinterpret_cast(cmpne), reinterpret_cast(cmplt), - reinterpret_cast(cmple)); + reinterpret_cast(cmple), + reinterpret_cast(cmpge)); } }; diff --git a/xo-numeric/src/numeric/FloatIntegerOps.cpp b/xo-numeric/src/numeric/FloatIntegerOps.cpp index c23d70f4..d2fedcfa 100644 --- a/xo-numeric/src/numeric/FloatIntegerOps.cpp +++ b/xo-numeric/src/numeric/FloatIntegerOps.cpp @@ -74,6 +74,14 @@ namespace xo { x->value() <= DFloat::value_type(y->value())); } + obj + FloatIntegerOps::cmp_greatequal(obj rcx, + DFloat * x, DInteger * y) + { + return DBoolean::box(rcx.allocator(), + x->value() >= DFloat::value_type(y->value())); + } + // ----- Integer op Float ----- obj @@ -136,6 +144,14 @@ namespace xo { DFloat::value_type(x->value()) <= y->value()); } + obj + IntegerFloatOps::cmp_greatequal(obj rcx, + DInteger * x, DFloat * y) + { + return DBoolean::box(rcx.allocator(), + DFloat::value_type(x->value()) >= y->value()); + } + } } diff --git a/xo-numeric/src/numeric/FloatOps.cpp b/xo-numeric/src/numeric/FloatOps.cpp index 8c59bb1f..a549c8ac 100644 --- a/xo-numeric/src/numeric/FloatOps.cpp +++ b/xo-numeric/src/numeric/FloatOps.cpp @@ -23,49 +23,64 @@ namespace xo { FloatOps::divide(obj rcx, DFloat * x, DFloat * y) { - return DFloat::box(rcx.allocator(), x->value() / y->value()); + return DFloat::box(rcx.allocator(), + x->value() / y->value()); } obj FloatOps::add(obj rcx, DFloat * x, DFloat * y) { - return DFloat::box(rcx.allocator(), x->value() + y->value()); + return DFloat::box(rcx.allocator(), + x->value() + y->value()); } obj FloatOps::subtract(obj rcx, DFloat * x, DFloat * y) { - return DFloat::box(rcx.allocator(), x->value() - y->value()); + return DFloat::box(rcx.allocator(), + x->value() - y->value()); } obj FloatOps::cmp_equal(obj rcx, DFloat * x, DFloat * y) { - return DBoolean::box(rcx.allocator(), x->value() == y->value()); + return DBoolean::box(rcx.allocator(), + x->value() == y->value()); } obj FloatOps::cmp_notequal(obj rcx, DFloat * x, DFloat * y) { - return DBoolean::box(rcx.allocator(), x->value() != y->value()); + return DBoolean::box(rcx.allocator(), + x->value() != y->value()); } obj FloatOps::cmp_less(obj rcx, DFloat * x, DFloat * y) { - return DBoolean::box(rcx.allocator(), x->value() < y->value()); + return DBoolean::box(rcx.allocator(), + x->value() < y->value()); } obj FloatOps::cmp_lessequal(obj rcx, DFloat * x, DFloat * y) { - return DBoolean::box(rcx.allocator(), x->value() <= y->value()); + return DBoolean::box(rcx.allocator(), + x->value() <= y->value()); + } + + obj + FloatOps::cmp_greatequal(obj rcx, + DFloat * x, DFloat * y) + { + return DBoolean::box(rcx.allocator(), + x->value() >= y->value()); } } } diff --git a/xo-numeric/src/numeric/IntegerOps.cpp b/xo-numeric/src/numeric/IntegerOps.cpp index 65874439..af67a5ee 100644 --- a/xo-numeric/src/numeric/IntegerOps.cpp +++ b/xo-numeric/src/numeric/IntegerOps.cpp @@ -69,6 +69,13 @@ namespace xo { return DBoolean::box(rcx.allocator(), x->value() <= y->value()); } + obj + IntegerOps::cmp_greatequal(obj rcx, + DInteger * x, DInteger * y) + { + return DBoolean::box(rcx.allocator(), x->value() >= y->value()); + } + } } diff --git a/xo-numeric/src/numeric/NumericDispatch.cpp b/xo-numeric/src/numeric/NumericDispatch.cpp index 42c507ee..0cc0af11 100644 --- a/xo-numeric/src/numeric/NumericDispatch.cpp +++ b/xo-numeric/src/numeric/NumericDispatch.cpp @@ -162,6 +162,18 @@ namespace xo { x, y); } + obj + NumericDispatch::cmp_greatequal(obj rcx, + obj x, + obj y) + { + return dispatch(rcx, + "NumericDispatch::cmp_great", + "incomparable types in x>=y", + &AnonymizedNumericOps::cmpge_, + x, y); + } + } /*namespace scm*/ } /*namespace xo*/ diff --git a/xo-numeric/src/numeric/numeric_register_facets.cpp b/xo-numeric/src/numeric/numeric_register_facets.cpp index fce3dc27..e70abe39 100644 --- a/xo-numeric/src/numeric/numeric_register_facets.cpp +++ b/xo-numeric/src/numeric/numeric_register_facets.cpp @@ -42,7 +42,8 @@ namespace xo { &FloatOps::cmp_equal, &FloatOps::cmp_notequal, &FloatOps::cmp_less, - &FloatOps::cmp_lessequal); + &FloatOps::cmp_lessequal, + &FloatOps::cmp_greatequal); NumericDispatch::instance().register_impl (&FloatIntegerOps::multiply, @@ -52,7 +53,8 @@ namespace xo { &FloatIntegerOps::cmp_equal, &FloatIntegerOps::cmp_notequal, &FloatIntegerOps::cmp_less, - &FloatIntegerOps::cmp_lessequal); + &FloatIntegerOps::cmp_lessequal, + &FloatIntegerOps::cmp_greatequal); NumericDispatch::instance().register_impl (&IntegerFloatOps::multiply, @@ -62,7 +64,8 @@ namespace xo { &IntegerFloatOps::cmp_equal, &IntegerFloatOps::cmp_notequal, &IntegerFloatOps::cmp_less, - &IntegerFloatOps::cmp_lessequal); + &IntegerFloatOps::cmp_lessequal, + &IntegerFloatOps::cmp_greatequal); NumericDispatch::instance().register_impl (&IntegerOps::multiply, @@ -72,7 +75,8 @@ namespace xo { &IntegerOps::cmp_equal, &IntegerOps::cmp_notequal, &IntegerOps::cmp_less, - &IntegerOps::cmp_lessequal); + &IntegerOps::cmp_lessequal, + &IntegerOps::cmp_greatequal); log && log(xtag("ANumeric.tseq", typeseq::id())); diff --git a/xo-numeric/src/numeric/numeric_register_primitives.cpp b/xo-numeric/src/numeric/numeric_register_primitives.cpp index ed5d777f..63c6f5fe 100644 --- a/xo-numeric/src/numeric/numeric_register_primitives.cpp +++ b/xo-numeric/src/numeric/numeric_register_primitives.cpp @@ -74,6 +74,8 @@ namespace xo { flags & InstallFlags::f_essential); ok = ok & install_aux(sink, mm, "_cmple", &NumericDispatch::cmp_lessequal, flags & InstallFlags::f_essential); + ok = ok & install_aux(sink, mm, "_cmpge", &NumericDispatch::cmp_greatequal, + flags & InstallFlags::f_essential); return ok; } diff --git a/xo-reader2/include/xo/reader2/ParserStateMachine.hpp b/xo-reader2/include/xo/reader2/ParserStateMachine.hpp index f8a0a796..3ae647dc 100644 --- a/xo-reader2/include/xo/reader2/ParserStateMachine.hpp +++ b/xo-reader2/include/xo/reader2/ParserStateMachine.hpp @@ -104,10 +104,12 @@ namespace xo { obj cmpeq_pm() const; /** polymorphic inequality comparison. Use to implement infix op!= **/ obj cmpne_pm() const; - /** polymorphich less-than comparison. Use to implement infix op< **/ + /** polymorphic less-than comparison. Use to implement infix op< **/ obj cmplt_pm() const; - /** polymorphich less-or-equal comparison. Use to implement infix op<= **/ + /** polymorphic less-or-equal comparison. Use to implement infix op<= **/ obj cmple_pm() const; + /** polymorphic greater-or-equal comparison. Use to implement infix op>= **/ + obj cmpge_pm() const; /** true iff state machine is currently idle (at top-level) **/ bool is_at_toplevel() const noexcept; @@ -421,6 +423,7 @@ namespace xo { Binding cmpne_binding_; Binding cmplt_binding_; Binding cmple_binding_; + Binding cmpge_binding_; /** current output from parser **/ ParserResult result_; diff --git a/xo-reader2/src/reader2/DApplySsm.cpp b/xo-reader2/src/reader2/DApplySsm.cpp index dc263b75..bcbd5c60 100644 --- a/xo-reader2/src/reader2/DApplySsm.cpp +++ b/xo-reader2/src/reader2/DApplySsm.cpp @@ -159,7 +159,7 @@ namespace xo { case tokentype::tk_leftangle: case tokentype::tk_rightangle: case tokentype::tk_cmple: - case tokentype::tk_greatequal: + case tokentype::tk_cmpge: case tokentype::tk_dot: case tokentype::tk_comma: case tokentype::tk_doublecolon: diff --git a/xo-reader2/src/reader2/DDefineSsm.cpp b/xo-reader2/src/reader2/DDefineSsm.cpp index ba7c1a01..4634e0a2 100644 --- a/xo-reader2/src/reader2/DDefineSsm.cpp +++ b/xo-reader2/src/reader2/DDefineSsm.cpp @@ -534,7 +534,7 @@ namespace xo { case tokentype::tk_leftangle: case tokentype::tk_rightangle: case tokentype::tk_cmple: - case tokentype::tk_greatequal: + case tokentype::tk_cmpge: case tokentype::tk_dot: case tokentype::tk_comma: case tokentype::tk_doublecolon: diff --git a/xo-reader2/src/reader2/DDeftypeSsm.cpp b/xo-reader2/src/reader2/DDeftypeSsm.cpp index ca0baf7f..865ed436 100644 --- a/xo-reader2/src/reader2/DDeftypeSsm.cpp +++ b/xo-reader2/src/reader2/DDeftypeSsm.cpp @@ -139,7 +139,7 @@ namespace xo { case tokentype::tk_leftangle: case tokentype::tk_rightangle: case tokentype::tk_cmple: - case tokentype::tk_greatequal: + case tokentype::tk_cmpge: case tokentype::tk_dot: case tokentype::tk_comma: case tokentype::tk_assign: diff --git a/xo-reader2/src/reader2/DExpectExprSsm.cpp b/xo-reader2/src/reader2/DExpectExprSsm.cpp index ae7a0cb6..7dcc1d06 100644 --- a/xo-reader2/src/reader2/DExpectExprSsm.cpp +++ b/xo-reader2/src/reader2/DExpectExprSsm.cpp @@ -180,7 +180,7 @@ namespace xo { case tokentype::tk_leftangle: case tokentype::tk_rightangle: case tokentype::tk_cmple: - case tokentype::tk_greatequal: + case tokentype::tk_cmpge: case tokentype::tk_dot: case tokentype::tk_comma: case tokentype::tk_doublecolon: diff --git a/xo-reader2/src/reader2/DExpectFormalArgSsm.cpp b/xo-reader2/src/reader2/DExpectFormalArgSsm.cpp index e20a935c..b8c5f425 100644 --- a/xo-reader2/src/reader2/DExpectFormalArgSsm.cpp +++ b/xo-reader2/src/reader2/DExpectFormalArgSsm.cpp @@ -123,7 +123,7 @@ namespace xo { case tokentype::tk_leftangle: case tokentype::tk_rightangle: case tokentype::tk_cmple: - case tokentype::tk_greatequal: + case tokentype::tk_cmpge: case tokentype::tk_dot: case tokentype::tk_comma: case tokentype::tk_doublecolon: diff --git a/xo-reader2/src/reader2/DExpectFormalArglistSsm.cpp b/xo-reader2/src/reader2/DExpectFormalArglistSsm.cpp index 65adb978..d68beef5 100644 --- a/xo-reader2/src/reader2/DExpectFormalArglistSsm.cpp +++ b/xo-reader2/src/reader2/DExpectFormalArglistSsm.cpp @@ -154,7 +154,7 @@ namespace xo { case tokentype::tk_leftangle: case tokentype::tk_rightangle: case tokentype::tk_cmple: - case tokentype::tk_greatequal: + case tokentype::tk_cmpge: case tokentype::tk_dot: case tokentype::tk_doublecolon: case tokentype::tk_assign: diff --git a/xo-reader2/src/reader2/DExpectListTypeSsm.cpp b/xo-reader2/src/reader2/DExpectListTypeSsm.cpp index f99810f3..36723a6a 100644 --- a/xo-reader2/src/reader2/DExpectListTypeSsm.cpp +++ b/xo-reader2/src/reader2/DExpectListTypeSsm.cpp @@ -115,7 +115,7 @@ namespace xo { case tokentype::tk_leftbracket: case tokentype::tk_rightbracket: case tokentype::tk_cmple: - case tokentype::tk_greatequal: + case tokentype::tk_cmpge: case tokentype::tk_dot: case tokentype::tk_comma: case tokentype::tk_doublecolon: diff --git a/xo-reader2/src/reader2/DExpectQArraySsm.cpp b/xo-reader2/src/reader2/DExpectQArraySsm.cpp index aee31dbc..a86bcdae 100644 --- a/xo-reader2/src/reader2/DExpectQArraySsm.cpp +++ b/xo-reader2/src/reader2/DExpectQArraySsm.cpp @@ -111,7 +111,7 @@ namespace xo { case tokentype::tk_leftangle: case tokentype::tk_rightangle: case tokentype::tk_cmple: - case tokentype::tk_greatequal: + case tokentype::tk_cmpge: case tokentype::tk_dot: case tokentype::tk_doublecolon: case tokentype::tk_assign: diff --git a/xo-reader2/src/reader2/DExpectQListSsm.cpp b/xo-reader2/src/reader2/DExpectQListSsm.cpp index 731dec1c..50cde338 100644 --- a/xo-reader2/src/reader2/DExpectQListSsm.cpp +++ b/xo-reader2/src/reader2/DExpectQListSsm.cpp @@ -111,7 +111,7 @@ namespace xo { case tokentype::tk_leftangle: case tokentype::tk_rightangle: case tokentype::tk_cmple: - case tokentype::tk_greatequal: + case tokentype::tk_cmpge: case tokentype::tk_dot: case tokentype::tk_doublecolon: case tokentype::tk_assign: diff --git a/xo-reader2/src/reader2/DExpectQLiteralSsm.cpp b/xo-reader2/src/reader2/DExpectQLiteralSsm.cpp index 73b7efd5..89e79b85 100644 --- a/xo-reader2/src/reader2/DExpectQLiteralSsm.cpp +++ b/xo-reader2/src/reader2/DExpectQLiteralSsm.cpp @@ -129,7 +129,7 @@ namespace xo { case tokentype::tk_leftangle: case tokentype::tk_rightangle: case tokentype::tk_cmple: - case tokentype::tk_greatequal: + case tokentype::tk_cmpge: case tokentype::tk_dot: case tokentype::tk_doublecolon: case tokentype::tk_assign: diff --git a/xo-reader2/src/reader2/DExpectSymbolSsm.cpp b/xo-reader2/src/reader2/DExpectSymbolSsm.cpp index 0437417d..b1754e33 100644 --- a/xo-reader2/src/reader2/DExpectSymbolSsm.cpp +++ b/xo-reader2/src/reader2/DExpectSymbolSsm.cpp @@ -89,7 +89,7 @@ namespace xo { case tokentype::tk_leftangle: case tokentype::tk_rightangle: case tokentype::tk_cmple: - case tokentype::tk_greatequal: + case tokentype::tk_cmpge: case tokentype::tk_dot: case tokentype::tk_comma: case tokentype::tk_doublecolon: diff --git a/xo-reader2/src/reader2/DExpectTypeSsm.cpp b/xo-reader2/src/reader2/DExpectTypeSsm.cpp index cbe73dae..4af50bea 100644 --- a/xo-reader2/src/reader2/DExpectTypeSsm.cpp +++ b/xo-reader2/src/reader2/DExpectTypeSsm.cpp @@ -92,7 +92,7 @@ namespace xo { case tokentype::tk_leftangle: case tokentype::tk_rightangle: case tokentype::tk_cmple: - case tokentype::tk_greatequal: + case tokentype::tk_cmpge: case tokentype::tk_dot: case tokentype::tk_comma: case tokentype::tk_colon: diff --git a/xo-reader2/src/reader2/DIfElseSsm.cpp b/xo-reader2/src/reader2/DIfElseSsm.cpp index 0a49bf38..e599f6ad 100644 --- a/xo-reader2/src/reader2/DIfElseSsm.cpp +++ b/xo-reader2/src/reader2/DIfElseSsm.cpp @@ -174,7 +174,7 @@ namespace xo { case tokentype::tk_leftangle: case tokentype::tk_rightangle: case tokentype::tk_cmple: - case tokentype::tk_greatequal: + case tokentype::tk_cmpge: case tokentype::tk_dot: case tokentype::tk_comma: case tokentype::tk_doublecolon: diff --git a/xo-reader2/src/reader2/DLambdaSsm.cpp b/xo-reader2/src/reader2/DLambdaSsm.cpp index 8503e4e9..f8d0fa13 100644 --- a/xo-reader2/src/reader2/DLambdaSsm.cpp +++ b/xo-reader2/src/reader2/DLambdaSsm.cpp @@ -152,7 +152,7 @@ namespace xo { case tokentype::tk_leftangle: case tokentype::tk_rightangle: case tokentype::tk_cmple: - case tokentype::tk_greatequal: + case tokentype::tk_cmpge: case tokentype::tk_dot: case tokentype::tk_comma: case tokentype::tk_doublecolon: diff --git a/xo-reader2/src/reader2/DParenSsm.cpp b/xo-reader2/src/reader2/DParenSsm.cpp index 3eeb1f5e..5fc33059 100644 --- a/xo-reader2/src/reader2/DParenSsm.cpp +++ b/xo-reader2/src/reader2/DParenSsm.cpp @@ -120,7 +120,7 @@ namespace xo { case tokentype::tk_leftangle: case tokentype::tk_rightangle: case tokentype::tk_cmple: - case tokentype::tk_greatequal: + case tokentype::tk_cmpge: case tokentype::tk_dot: case tokentype::tk_comma: case tokentype::tk_doublecolon: diff --git a/xo-reader2/src/reader2/DProgressSsm.cpp b/xo-reader2/src/reader2/DProgressSsm.cpp index d52a98c0..80b7bb26 100644 --- a/xo-reader2/src/reader2/DProgressSsm.cpp +++ b/xo-reader2/src/reader2/DProgressSsm.cpp @@ -138,7 +138,7 @@ namespace xo { return optype::op_less_equal; case tokentype::tk_rightangle: return optype::op_great; - case tokentype::tk_greatequal: + case tokentype::tk_cmpge: // [>=] return optype::op_great_equal; default: assert(false); @@ -291,7 +291,6 @@ namespace xo { case tokentype::tk_rightbracket: case tokentype::tk_leftbrace: case tokentype::tk_rightangle: - case tokentype::tk_greatequal: case tokentype::tk_dot: case tokentype::tk_doublecolon: case tokentype::tk_assign: @@ -306,6 +305,7 @@ namespace xo { case tokentype::tk_cmpne: case tokentype::tk_leftangle: case tokentype::tk_cmple: + case tokentype::tk_cmpge: this->on_operator_token(tk, p_psm); return; @@ -1170,10 +1170,16 @@ namespace xo { lhs_, rhs_); case optype::op_great: - case optype::op_great_equal: assert(false); break; + case optype::op_great_equal: + return assemble_numeric_expr_aux + (p_psm->expr_alloc(), + TypeRef::prefix_type::from_chars("_cmpge_gco"), + p_psm->cmpge_pm(), + lhs_, rhs_); + case optype::op_multiply: return assemble_numeric_expr_aux (p_psm->expr_alloc(), diff --git a/xo-reader2/src/reader2/DQuoteSsm.cpp b/xo-reader2/src/reader2/DQuoteSsm.cpp index 2e335064..6d885e0b 100644 --- a/xo-reader2/src/reader2/DQuoteSsm.cpp +++ b/xo-reader2/src/reader2/DQuoteSsm.cpp @@ -121,7 +121,7 @@ namespace xo { case tokentype::tk_leftangle: case tokentype::tk_rightangle: case tokentype::tk_cmple: - case tokentype::tk_greatequal: + case tokentype::tk_cmpge: case tokentype::tk_dot: case tokentype::tk_comma: case tokentype::tk_doublecolon: diff --git a/xo-reader2/src/reader2/DSequenceSsm.cpp b/xo-reader2/src/reader2/DSequenceSsm.cpp index 6311a2ae..c2a07966 100644 --- a/xo-reader2/src/reader2/DSequenceSsm.cpp +++ b/xo-reader2/src/reader2/DSequenceSsm.cpp @@ -102,7 +102,7 @@ namespace xo { case tokentype::tk_leftangle: case tokentype::tk_rightangle: case tokentype::tk_cmple: - case tokentype::tk_greatequal: + case tokentype::tk_cmpge: case tokentype::tk_dot: case tokentype::tk_comma: case tokentype::tk_doublecolon: diff --git a/xo-reader2/src/reader2/DToplevelSeqSsm.cpp b/xo-reader2/src/reader2/DToplevelSeqSsm.cpp index 193ea42c..113ec235 100644 --- a/xo-reader2/src/reader2/DToplevelSeqSsm.cpp +++ b/xo-reader2/src/reader2/DToplevelSeqSsm.cpp @@ -175,7 +175,7 @@ namespace xo { case tokentype::tk_leftangle: case tokentype::tk_rightangle: case tokentype::tk_cmple: - case tokentype::tk_greatequal: + case tokentype::tk_cmpge: case tokentype::tk_dot: case tokentype::tk_comma: case tokentype::tk_colon: diff --git a/xo-reader2/src/reader2/ParserStateMachine.cpp b/xo-reader2/src/reader2/ParserStateMachine.cpp index 71c52791..1bc9066f 100644 --- a/xo-reader2/src/reader2/ParserStateMachine.cpp +++ b/xo-reader2/src/reader2/ParserStateMachine.cpp @@ -150,6 +150,12 @@ namespace xo { assert(name); this->cmple_binding_ = global_symtab_->lookup_binding(name); } + + { + const DUniqueString * name = stringtable_.lookup("_cmpge"); + assert(name); + this->cmpge_binding_ = global_symtab_->lookup_binding(name); + } } ParserStateMachine::~ParserStateMachine() @@ -235,6 +241,15 @@ namespace xo { return retval; } + obj + ParserStateMachine::cmpge_pm() const + { + obj retval = global_env_->lookup_value(cmpge_binding_); + assert(retval); + + return retval; + } + bool ParserStateMachine::is_at_toplevel() const noexcept { diff --git a/xo-tokenizer2/include/xo/tokenizer2/tokentype.hpp b/xo-tokenizer2/include/xo/tokenizer2/tokentype.hpp index 18857af9..a5538131 100644 --- a/xo-tokenizer2/include/xo/tokenizer2/tokentype.hpp +++ b/xo-tokenizer2/include/xo/tokenizer2/tokentype.hpp @@ -95,7 +95,7 @@ namespace xo { tk_cmple, /** great-equal @c '>=' **/ - tk_greatequal, + tk_cmpge, /** dot @c '.' **/ tk_dot, diff --git a/xo-tokenizer2/src/tokenizer2/Tokenizer.cpp b/xo-tokenizer2/src/tokenizer2/Tokenizer.cpp index 76881e7f..88f03755 100644 --- a/xo-tokenizer2/src/tokenizer2/Tokenizer.cpp +++ b/xo-tokenizer2/src/tokenizer2/Tokenizer.cpp @@ -500,7 +500,7 @@ namespace xo { log && log("rightangle or greatequal token"); if (*(ix + 1) == '=') { - tk_type = tokentype::tk_greatequal; + tk_type = tokentype::tk_cmpge; ++ix; ++ix; } else { diff --git a/xo-tokenizer2/src/tokenizer2/tokentype.cpp b/xo-tokenizer2/src/tokenizer2/tokentype.cpp index e704b38d..c9749a34 100644 --- a/xo-tokenizer2/src/tokenizer2/tokentype.cpp +++ b/xo-tokenizer2/src/tokenizer2/tokentype.cpp @@ -30,7 +30,7 @@ namespace xo { CASE(tk_rightangle); CASE(tk_cmple); - CASE(tk_greatequal); + CASE(tk_cmpge); CASE(tk_dot); CASE(tk_comma); CASE(tk_colon);