From 6104515656f173d2c82b025b2fa9fd01493fad67 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/reader2/ParserStateMachine.hpp | 7 +++++-- src/reader2/DApplySsm.cpp | 2 +- src/reader2/DDefineSsm.cpp | 2 +- src/reader2/DDeftypeSsm.cpp | 2 +- src/reader2/DExpectExprSsm.cpp | 2 +- src/reader2/DExpectFormalArgSsm.cpp | 2 +- src/reader2/DExpectFormalArglistSsm.cpp | 2 +- src/reader2/DExpectListTypeSsm.cpp | 2 +- src/reader2/DExpectQArraySsm.cpp | 2 +- src/reader2/DExpectQListSsm.cpp | 2 +- src/reader2/DExpectQLiteralSsm.cpp | 2 +- src/reader2/DExpectSymbolSsm.cpp | 2 +- src/reader2/DExpectTypeSsm.cpp | 2 +- src/reader2/DIfElseSsm.cpp | 2 +- src/reader2/DLambdaSsm.cpp | 2 +- src/reader2/DParenSsm.cpp | 2 +- src/reader2/DProgressSsm.cpp | 12 +++++++++--- src/reader2/DQuoteSsm.cpp | 2 +- src/reader2/DSequenceSsm.cpp | 2 +- src/reader2/DToplevelSeqSsm.cpp | 2 +- src/reader2/ParserStateMachine.cpp | 15 +++++++++++++++ 21 files changed, 47 insertions(+), 23 deletions(-) diff --git a/include/xo/reader2/ParserStateMachine.hpp b/include/xo/reader2/ParserStateMachine.hpp index f8a0a796..3ae647dc 100644 --- a/include/xo/reader2/ParserStateMachine.hpp +++ b/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/src/reader2/DApplySsm.cpp b/src/reader2/DApplySsm.cpp index dc263b75..bcbd5c60 100644 --- a/src/reader2/DApplySsm.cpp +++ b/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/src/reader2/DDefineSsm.cpp b/src/reader2/DDefineSsm.cpp index ba7c1a01..4634e0a2 100644 --- a/src/reader2/DDefineSsm.cpp +++ b/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/src/reader2/DDeftypeSsm.cpp b/src/reader2/DDeftypeSsm.cpp index ca0baf7f..865ed436 100644 --- a/src/reader2/DDeftypeSsm.cpp +++ b/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/src/reader2/DExpectExprSsm.cpp b/src/reader2/DExpectExprSsm.cpp index ae7a0cb6..7dcc1d06 100644 --- a/src/reader2/DExpectExprSsm.cpp +++ b/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/src/reader2/DExpectFormalArgSsm.cpp b/src/reader2/DExpectFormalArgSsm.cpp index e20a935c..b8c5f425 100644 --- a/src/reader2/DExpectFormalArgSsm.cpp +++ b/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/src/reader2/DExpectFormalArglistSsm.cpp b/src/reader2/DExpectFormalArglistSsm.cpp index 65adb978..d68beef5 100644 --- a/src/reader2/DExpectFormalArglistSsm.cpp +++ b/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/src/reader2/DExpectListTypeSsm.cpp b/src/reader2/DExpectListTypeSsm.cpp index f99810f3..36723a6a 100644 --- a/src/reader2/DExpectListTypeSsm.cpp +++ b/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/src/reader2/DExpectQArraySsm.cpp b/src/reader2/DExpectQArraySsm.cpp index aee31dbc..a86bcdae 100644 --- a/src/reader2/DExpectQArraySsm.cpp +++ b/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/src/reader2/DExpectQListSsm.cpp b/src/reader2/DExpectQListSsm.cpp index 731dec1c..50cde338 100644 --- a/src/reader2/DExpectQListSsm.cpp +++ b/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/src/reader2/DExpectQLiteralSsm.cpp b/src/reader2/DExpectQLiteralSsm.cpp index 73b7efd5..89e79b85 100644 --- a/src/reader2/DExpectQLiteralSsm.cpp +++ b/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/src/reader2/DExpectSymbolSsm.cpp b/src/reader2/DExpectSymbolSsm.cpp index 0437417d..b1754e33 100644 --- a/src/reader2/DExpectSymbolSsm.cpp +++ b/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/src/reader2/DExpectTypeSsm.cpp b/src/reader2/DExpectTypeSsm.cpp index cbe73dae..4af50bea 100644 --- a/src/reader2/DExpectTypeSsm.cpp +++ b/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/src/reader2/DIfElseSsm.cpp b/src/reader2/DIfElseSsm.cpp index 0a49bf38..e599f6ad 100644 --- a/src/reader2/DIfElseSsm.cpp +++ b/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/src/reader2/DLambdaSsm.cpp b/src/reader2/DLambdaSsm.cpp index 8503e4e9..f8d0fa13 100644 --- a/src/reader2/DLambdaSsm.cpp +++ b/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/src/reader2/DParenSsm.cpp b/src/reader2/DParenSsm.cpp index 3eeb1f5e..5fc33059 100644 --- a/src/reader2/DParenSsm.cpp +++ b/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/src/reader2/DProgressSsm.cpp b/src/reader2/DProgressSsm.cpp index d52a98c0..80b7bb26 100644 --- a/src/reader2/DProgressSsm.cpp +++ b/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/src/reader2/DQuoteSsm.cpp b/src/reader2/DQuoteSsm.cpp index 2e335064..6d885e0b 100644 --- a/src/reader2/DQuoteSsm.cpp +++ b/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/src/reader2/DSequenceSsm.cpp b/src/reader2/DSequenceSsm.cpp index 6311a2ae..c2a07966 100644 --- a/src/reader2/DSequenceSsm.cpp +++ b/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/src/reader2/DToplevelSeqSsm.cpp b/src/reader2/DToplevelSeqSsm.cpp index 193ea42c..113ec235 100644 --- a/src/reader2/DToplevelSeqSsm.cpp +++ b/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/src/reader2/ParserStateMachine.cpp b/src/reader2/ParserStateMachine.cpp index 71c52791..1bc9066f 100644 --- a/src/reader2/ParserStateMachine.cpp +++ b/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 {