From 74ce31b072b54937cfecd0cf6f920256c12b5c3a Mon Sep 17 00:00:00 2001 From: codeboss <2422523675@qq.com> Date: Mon, 17 Feb 2025 13:59:25 +0800 Subject: [PATCH] update --- CoreTest/main.cpp | 2 +- WsNovelParser/htmlprint.h | 18 ++++++- libSyntax/ast_novel.cpp | 2 +- libSyntax/ast_novel.h | 4 -- libSyntax/libsyntax.cpp | 108 +++++++++++++++++++++++-------------- libSyntax/libsyntax.h | 24 ++++++--- libSyntax/syntax_novel.cpp | 24 ++++----- 7 files changed, 116 insertions(+), 66 deletions(-) diff --git a/CoreTest/main.cpp b/CoreTest/main.cpp index b2f225e..996e154 100644 --- a/CoreTest/main.cpp +++ b/CoreTest/main.cpp @@ -14,7 +14,7 @@ int main(int argc, char* argv[]) { QFile in("D:\\Projects\\Cpp\\WsNovelParser\\x64\\test_file\\description - 副本.story"); in.open(QIODevice::ReadOnly | QIODevice::Text); QTextStream tt(&in); - tt.setCodec("UTF-8"); + //tt.setCodec("UTF-8"); lib_words::WordReader reader; auto vwords = reader.wordsFrom(tt, "D:\\Projects\\Cpp\\WsNovelParser\\x64\\test_file\\description - 副本.story"); diff --git a/WsNovelParser/htmlprint.h b/WsNovelParser/htmlprint.h index de902b8..44ba2b9 100644 --- a/WsNovelParser/htmlprint.h +++ b/WsNovelParser/htmlprint.h @@ -8,8 +8,24 @@ #include namespace printer { + /** + * 概括页面 + * 故事分卷汇总 + * 故事脉络汇总 + * 故事脉络关系图. + * + * 故事脉络发展页面 + * 故事剧情节点汇总 + * 内容展示 + * + * 剧情节点汇总页面 + * 引用来源汇总 + * 各节点内容展示 + */ + + /* - * @brief 所有可访问元素的基类:卷宗、故事线、剧情、节点等 + * @brief 所有可访问元素的基类:卷宗、章节、故事线、剧情、节点、引用等 */ class Access : public std::enable_shared_from_this { public: diff --git a/libSyntax/ast_novel.cpp b/libSyntax/ast_novel.cpp index ab4a1aa..c21f901 100644 --- a/libSyntax/ast_novel.cpp +++ b/libSyntax/ast_novel.cpp @@ -19,7 +19,7 @@ QString TextSection::content() const { } QString TextSection::signature() const { - return "::section"; + return parent().lock()->signature() + "&::section"; } PointRefers::PointRefers(std::shared_ptr rule_bind) diff --git a/libSyntax/ast_novel.h b/libSyntax/ast_novel.h index ab733f6..b65c9c8 100644 --- a/libSyntax/ast_novel.h +++ b/libSyntax/ast_novel.h @@ -131,13 +131,9 @@ namespace example_novel { template class AbstractImpl : public ast_basic::ExprInstance, public ast_gen::SyntaxElement { - private: - std::weak_ptr parent_store; - public: AbstractImpl(std::shared_ptr rule_bind) : ExprInstance(rule_bind) { - parent_store.reset(); } // 通过 SyntaxElement 继承 diff --git a/libSyntax/libsyntax.cpp b/libSyntax/libsyntax.cpp index 1f3c959..884c1bf 100644 --- a/libSyntax/libsyntax.cpp +++ b/libSyntax/libsyntax.cpp @@ -9,7 +9,18 @@ using namespace lib_token; using namespace lib_words; using namespace ast_basic; -__anyone_impl::__anyone_impl(const QList> mbrs) : mbrs_store(mbrs) { } +auto content_extractm = [](std::shared_ptr token) { + QString content; + while (token) { + if (token->defines()) + content.prepend(token->content() + " "); + token = token->prevToken(); + } + return content; + }; + +__anyone_impl::__anyone_impl(const QList> mbrs) : mbrs_store(mbrs) { +} QList> __anyone_impl::children() const { return mbrs_store; @@ -24,23 +35,31 @@ QList> __anyone_impl::parse(std::shared_ptrchildren()) result_list.append(rx->parse(cursor)); - // 完全匹配分支 + // 完全匹配分支,必须有匹配进展 decltype(result_list) completely_list; std::copy_if(result_list.begin(), result_list.end(), std::back_inserter(completely_list), [&](std::shared_ptr ins) { - return cursor->totalErrorCount() == ins->totalErrorCount() || ins->parseComplete(); + return (cursor->totalErrorCount() == ins->totalErrorCount() && ins->operator>(*cursor)) + || ins->parseComplete(); }); if (completely_list.size()) - return completely_list; + return completely_list.mid(0,1); - // 经过修正的分支 + // 经过修正的分支,必须有变化 decltype(result_list) modify_list; - std::copy_if(result_list.begin(), result_list.end(), std::back_inserter(modify_list), - [&](std::shared_ptr ins) { return !ins->parseFailure(); }); + std::copy_if(result_list.begin(), result_list.end(), + std::back_inserter(modify_list), + [&](std::shared_ptr ins) { + return !ins->parseFailure() && ins->totalErrorCount() > cursor->totalErrorCount(); + }); if (modify_list.size()) return modify_list; - return result_list; + // 匹配失败的分支 + decltype(result_list) errors_list; + std::copy_if(result_list.begin(), result_list.end(), + std::back_inserter(errors_list), [](std::shared_ptr it) { return it->parseFailure(); }); + return errors_list; } QString __anyone_impl::present() const { @@ -51,7 +70,9 @@ QString __anyone_impl::present() const { return members_content.mid(0, members_content.size() - 1); } -__sequence_impl::__sequence_impl(const QList> mbrs) : mbrs_store(mbrs) { } +__sequence_impl::__sequence_impl(const QList> mbrs) + : mbrs_store(mbrs) { +} QList> __sequence_impl::children() const { return mbrs_store; @@ -77,7 +98,7 @@ QList> __sequence_impl::parse(std::shared_ptr return cursor->totalErrorCount() == ins->totalErrorCount() || ins->parseComplete(); }); if (temprary_list.size()) { - bridge_list = temprary_list; + bridge_list = temprary_list.mid(0,1); continue; } @@ -95,7 +116,19 @@ QList> __sequence_impl::parse(std::shared_ptr break; } - return bridge_list; + decltype(bridge_list) temprary_list; + // 匹配代码有进展或者匹配成功 + std::copy_if(bridge_list.begin(), bridge_list.end(), + std::back_inserter(temprary_list), [&](std::shared_ptr ins) { + return ins->operator>(*cursor) || ins->parseComplete(); + }); + + if (temprary_list.size()) + return temprary_list; + + std::copy_if(bridge_list.begin(), bridge_list.end(), + std::back_inserter(temprary_list), [](std::shared_ptr ins) { return ins->parseFailure(); }); + return temprary_list; } QString __sequence_impl::present() const { @@ -106,23 +139,14 @@ QString __sequence_impl::present() const { } __repeat_impl::__repeat_impl(std::shared_ptr rule, int min, int max) - : rule_peer(rule), min_match(min), max_match(max) { } + : rule_peer(rule), min_match(min), max_match(max) { +} QList> __repeat_impl::children() const { return QList>() << rule_peer; } #include -auto content_extractw = [](std::shared_ptr token) { - QString content; - while (token) { - if (token->defines()) - content.prepend(token->content() + " "); - token = token->prevToken(); - } - return content; - }; - QList> __repeat_impl::parse(std::shared_ptr cursor) const { if (cursor->parseFailure() && cursor->parseComplete()) return QList>() << cursor; @@ -164,24 +188,23 @@ QList> __repeat_impl::parse(std::shared_ptr contents; for (auto bx : current_list) - contents << content_extractw(bx->token()) + QStringList(bx->totalErrors()).join(','); + contents << content_extractm(bx->token()) + QStringList(bx->totalErrors()).join(','); // 提取完全匹配的分支 QList> temprary_branchs; std::copy_if(current_list.begin(), current_list.end(), std::back_inserter(temprary_branchs), [&](std::shared_ptr ins) { - return ins->parseComplete() || (cursor->totalErrorCount() == ins->totalErrorCount() && - ins->token()->position() > cursor->token()->position()); + return (cursor->totalErrorCount() == ins->totalErrorCount() && (*ins) > (*cursor)) || ins->parseComplete(); }); if (temprary_branchs.size()) { - bridge_list = temprary_branchs; + bridge_list = temprary_branchs.mid(0, 1); continue; } // 提取语法修正分支 std::copy_if(current_list.begin(), current_list.end(), std::back_inserter(temprary_branchs), [&](std::shared_ptr ins) { - return !ins->parseFailure() && ins->token()->position() > cursor->token()->position(); + return !ins->parseFailure() && (*ins) > (*cursor); }); if (temprary_branchs.size()) { bridge_list = temprary_branchs; @@ -193,21 +216,17 @@ QList> __repeat_impl::parse(std::shared_ptr a, std::shared_ptr b) { - return a->token()->position() > b->token()->position(); + return a->operator>(*b); }); // 提取完全匹配的分支 decltype(results) rets_completely; for (auto ins : results) { - if (ins->totalErrorCount() == cursor->totalErrorCount()) { - if (!rets_completely.size()) { - rets_completely.append(ins); - } - else if (rets_completely.last()->token()->position() == ins->token()->position()) { - rets_completely.append(ins); - } + if (ins->totalErrorCount() == cursor->totalErrorCount() && !rets_completely.size()) { + rets_completely.append(ins); + break; } - else if(ins->parseComplete()) + else if (ins->parseComplete()) rets_completely.append(ins); } @@ -255,7 +274,8 @@ QString SyntaxException::message() const { } ExprRule::ExprRule(const QString& rule_name, int expr_mark) - : name_store(rule_name), mark_store(expr_mark) { } + : name_store(rule_name), mark_store(expr_mark) { +} QString ExprRule::name() const { return name_store; @@ -266,7 +286,8 @@ int ExprRule::typeMark() const { } #include -MatchCursor::MatchCursor(const QString& path) :_file_path(path) { } +MatchCursor::MatchCursor(const QString& path) :_file_path(path) { +} MatchCursor::MatchCursor(std::shared_ptr other_ptr) : _prev_cursor(other_ptr), @@ -279,6 +300,11 @@ MatchCursor::MatchCursor(std::shared_ptr other_ptr) } } +bool lib_syntax::MatchCursor::operator>(const MatchCursor& other) const { + return _current_token->position() > other._current_token->position() || + (_current_token->position() == other._current_token->position() && _total_errors.size() > other._total_errors.size()); +} + std::shared_ptr MatchCursor::previous() const { return _prev_cursor; } @@ -367,10 +393,12 @@ std::shared_ptr MatchCursor::words() const { return this->_remains_word; } -lib_syntax::MatchCursor::ErrsPack::ErrsPack() { } +lib_syntax::MatchCursor::ErrsPack::ErrsPack() { +} lib_syntax::MatchCursor::ErrsPack::ErrsPack(const ErrsPack& other) - : _error_collection(other._error_collection) { } + : _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 c4b4c4d..2ce613f 100644 --- a/libSyntax/libsyntax.h +++ b/libSyntax/libsyntax.h @@ -52,6 +52,8 @@ namespace lib_syntax { MatchCursor(std::shared_ptr other_ptr); virtual ~MatchCursor() = default; + bool operator>(const MatchCursor & other) const; + virtual std::shared_ptr previous() const; virtual QString filePath() const; virtual QString parseSyntax() const; @@ -239,18 +241,19 @@ namespace lib_syntax { // 少一个 auto short_one = std::make_shared(current); short_one->logExprsError(QString("SyntaxError[0x00002]语法匹配错误,缺失\"%1\">") - .arg(this->_define_peers->reviseWords()) - .arg(w_this->row()).arg(w_this->column()).arg(w_this->file())); + .arg(this->_define_peers->reviseWords()).arg(w_this->row()).arg(w_this->column()).arg(w_this->file())); + auto tkins0 = std::make_shared(w_this->row(), w_this->column(), w_this->position(), + QString("<+%1>").arg(this->_define_peers->reviseWords()), w_this->file(), this->_define_peers); + auto tkchain0 = std::make_shared>(tkins0, t_this); + short_one->setCurrent(tkchain0, w_this); retvals << short_one; // 错一个 auto error_one = std::make_shared(current); error_one->logExprsError(QString("SyntaxError[0x00003]语法匹配错误,请修正\"%1\">") .arg(w_this->content()).arg(w_this->row()).arg(w_this->column()).arg(w_this->file())); - auto tkins = std::make_shared( - w_this->row(), w_this->column(), w_this->position(), - QString("%2_%1").arg((uint64_t) error_one.get()).arg(this->_define_peers->reviseWords()), - w_this->file(), this->_define_peers); + auto tkins = std::make_shared(w_this->row(), w_this->column(), w_this->position(), + QString("<%1(%2)>").arg(w_this->content()).arg(this->_define_peers->reviseWords()), w_this->file(), this->_define_peers); auto tkchain = std::make_shared>(tkins, t_this); error_one->setCurrent(tkchain, w_this->nextWord()); retvals << error_one; @@ -340,8 +343,9 @@ namespace lib_syntax { decltype(nbranch) results_fnl; for (auto curs : branch_procs) { - if (curs->parseFailure()) + if (curs->parseFailure()) { results_fnl.append(curs); + } else { auto t_end = curs->token(); auto w_end = curs->words(); @@ -352,6 +356,12 @@ namespace lib_syntax { auto split_end = std::make_shared>(split_begin, t_end); ecursor->setCurrent(split_end, w_end); results_fnl.append(ecursor); + + if (curs->totalErrorCount() == cursor->totalErrorCount()) { + results_fnl.clear(); + results_fnl.append(ecursor); + break; + } } } diff --git a/libSyntax/syntax_novel.cpp b/libSyntax/syntax_novel.cpp index cdcc8f4..048655d 100644 --- a/libSyntax/syntax_novel.cpp +++ b/libSyntax/syntax_novel.cpp @@ -49,15 +49,15 @@ void rank_set(std::shared_ptr inst, std::shared_ptrsetRank(token->content().toInt()); } -auto content_extract = [](std::shared_ptr token) { - QString content; - while (token) { - if (token->defines()) - content.prepend(token->content() + " "); - token = token->prevToken(); - } - return content; - }; +//auto content_extract = [](std::shared_ptr token) { +// QString content; +// while (token) { +// if (token->defines()) +// content.prepend(token->content() + " "); +// token = token->prevToken(); +// } +// return content; +// }; using TextDeclsSyntaxDef = Any, Match>; class DeclSyntax : public ElementRule { @@ -192,13 +192,13 @@ public: // 通过 ElementRule 继承 QList> expr_rule_parse(std::shared_ptr cursor) const override { auto syntax = this->present(); - auto current_rst = content_extract(cursor->token()); + //auto current_rst = content_extract(cursor->token()); auto rst = _children_store->parse(cursor); - QString result_list; + /* QString result_list; for (auto c : rst) { result_list += content_extract(c->token()) += "\n"; - } + }*/ return rst; }