From 1744a705bd8f7b2f839bbaf0ba8c4994f289246e Mon Sep 17 00:00:00 2001 From: codeboss <2422523675@qq.com> Date: Sat, 15 Feb 2025 12:57:53 +0800 Subject: [PATCH] update --- CoreTest/main.cpp | 14 ++---- CoreTest/syntax_example.txt | 9 +++- libSyntax/ast_gen.cpp | 23 ++++++--- libSyntax/ast_gen.h | 2 + libSyntax/libsyntax.cpp | 97 ++++++++++++++++++++++++------------- libSyntax/libsyntax.h | 75 +++++++++++++++------------- libSyntax/libtokens.h | 8 ++- libSyntax/syntax_novel.cpp | 90 ++++++++++++++++++++++++---------- libSyntax/tokens_impl.h | 9 ++++ 9 files changed, 214 insertions(+), 113 deletions(-) diff --git a/CoreTest/main.cpp b/CoreTest/main.cpp index 8fefc00..0b7905b 100644 --- a/CoreTest/main.cpp +++ b/CoreTest/main.cpp @@ -16,20 +16,16 @@ int main(int argc, char *argv[]) lib_words::WordReader reader; auto vwords = reader.wordsFrom(tt, "D:\\Projects\\Cpp\\WsNovelParser\\CoreTest\\syntax_example.txt"); - auto words = vwords; - while (words) { - qDebug() << words->content(); - words = words->nextWord(); - } - ast_gen::SyntaxParser parser(example_novel::NovalSyntax::getSyntaxTree()); auto rst = parser.parse(vwords); + + for(auto x : rst) + qDebug() << x->parseSyntax(); auto prag_root = std::make_shared< ast_basic::ExprProgram>("HelloWorld!"); auto structx = parser.getAst(rst.first(), prag_root); + parser.astPresent(structx); - - - qDebug() << "finished"; + qDebug() << "===========finished=========================="; return a.exec(); } diff --git a/CoreTest/syntax_example.txt b/CoreTest/syntax_example.txt index 552c44d..db11e91 100644 --- a/CoreTest/syntax_example.txt +++ b/CoreTest/syntax_example.txt @@ -5,4 +5,11 @@ } {故事 故事名称2 - 故事介绍段落} \ No newline at end of file + 故事介绍段落} + +{故事 故事名称3 + 故事介绍段落 aldkfjl flwief} + +{故事 故事名称4 + 故事介绍段落 aldkfjl flwief +} \ No newline at end of file diff --git a/libSyntax/ast_gen.cpp b/libSyntax/ast_gen.cpp index bee112f..db2b8f5 100644 --- a/libSyntax/ast_gen.cpp +++ b/libSyntax/ast_gen.cpp @@ -13,11 +13,7 @@ QList> SyntaxParser::parse(std::shared_ptr(words->file()); cursor->setCurrent(nullptr, words); - QList> out; - auto list = this->_rule_bind->parse(cursor, out); - - if (out.size()) - list = out; + auto list = this->_rule_bind->parse(cursor); QHash> result_map; std::for_each(list.begin(), list.end(), @@ -28,8 +24,8 @@ QList> SyntaxParser::parse(std::shared_ptr a, std::shared_ptr b) { - auto mark_a = a->currentToken()->position() * 100 - a->totalErrorCount(); - auto mark_b = b->currentToken()->position() * 100 - b->totalErrorCount(); + auto mark_a = a->token()->position() * 100 - a->totalErrorCount(); + auto mark_b = b->token()->position() * 100 - b->totalErrorCount(); return mark_a > mark_b; }); @@ -41,7 +37,7 @@ std::shared_ptr ast_gen::SyntaxParser::getAst( std::shared_ptr cursor, std::shared_ptr root) { QList> token_seqs; - std::shared_ptr action_token = cursor->currentToken(); + std::shared_ptr action_token = cursor->token(); while (action_token) { token_seqs.prepend(action_token); action_token = action_token->prevToken(); @@ -54,3 +50,14 @@ std::shared_ptr ast_gen::SyntaxParser::getAst( return expr_inst; } + +void ast_gen::SyntaxParser::astPresent(std::shared_ptr node, int depth) { + auto msg = QString(depth * 4, ' '); + if (node->definedRule()) + qDebug() << msg + node->definedRule()->name(); + else + qDebug() << msg + "Program"; + + for (auto it : node->children()) + astPresent(it, depth + 1); +} diff --git a/libSyntax/ast_gen.h b/libSyntax/ast_gen.h index 87acdee..52e8be8 100644 --- a/libSyntax/ast_gen.h +++ b/libSyntax/ast_gen.h @@ -32,6 +32,8 @@ namespace ast_gen { std::shared_ptr getAst( std::shared_ptr cursor, std::shared_ptr root); + void astPresent(std::shared_ptr node, int depth = 0); + }; diff --git a/libSyntax/libsyntax.cpp b/libSyntax/libsyntax.cpp index 2e1b440..1f3c959 100644 --- a/libSyntax/libsyntax.cpp +++ b/libSyntax/libsyntax.cpp @@ -15,26 +15,28 @@ QList> __anyone_impl::children() const { return mbrs_store; } -QList> __anyone_impl::parse(std::shared_ptr cursor, QList>& out) const { - if (cursor->parseStop()) +QList> __anyone_impl::parse(std::shared_ptr cursor) const { + if (cursor->parseFailure() && cursor->parseComplete()) return QList>() << cursor; auto syntax = present(); QList> result_list; for (auto rx : this->children()) - result_list.append(rx->parse(cursor, out)); + 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(); }); + [&](std::shared_ptr ins) { + return cursor->totalErrorCount() == ins->totalErrorCount() || ins->parseComplete(); + }); if (completely_list.size()) return completely_list; // 缁忚繃淇鐨勫垎鏀 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->parseStop(); }); + [&](std::shared_ptr ins) { return !ins->parseFailure(); }); if (modify_list.size()) return modify_list; @@ -55,16 +57,16 @@ QList> __sequence_impl::children() const { return mbrs_store; } -QList> __sequence_impl::parse(std::shared_ptr cursor, QList>& out) const { - if (cursor->parseStop()) +QList> __sequence_impl::parse(std::shared_ptr cursor) const { + if (cursor->parseFailure() && cursor->parseComplete()) return QList>() << cursor; QList> bridge_list{ cursor }; for (auto rule : this->children()) { QList> current_result; for (auto vcurs : bridge_list) { - if (!vcurs->parseStop()) { - current_result.append(rule->parse(vcurs, out)); + if (!vcurs->parseFailure()) { + current_result.append(rule->parse(vcurs)); } } @@ -72,7 +74,7 @@ QList> __sequence_impl::parse(std::shared_ptr 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(); + return cursor->totalErrorCount() == ins->totalErrorCount() || ins->parseComplete(); }); if (temprary_list.size()) { bridge_list = temprary_list; @@ -82,7 +84,7 @@ QList> __sequence_impl::parse(std::shared_ptr // 缁忚繃淇鐨勫垎鏀 std::copy_if(current_result.begin(), current_result.end(), std::back_inserter(temprary_list), - [&](std::shared_ptr ins) { return !ins->parseStop(); }); + [&](std::shared_ptr ins) { return !ins->parseFailure(); }); if (temprary_list.size()) { bridge_list = temprary_list; continue; @@ -121,8 +123,8 @@ auto content_extractw = [](std::shared_ptr token) return content; }; -QList> __repeat_impl::parse(std::shared_ptr cursor, QList>& out) const { - if (cursor->parseStop()) +QList> __repeat_impl::parse(std::shared_ptr cursor) const { + if (cursor->parseFailure() && cursor->parseComplete()) return QList>() << cursor; auto syntax = present(); @@ -134,19 +136,19 @@ QList> __repeat_impl::parse(std::shared_ptrrule_peer; auto seqs_rule = std::make_shared<__sequence_impl>(temp_rules); - max_match_begin = seqs_rule->parse(cursor, out); + max_match_begin = seqs_rule->parse(cursor); } // 濡傛灉涓嶆弧瓒虫渶灏忛噸澶嶅尮閰嶆鏁拌姹傦紝鍒欒繑鍥 int continue_count = std::count_if(max_match_begin.begin(), max_match_begin.end(), - [](std::shared_ptr ins) { return !ins->parseStop(); }); + [](std::shared_ptr ins) { return !ins->parseFailure(); }); if (!continue_count) return max_match_begin; // 鏈灏忓尮閰嶆鏁颁腑鎵鏈夐敊璇垎鏀兘鏄棤鐢ㄧ殑銆侀渶瑕佽垗寮 for (auto idx = 0; idx < max_match_begin.size(); ++idx) { auto current_cursor = max_match_begin.at(idx); - if (current_cursor->parseStop()) + if (current_cursor->parseFailure()) max_match_begin.removeAt(idx--); } @@ -158,18 +160,18 @@ QList> __repeat_impl::parse(std::shared_ptrrule_peer->parse(ins, out)); + current_list.append(this->rule_peer->parse(ins)); QList contents; for (auto bx : current_list) - contents << content_extractw(bx->currentToken()) + QStringList(bx->totalErrors()).join(','); + contents << content_extractw(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 cursor->totalErrorCount() == ins->totalErrorCount() && - ins->currentToken()->position() > cursor->currentToken()->position(); + return ins->parseComplete() || (cursor->totalErrorCount() == ins->totalErrorCount() && + ins->token()->position() > cursor->token()->position()); }); if (temprary_branchs.size()) { bridge_list = temprary_branchs; @@ -179,7 +181,7 @@ QList> __repeat_impl::parse(std::shared_ptr ins) { - return !ins->parseStop() && ins->currentToken()->position() > cursor->currentToken()->position(); + return !ins->parseFailure() && ins->token()->position() > cursor->token()->position(); }); if (temprary_branchs.size()) { bridge_list = temprary_branchs; @@ -191,7 +193,7 @@ QList> __repeat_impl::parse(std::shared_ptr a, std::shared_ptr b) { - return a->currentToken()->position() > b->currentToken()->position(); + return a->token()->position() > b->token()->position(); }); // 鎻愬彇瀹屽叏鍖归厤鐨勫垎鏀 @@ -201,27 +203,32 @@ QList> __repeat_impl::parse(std::shared_ptrcurrentToken()->position() == ins->currentToken()->position()) { + else if (rets_completely.last()->token()->position() == ins->token()->position()) { rets_completely.append(ins); } } + else if(ins->parseComplete()) + rets_completely.append(ins); } // 鎻愬彇缁忚繃淇鐨勫垎鏀 decltype(results) rets_modified; for (auto ins : results) { - if (!ins->parseStop()) { + if (!ins->parseFailure()) { if (!rets_modified.size()) { rets_modified.append(ins); } - else if (rets_modified.last()->currentToken()->position() == ins->currentToken()->position()) { + else if (rets_modified.last()->token()->position() == ins->token()->position()) { rets_modified.append(ins); } } } // 鍏佽鎸佺画鐨勯泦鍚 - rets_completely.append(rets_modified); + for (auto rst : rets_modified) + if (!rets_completely.contains(rst)) + rets_completely.append(rst); + if (rets_completely.size()) return rets_completely; @@ -284,8 +291,20 @@ QString lib_syntax::MatchCursor::parseSyntax() const { if (!this->previous()) return QString(); - QString token_split = this->currentToken()->defines() ? this->currentToken()->defines()->regex() : ""; - return this->previous()->parseSyntax() + " " + token_split; + QString token_splitx; + switch (this->token()->tokenType()) { + case lib_token::IActionToken::Type::ElementBegin: + token_splitx = ""; + break; + case lib_token::IActionToken::Type::TokenBind: + token_splitx = this->token()->defines()->regex(); + break; + case lib_token::IActionToken::Type::ElementEnd: + token_splitx = ""; + break; + } + + return this->previous()->parseSyntax() + " " + token_splitx; } void MatchCursor::enterExprs() { @@ -298,19 +317,27 @@ void MatchCursor::logExprsError(const QString& msg) { this->_exprs_errors.last()->addError(msg); // 鏅傛ц川鐨勫垽瀹氭爣鍑 - this->setStop(this->exprsErrorCount() > 1); + this->setFailure(this->exprsErrorCount() > 1); } void MatchCursor::quitExprs() { this->_exprs_errors.pop_back(); } -bool lib_syntax::MatchCursor::parseStop() const { - return this->_parse_proc_stop; +bool lib_syntax::MatchCursor::parseFailure() const { + return this->_parse_stop_with_errors; } -void lib_syntax::MatchCursor::setStop(bool mark) { - this->_parse_proc_stop = mark; +void lib_syntax::MatchCursor::setFailure(bool mark) { + this->_parse_stop_with_errors = mark; +} + +bool lib_syntax::MatchCursor::parseComplete() const { + return this->_parse_complete; +} + +void lib_syntax::MatchCursor::setComplete(bool mark) { + this->_parse_complete = mark; } int MatchCursor::exprsErrorCount() const { @@ -332,11 +359,11 @@ void MatchCursor::setCurrent(std::shared_ptr t, std::shared_ this->_remains_word = remains; } -std::shared_ptr MatchCursor::currentToken() const { +std::shared_ptr MatchCursor::token() const { return this->_current_token; } -std::shared_ptr MatchCursor::currentWords() const { +std::shared_ptr MatchCursor::words() const { return this->_remains_word; } diff --git a/libSyntax/libsyntax.h b/libSyntax/libsyntax.h index abc65bb..70bf4eb 100644 --- a/libSyntax/libsyntax.h +++ b/libSyntax/libsyntax.h @@ -59,22 +59,23 @@ namespace lib_syntax { virtual void enterExprs(); virtual void logExprsError(const QString& msg); virtual void quitExprs(); - - virtual bool parseStop() const; - virtual void setStop(bool mark=true); - virtual int exprsErrorCount() const; virtual int totalErrorCount() const; virtual QList totalErrors() const; + virtual bool parseFailure() const; + virtual void setFailure(bool mark = true); + virtual bool parseComplete() const; + virtual void setComplete(bool mark = true); + virtual void setCurrent(std::shared_ptr t, std::shared_ptr remains); - virtual std::shared_ptr currentToken() const; - virtual std::shared_ptr currentWords() const; + virtual std::shared_ptr token() const; + virtual std::shared_ptr words() const; private: QString _file_path; std::shared_ptr _prev_cursor = nullptr; - bool _parse_proc_stop = false; + bool _parse_stop_with_errors = false, _parse_complete = false; QList _total_errors; // 鎵鏈夎В鏋愰敊璇 QList> _exprs_errors; // 褰撳墠琛ㄨ揪寮忚В鏋愰敊璇 @@ -106,7 +107,7 @@ namespace lib_syntax { * @param out 瑙f瀽缁撴潫鐨勫垎鏀瓨鍌ㄩ泦鍚 * @return 杩斿洖缁撴灉<鍖归厤鍒嗘敮> */ - virtual QList> parse(std::shared_ptr cursor, QList> &out) const = 0; + virtual QList> parse(std::shared_ptr cursor) const = 0; }; // 缁勫悎璇硶瀹炰綋瑙f瀽 ===================================================================================== @@ -123,7 +124,7 @@ namespace lib_syntax { // IBasicRule interface public: virtual QList> children() const override; - virtual QList> parse(std::shared_ptr cursor, QList>& out) const override; + virtual QList> parse(std::shared_ptr cursor) const override; virtual QString present() const override; }; @@ -140,7 +141,7 @@ namespace lib_syntax { // IBasicRule interface public: virtual QList> children() const override; - virtual QList> parse(std::shared_ptr cursor, QList>& out) const override; + virtual QList> parse(std::shared_ptr cursor) const override; virtual QString present() const override; }; @@ -158,7 +159,7 @@ namespace lib_syntax { // IBasicRule interface public: virtual QList> children() const override; - virtual QList> parse(std::shared_ptr cursor, QList>& out) const override; + virtual QList> parse(std::shared_ptr cursor) const override; virtual QString present() const override; }; @@ -173,7 +174,7 @@ namespace lib_syntax { virtual int typeMark() const; protected: - virtual QList> expr_rule_parse(std::shared_ptr cursor, QList>& out) const = 0; + virtual QList> expr_rule_parse(std::shared_ptr cursor) const = 0; private: QString name_store; @@ -199,19 +200,27 @@ namespace lib_syntax { virtual QString present() const override { return QString("%1").arg(this->_define_peers->reviseWords()); } - virtual QList> parse(std::shared_ptr current, QList>& out) const override { - auto w_this = current->currentWords(); + virtual QList> parse(std::shared_ptr current) const override { // 濡傛灉鎻愬墠缁撴潫锛岃褰曢敊璇苟杩斿洖 - if (!w_this) { - if(current->currentToken()->defines()) - out << current; - else - out << current->previous(); + if (!current->words()) { + // 鍙湁鍦ㄨ〃杈惧紡鐨勮捣濮嬬偣閬囧埌nullptr锛屾墠鏄甯哥粨鏉熴 + if (current->token()->tokenType() != lib_token::IActionToken::Type::ElementBegin) { + auto ncurs = std::make_shared(current); + ncurs->logExprsError(QString("Syntax[0x00001]杈撳叆閿欒锛岀▼搴忔彁鍓嶇粨鏉燂細%1銆").arg(current->filePath())); + ncurs->setFailure(); + return QList>() << ncurs; + } - return QList>(); + while (current->token()->tokenType() == lib_token::IActionToken::Type::ElementBegin) + current = current->previous(); + + auto ncurs = std::make_shared(current); + ncurs->setComplete(); + return QList>() << ncurs; } - auto t_this = current->currentToken(); + auto w_this = current->words(); + auto t_this = current->token(); auto match_result = _define_peers->analysis(w_this); // 瑙f瀽鎴愬姛 if (std::get<0>(match_result)) { @@ -247,8 +256,8 @@ namespace lib_syntax { retvals << error_one; // 澶氫竴涓 - if (w_this->nextWord()) { - auto nx_word = w_this->nextWord(); + auto nx_word = w_this->nextWord(); + if (nx_word) { auto nx_result = this->_define_peers->analysis(nx_word); if (std::get<0>(nx_result)) { auto chain = std::make_shared>(std::get<0>(nx_result), t_this); @@ -291,15 +300,15 @@ namespace lib_syntax { return this->_children_store->present(); } - virtual QList> parse(std::shared_ptr cursor, QList>& out) const override { + virtual QList> parse(std::shared_ptr cursor) const override { // 鎻愬墠缁撴潫锛岀洿鎺ヨ繑鍥 - if (cursor->parseStop()) + if (cursor->parseFailure() && cursor->parseComplete()) return QList>() << cursor; auto syntax = present(); - auto t_this = cursor->currentToken(); - auto w_this = cursor->currentWords(); + auto t_this = cursor->token(); + auto w_this = cursor->words(); // 璧峰Token鎵撶偣 auto split_begin = std::make_shared>(shared_from_this(), t_this); @@ -308,21 +317,21 @@ namespace lib_syntax { ncursor->enterExprs(); // 琛ㄨ揪寮忚娉曡В鏋 - auto nbranch = this->expr_rule_parse(ncursor, out); + auto nbranch = this->expr_rule_parse(ncursor); // 璇硶瀹屽叏鍖归厤鐨勫垎鏀 decltype(nbranch) branch_procs; std::copy_if(nbranch.begin(), nbranch.end(), std::back_inserter(branch_procs), [&](std::shared_ptr ins) { - return ins->totalErrorCount() == cursor->totalErrorCount(); + return ins->totalErrorCount() == cursor->totalErrorCount() || ins->parseComplete(); }); // 璇硶淇鍚庤兘鍖归厤鐨勫垎鏀 if (!branch_procs.size()) { std::copy_if(nbranch.begin(), nbranch.end(), std::back_inserter(branch_procs), - [](std::shared_ptr ins) { return !ins->parseStop(); }); + [](std::shared_ptr ins) { return !ins->parseFailure(); }); } if (!branch_procs.size()) @@ -331,11 +340,11 @@ namespace lib_syntax { decltype(nbranch) results_fnl; for (auto curs : branch_procs) { - if (curs->parseStop()) + if (curs->parseFailure()) results_fnl.append(curs); else { - auto t_end = curs->currentToken(); - auto w_end = curs->currentWords(); + auto t_end = curs->token(); + auto w_end = curs->words(); auto ecursor = std::make_shared(curs); ecursor->quitExprs(); diff --git a/libSyntax/libtokens.h b/libSyntax/libtokens.h index ce80dd3..ec28690 100644 --- a/libSyntax/libtokens.h +++ b/libSyntax/libtokens.h @@ -84,7 +84,13 @@ namespace lib_token { */ class IActionToken : public lib_token::IToken { public: - + enum class Type { ElementBegin, TokenBind, ElementEnd }; + /** + * @brief 鑾峰彇ActionToken绫诲瀷. + * + * \return + */ + virtual Type tokenType() const = 0; /** * @brief 涓婁竴涓猅oken * @return diff --git a/libSyntax/syntax_novel.cpp b/libSyntax/syntax_novel.cpp index ce161ee..eaec72b 100644 --- a/libSyntax/syntax_novel.cpp +++ b/libSyntax/syntax_novel.cpp @@ -59,19 +59,57 @@ auto content_extract = [](std::shared_ptr token) return content; }; -using TextDeclsSyntaxDef = Any, Match, Match, Match>; +using TextDeclsSyntaxDef = Any, Match>; class DeclSyntax : public ElementRule { public: DeclSyntax() : ElementRule("decl_section") { } // 閫氳繃 ElementRule 缁ф壙 - QList> expr_rule_parse(std::shared_ptr cursor, QList>& out) const override { - auto syntax_text = this->present(); - auto current_rst = content_extract(cursor->currentToken()); - auto rst = _children_store->parse(cursor, out); - for (auto r : rst) - std::const_pointer_cast(r)->setStop(r->exprsErrorCount()); - return rst; + QList> expr_rule_parse(std::shared_ptr cursor) const override { + //// 濡傛灉鎻愬墠缁撴潫锛岃褰曢敊璇苟杩斿洖 + //if (!cursor->words()) { + // while (cursor->token()->tokenType() == lib_token::IActionToken::Type::ElementBegin) + // cursor = cursor->previous(); + + // out << cursor; + // return QList>(); + //} + + //// 缁戝畾鏂囧瓧琛 + //auto bind_row = cursor->words()->row(); + //QList> bridge_list{ cursor }; + //decltype(bridge_list) final_result; + + //for (;bridge_list.size();) { + // // 涓娆″尮閰 + // decltype(bridge_list) current_result; + // for (auto branch : bridge_list) { + // if(branch->words()->row() == bind_row){ + // auto mrst = _children_store->parse(branch, out); + // for (auto m : mrst) { + // if (m->exprsErrorCount()) { + // std::const_pointer_cast(m)->setFailure(true); + // final_result.append(m); + // } + // else { + // current_result.append(m); + // } + // } + // } + // } + // bridge_list = current_result; + //} + //for(auto x : bridge_list) + // if(!final_result.contains(x)) + // final_result.append(x); + //return final_result; + + auto results = _children_store->parse(cursor); + std::for_each(results.begin(), results.end(), + [](std::shared_ptr ins) { + std::const_pointer_cast(ins)->setFailure(ins->exprsErrorCount()); + }); + return results; } }; @@ -85,8 +123,8 @@ public: PointSyntax() : ElementRule("point_define") { } // 閫氳繃 ElementRule 缁ф壙 - QList> expr_rule_parse(std::shared_ptr cursor, QList>& out) const override { - return _children_store->parse(cursor, out); + QList> expr_rule_parse(std::shared_ptr cursor) const override { + return _children_store->parse(cursor); } }; @@ -100,8 +138,8 @@ public: ReferSyntax() : ElementRule < PointRefers, (int) NovelNode::PointRefers, ReferSyntaxDef>("point_refer") { } // 閫氳繃 ElementRule 缁ф壙 - QList> expr_rule_parse(std::shared_ptr cursor, QList>& out) const override { - return _children_store->parse(cursor, out); + QList> expr_rule_parse(std::shared_ptr cursor) const override { + return _children_store->parse(cursor); } }; @@ -115,8 +153,8 @@ public: SliceSyntax() : ElementRule("slice_define") { } // 閫氳繃 ElementRule 缁ф壙 - QList> expr_rule_parse(std::shared_ptr cursor, QList>& out) const override { - return _children_store->parse(cursor, out); + QList> expr_rule_parse(std::shared_ptr cursor) const override { + return _children_store->parse(cursor); } }; @@ -130,14 +168,14 @@ public: StorySyntax() : ElementRule("story_define") { } // 閫氳繃 ElementRule 缁ф壙 - QList> expr_rule_parse(std::shared_ptr cursor, QList>& out) const override { + QList> expr_rule_parse(std::shared_ptr cursor) const override { auto syntax = this->present(); - auto current_rst = content_extract(cursor->currentToken()); - auto rst = _children_store->parse(cursor, out); + auto current_rst = content_extract(cursor->token()); + auto rst = _children_store->parse(cursor); QString result_list; for (auto c : rst) { - result_list += content_extract(c->currentToken()) += "\n"; + result_list += content_extract(c->token()) += "\n"; } return rst; @@ -154,8 +192,8 @@ public: ArticleSyntax() : ElementRule("article_define") { } // 閫氳繃 ElementRule 缁ф壙 - QList> expr_rule_parse(std::shared_ptr cursor, QList>& out) const override { - return _children_store->parse(cursor, out); + QList> expr_rule_parse(std::shared_ptr cursor) const override { + return _children_store->parse(cursor); } }; @@ -169,8 +207,8 @@ public: VolumeSyntax() : ElementRule("volume_define") { } // 閫氳繃 ElementRule 缁ф壙 - QList> expr_rule_parse(std::shared_ptr cursor, QList>& out) const override { - return _children_store->parse(cursor, out); + QList> expr_rule_parse(std::shared_ptr cursor) const override { + return _children_store->parse(cursor); } }; @@ -182,8 +220,8 @@ public: RankSyntax() : ElementRule("rank_define") { } // 閫氳繃 ElementRule 缁ф壙 - QList> expr_rule_parse(std::shared_ptr cursor, QList>& out) const override { - return _children_store->parse(cursor, out); + QList> expr_rule_parse(std::shared_ptr cursor) const override { + return _children_store->parse(cursor); } }; @@ -195,9 +233,9 @@ public: DocumentSyntax() : ElementRule("decls-doc") { } // 閫氳繃 ElementRule 缁ф壙 - QList> expr_rule_parse(std::shared_ptr cursor, QList>& out) const override { + QList> expr_rule_parse(std::shared_ptr cursor) const override { auto text = _children_store->present(); - return _children_store->parse(cursor, out); + return _children_store->parse(cursor); } }; diff --git a/libSyntax/tokens_impl.h b/libSyntax/tokens_impl.h index 89a035c..78c0ea4 100644 --- a/libSyntax/tokens_impl.h +++ b/libSyntax/tokens_impl.h @@ -65,6 +65,9 @@ namespace lib_token { } // 閫氳繃 IActionToken 缁ф壙 + virtual Type tokenType() const { + return Type::TokenBind; + } QString file() const override { return _bind_content->file(); } @@ -109,6 +112,9 @@ namespace lib_token { } // 閫氳繃 IActionToken 缁ф壙 + virtual Type tokenType() const { + return Type::ElementBegin; + } QString file() const override { return this->prevToken()->file(); } @@ -165,6 +171,9 @@ namespace lib_token { : _prev_token(prev), _self_start(start) { } // 閫氳繃 IActionToken 缁ф壙 + virtual Type tokenType() const { + return Type::ElementEnd; + } QString file() const override { return this->prevToken()->file(); }