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;