From bc5ccb37e8222ee840f1906f2c4709394b17336d Mon Sep 17 00:00:00 2001 From: codeboss <2422523675@qq.com> Date: Fri, 14 Feb 2025 15:33:23 +0800 Subject: [PATCH] update --- libSyntax/libsyntax.cpp | 145 +++++++++++++++++++++---------------- libSyntax/libsyntax.h | 32 ++++---- libSyntax/syntax_novel.cpp | 12 ++- 3 files changed, 112 insertions(+), 77 deletions(-) diff --git a/libSyntax/libsyntax.cpp b/libSyntax/libsyntax.cpp index a47b5d9..ef5d4c1 100644 --- a/libSyntax/libsyntax.cpp +++ b/libSyntax/libsyntax.cpp @@ -19,6 +19,7 @@ QList> __anyone_impl::parse(std::shared_ptrmustStop()) return QList>() << cursor; + auto syntax = present(); QList> result_list; for (auto rx : this->children()) result_list.append(rx->parse(cursor)); @@ -58,39 +59,41 @@ QList> __sequence_impl::parse(std::shared_ptr if (cursor->mustStop()) return QList>() << cursor; - QList> results; QList> bridge_list{ cursor }; for (auto rule : this->children()) { QList> current_result; - std::for_each(bridge_list.begin(), bridge_list.end(), - [&](std::shared_ptr vcurs) { - if (!vcurs->mustStop()) { - current_result.append(rule->parse(vcurs)); - } - else { - results.push_back(vcurs); - } + for (auto vcurs : bridge_list) { + if (!vcurs->mustStop()) { + current_result.append(rule->parse(vcurs)); + } + } + + // 完全匹配的分支 + decltype(current_result) temprary_list; + std::copy_if(current_result.begin(), current_result.end(), + std::back_inserter(temprary_list), [&](std::shared_ptr ins) { + return cursor->totalErrorCount() == ins->totalErrorCount(); }); + if (temprary_list.size()) { + bridge_list = temprary_list; + continue; + } + + + // 经过修复的分支 + std::copy_if(current_result.begin(), current_result.end(), std::back_inserter(temprary_list), + [&](std::shared_ptr ins) { return !ins->mustStop(); }); + if (temprary_list.size()) { + bridge_list = temprary_list; + continue; + } + bridge_list = current_result; + break; } - // 完全匹配分支集合 - decltype(bridge_list) completely_list; - std::copy_if(bridge_list.begin(), bridge_list.end(), std::back_inserter(completely_list), - [&](std::shared_ptr ins) { return ins->totalErrorCount() == cursor->totalErrorCount(); }); - if (completely_list.size()) - return completely_list; - - // 经过修正的分支 - decltype(bridge_list) modify_list; - std::copy_if(bridge_list.begin(), bridge_list.end(), std::back_inserter(modify_list), - [](std::shared_ptr ins) { return !ins->mustStop(); }); - if (modify_list.size()) - return modify_list; - - results.append(bridge_list); - return results; + return bridge_list; } QString __sequence_impl::present() const { @@ -112,6 +115,8 @@ QList> __repeat_impl::parse(std::shared_ptrmustStop()) return QList>() << cursor; + auto syntax = present(); + QList> max_match_begin = { cursor }; if (min_match) { QList> temp_rules; @@ -135,31 +140,41 @@ QList> __repeat_impl::parse(std::shared_ptr> results = max_match_begin; + QList> results; decltype(results) bridge_list = max_match_begin; // 尝试重复匹配最大次数 - for (auto idx = min_match; idx < max_match && bridge_list.size(); ++idx) { + for (auto idx = min_match; idx < max_match; ++idx) { QList> current_list; // 匹配迭代一次 - std::for_each(bridge_list.begin(), bridge_list.end(), - [&](std::shared_ptr ins) { - current_list.append(this->rule_peer->parse(ins)); - }); + for (auto ins : bridge_list) + current_list.append(this->rule_peer->parse(ins)); - for (auto vdx = 0; vdx < current_list.size(); ++vdx) { - auto rst_branch = current_list.at(vdx); - if (rst_branch->mustStop()) { - results.append(rst_branch); - current_list.removeAt(vdx--); - } + // 提取完全匹配的分支 + QList> temprary_branchs; + std::copy_if(current_list.begin(), current_list.end(), + std::back_inserter(temprary_branchs), [&](std::shared_ptr ins) { + return cursor->totalErrorCount() == ins->totalErrorCount() && + ins->currentToken()->position() > cursor->currentToken()->position(); + }); + if (temprary_branchs.size()) { + bridge_list = temprary_branchs; + continue; } - bridge_list = current_list; + // 提取语法修正分支 + std::copy_if(current_list.begin(), current_list.end(), + std::back_inserter(temprary_branchs), [&](std::shared_ptr ins) { + return !ins->mustStop() && ins->currentToken()->position() > cursor->currentToken()->position(); + }); + if (temprary_branchs.size()) { + bridge_list = temprary_branchs; + continue; + } + break; } + results.append(bridge_list); - - std::sort(results.begin(), results.end(), [](std::shared_ptr a, std::shared_ptr b) { return a->currentToken()->position() > b->currentToken()->position(); @@ -167,31 +182,29 @@ QList> __repeat_impl::parse(std::shared_ptr ins) { - if (ins->totalErrorCount() == cursor->totalErrorCount()) { - if (!rets_completely.size()) { - rets_completely.append(ins); - } - else if (rets_completely.last()->currentToken()->position() == ins->currentToken()->position()) { - rets_completely.append(ins); - } + for (auto ins : results) { + if (ins->totalErrorCount() == cursor->totalErrorCount()) { + if (!rets_completely.size()) { + rets_completely.append(ins); } - }); + else if (rets_completely.last()->currentToken()->position() == ins->currentToken()->position()) { + rets_completely.append(ins); + } + } + } // 提取经过修正的分支 decltype(results) rets_modified; - std::for_each(results.begin(), results.end(), - [&](std::shared_ptr ins) { - if (!ins->mustStop()) { - if (!rets_modified.size()) { - rets_modified.append(ins); - } - else if (rets_modified.last()->currentToken()->position() == ins->currentToken()->position()) { - rets_modified.append(ins); - } + for (auto ins : results) { + if (!ins->mustStop()) { + if (!rets_modified.size()) { + rets_modified.append(ins); } - }); + else if (rets_modified.last()->currentToken()->position() == ins->currentToken()->position()) { + rets_modified.append(ins); + } + } + } // 允许持续的集合 rets_completely.append(rets_modified); @@ -238,9 +251,12 @@ MatchCursor::MatchCursor(std::shared_ptr other_ptr) : _prev_cursor(other_ptr), _file_path(other_ptr->_file_path), _total_errors(other_ptr->_total_errors), - _exprs_errors(other_ptr->_exprs_errors), _current_token(other_ptr->_current_token), - _remains_word(other_ptr->_remains_word) { } + _remains_word(other_ptr->_remains_word) { + for (auto err_pack : other_ptr->_exprs_errors) { + _exprs_errors << std::make_shared(*err_pack); + } +} std::shared_ptr MatchCursor::previous() const { return _prev_cursor; @@ -299,6 +315,11 @@ bool lib_syntax::MatchCursor::parse_stop() const { return !currentWords(); } +lib_syntax::MatchCursor::ErrsPack::ErrsPack() { } + +lib_syntax::MatchCursor::ErrsPack::ErrsPack(const ErrsPack& other) + : _error_collection(other._error_collection) { } + void MatchCursor::ErrsPack::addError(const QString& msg) { this->_error_collection.append(msg); } diff --git a/libSyntax/libsyntax.h b/libSyntax/libsyntax.h index a1f520b..c153fbb 100644 --- a/libSyntax/libsyntax.h +++ b/libSyntax/libsyntax.h @@ -37,6 +37,9 @@ namespace lib_syntax { public: class ErrsPack { public: + ErrsPack(); + ErrsPack(const ErrsPack& other); + void addError(const QString& msg); QList errors() const; uint64_t errorCount() const; @@ -292,6 +295,8 @@ namespace lib_syntax { if (cursor->mustStop()) return QList>() << cursor; + auto syntax = present(); + auto t_this = cursor->currentToken(); auto w_this = cursor->currentWords(); // 起始Token打点 @@ -324,22 +329,21 @@ namespace lib_syntax { decltype(nbranch) results_fnl; - std::for_each(branch_procs.begin(), branch_procs.end(), - [&](std::shared_ptr curs) { - if (curs->mustStop()) - results_fnl.append(curs); - else { - auto t_end = curs->currentToken(); - auto w_end = curs->currentWords(); + for (auto curs : branch_procs) { + if (curs->mustStop()) + results_fnl.append(curs); + else { + auto t_end = curs->currentToken(); + auto w_end = curs->currentWords(); - auto ecursor = std::make_shared(curs); - ecursor->quitExprs(); + auto ecursor = std::make_shared(curs); + ecursor->quitExprs(); - auto split_end = std::make_shared>(split_begin, t_end); - ecursor->setCurrent(split_end, w_end); - results_fnl.append(ecursor); - } - }); + auto split_end = std::make_shared>(split_begin, t_end); + ecursor->setCurrent(split_end, w_end); + results_fnl.append(ecursor); + } + } return results_fnl; } diff --git a/libSyntax/syntax_novel.cpp b/libSyntax/syntax_novel.cpp index 64696a8..ab071f1 100644 --- a/libSyntax/syntax_novel.cpp +++ b/libSyntax/syntax_novel.cpp @@ -69,6 +69,7 @@ public: auto syntax_text = this->present(); auto current_rst = content_extract(cursor->currentToken()); auto rst = _children_store->parse(cursor); + return rst; } }; @@ -129,7 +130,16 @@ public: // 通过 ElementRule 继承 QList> expr_rule_parse(std::shared_ptr cursor) const override { - return _children_store->parse(cursor); + auto syntax = this->present(); + auto current_rst = content_extract(cursor->currentToken()); + auto rst = _children_store->parse(cursor); + + QString result_list; + for (auto c : rst) { + result_list += content_extract(c->currentToken()) += "\n"; + } + + return rst; } };