From 150ab3b3541d1c1f01ff67d12f06f3a6d4ec8f72 Mon Sep 17 00:00:00 2001 From: codeboss <2422523675@qq.com> Date: Tue, 11 Feb 2025 18:31:39 +0800 Subject: [PATCH] update --- libSyntax/libSyntax.vcxproj | 1 + libSyntax/libsyntax.cpp | 94 +++++++++++++++++++++++++++++++++++++ libSyntax/libsyntax.h | 34 ++++++++++++-- 3 files changed, 126 insertions(+), 3 deletions(-) diff --git a/libSyntax/libSyntax.vcxproj b/libSyntax/libSyntax.vcxproj index 3144ba8..b45711e 100644 --- a/libSyntax/libSyntax.vcxproj +++ b/libSyntax/libSyntax.vcxproj @@ -74,6 +74,7 @@ Default + false diff --git a/libSyntax/libsyntax.cpp b/libSyntax/libsyntax.cpp index d0b43cd..685e57c 100644 --- a/libSyntax/libsyntax.cpp +++ b/libSyntax/libsyntax.cpp @@ -34,6 +34,31 @@ QString Any::present() const { return members_content.mid(0, members_content.size() - 1); } +QList lib_syntax::Any::invokeSegments(const QString& in_cursor_name, const QString& out_list_name) const { + QList lines; + + lines << QString(u8"if (%1->mustStop())").arg(in_cursor_name); + lines << QString(u8" return QList>() << %1; ").arg(in_cursor_name); + + lines << QString(u8"QList> result_list_%1;").arg((uint64_t) this); + for (auto rule : children()) { + auto segments = rule->invokeSegments(in_cursor_name, QString(u8"result_list_%1").arg((uint64_t) this)); + if (segments.size() == 1) { + lines.append(segments); + } + else { + lines << u8"{"; + lines.append(segments); + lines << u8"}"; + } + } + lines << QString(u8"%2 = result_list_%1;").arg((uint64_t) this).arg(out_list_name); +} + +QString lib_syntax::Any::implementSegments(const QString& in_cursor_name, QList& lines) const { + return QString(); +} + Seqs::Seqs(const QList> mbrs) : mbrs_store(mbrs) { } QList> Seqs::children() const { @@ -71,6 +96,28 @@ QString Seqs::present() const { return content.mid(0, content.size() - 1); } +QList lib_syntax::Seqs::invokeSegments(const QString& in_cursor_name, const QString& out_list_name) const { + QList lines; + + lines << QString(u8"if (%1->mustStop())").arg(in_cursor_name); + lines << QString(u8" return QList>() << %1; ").arg(in_cursor_name); + + int times = 0; + lines << QString(u8"QList> bridge_list{ %1 };").arg(in_cursor_name); + for (auto rule : children()) { + auto segments = rule->invokeSegments(in_cursor_name, QString(u8"result_list_%1").arg((uint64_t) this)); + if (segments.size() == 1) { + lines.append(segments); + } + else { + lines << u8"{"; + lines.append(segments); + lines << u8"}"; + } + } + lines << QString(u8"%2 = result_list_%1;").arg((uint64_t) this).arg(out_list_name); +} + Rept::Rept(std::shared_ptr rule, int min, int max) : rule_peer(rule), min_match(min), max_match(max) { } @@ -193,6 +240,53 @@ QString ExprRule::present() const { return child_store->present(); } +QList lib_syntax::ExprRule::invokeSegments(const QString& in_cursor_name, const QString& out_list_name) const { + return QList() << QString(u8"%1=exprs_%2(%3); //%4") + .arg(out_list_name).arg((uint64_t) this).arg(in_cursor_name).arg(name()); +} + +QString lib_syntax::ExprRule::implementSegments(const QString& in_cursor_name, QList& lines) const { + lines << u8"if (" + in_cursor_name + "->mustStop())"; + lines << u8" return QList>() << " + in_cursor_name + ";"; + lines << u8"auto t_this = " + in_cursor_name + "->currentToken();"; + lines << u8"auto w_this = " + in_cursor_name + "->currentWords();"; + lines << u8"auto split_begin = std::make_shared>(shared_from_this(), t_this);"; + lines << u8"auto ncursor = std::make_shared(" + in_cursor_name + ");"; + lines << u8"ncursor->setCurrent(split_begin, w_this);"; + lines << u8"ncursor->enterExprs();"; + lines << u8"auto nbranch = this->child_store->parse(ncursor);"; + lines << u8"decltype(nbranch) list_ok;"; + lines << u8"// 选择完全匹配成功的"; + lines << u8"std::copy_if(nbranch.begin(), nbranch.end(), std::back_inserter(list_ok)," + "[](std::shared_ptr ins) { return !ins->exprsErrorCount(); });"; + lines << u8"if (!list_ok.size()) {"; + lines << u8" // 选择被修正的"; + lines << u8" std::copy_if(nbranch.begin(), nbranch.end(), std::back_inserter(list_ok)," + "[](std::shared_ptr ins) { return !ins->mustStop(); });"; + lines << u8" // 匹配失败的"; + lines << u8" if (!list_ok.size())"; + lines << u8" list_ok = nbranch;"; + lines << u8"}"; + lines << u8"decltype(list_ok) branch_procs;"; + lines << u8"std::for_each(list_ok.begin(), list_ok.end(), [&](std::shared_ptr curs) {"; + lines << u8" if (curs->mustStop()) {"; + lines << u8" branch_procs.append(curs);"; + lines << u8" }"; + lines << u8" else {"; + lines << u8" auto t_end = curs->currentToken();"; + lines << u8" auto w_end = curs->currentWords();"; + lines << u8" auto ecursor = std::make_shared(curs);"; + lines << u8" ecursor->quitExprs();"; + lines << u8" auto split_end = std::make_shared>(split_begin, t_end);"; + lines << u8" ecursor->setCurrent(split_end, w_end);"; + lines << u8" branch_procs.append(ecursor);"; + lines << u8" }"; + lines << u8"});"; + lines << u8"return branch_procs;"; + + return QString(u8"exprs_%1").arg((uint64_t) this); +} + MatchCursor::MatchCursor(const QString& path) :_file_path(path) { } MatchCursor::MatchCursor(std::shared_ptr other_ptr) diff --git a/libSyntax/libsyntax.h b/libSyntax/libsyntax.h index 40402e7..c3c2ffa 100644 --- a/libSyntax/libsyntax.h +++ b/libSyntax/libsyntax.h @@ -90,9 +90,8 @@ namespace lib_syntax { /** * @brief 解析 - * @param rt_inst 解析上下文 - * @param head 列表头 - * @return 返回结果<匹配完成新列表头,匹配长度> + * @param cursor 解析游标 + * @return 返回结果<匹配分支> */ virtual QList> parse(std::shared_ptr cursor) const = 0; @@ -101,6 +100,27 @@ namespace lib_syntax { * @return */ virtual QList> children() const = 0; + + /** + * @brief 翻译此规则 + * @param in_cursor_name 指定输入cursor名称 + * @param out_list_name 指定输出list名称 + * + * + * out_list_name = element_xxxxxx(in_cursor_name); + * …… + * @return 返回执行语句段 + */ + virtual QList invokeSegments(const QString& in_cursor_name, const QString& out_list_name) const = 0; + + /** + * @brief 定义和实现语句 + * @param in_cursor_name 输入 + * @param lines 规则实现语句 + * + * @return 表达式规则名称 + */ + virtual QString implementSegments(const QString& in_cursor_name, QList& lines) const = 0; }; // 组合语法实体解析 ===================================================================================== @@ -119,6 +139,9 @@ namespace lib_syntax { virtual QList> children() const override; virtual QList> parse(std::shared_ptr cursor) const override; virtual QString present() const override; + + virtual QList invokeSegments(const QString& in_cursor_name, const QString& out_list_name) const override; + virtual QString implementSegments(const QString& in_cursor_name, QList& lines) const override; }; /** @@ -136,6 +159,9 @@ namespace lib_syntax { virtual QList> children() const override; virtual QList> parse(std::shared_ptr cursor) const override; virtual QString present() const override; + + virtual QList invokeSegments(const QString& in_cursor_name, const QString& out_list_name) const override; + virtual QString implementSegments(const QString& in_cursor_name, QList& lines) const override; }; /** @@ -171,6 +197,8 @@ namespace lib_syntax { public: virtual QList> children() const override; virtual QString present() const override; + virtual QList invokeSegments(const QString& in_cursor_name, const QString& out_list_name) const override; + virtual QString implementSegments(const QString& in_cursor_name, QList &lines) const override; protected: std::shared_ptr child_store;