From 3c4662415f41a53699f588fc0ece12f2f5db4329 Mon Sep 17 00:00:00 2001
From: codeboss <2422523675@qq.com>
Date: Wed, 19 Jun 2024 01:09:45 +0800
Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E9=80=9F=E6=9E=B6=E6=9E=84=E6=94=B9?=
=?UTF-8?q?=E9=80=A0=E5=AE=8C=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
WsNovelParser.sln | 5 ++
WsNovelParser/WsNovelParser.vcxproj.user | 4 +-
WsNovelParser/novelparser.cpp | 4 +-
libParse/libParse.vcxproj.user | 4 +-
libSyntax/ast_basic.cpp | 1 +
libSyntax/libSyntax.vcxproj.user | 4 +-
libSyntax/libsyntax.cpp | 70 ++++++++++++++++++++----
libSyntax/libsyntax.h | 22 +++++++-
libSyntax/syntax_novel.cpp | 3 +-
libToken/libToken.vcxproj.user | 4 +-
10 files changed, 94 insertions(+), 27 deletions(-)
diff --git a/WsNovelParser.sln b/WsNovelParser.sln
index 96083f1..1fdd6fa 100644
--- a/WsNovelParser.sln
+++ b/WsNovelParser.sln
@@ -20,6 +20,11 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libParse", "libParse\libPar
{EF557F71-99AA-4F2B-A5F5-1A4518A11C19} = {EF557F71-99AA-4F2B-A5F5-1A4518A11C19}
EndProjectSection
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "解决方案项", "解决方案项", "{8548B2EE-059F-40ED-B393-9513E6095930}"
+ ProjectSection(SolutionItems) = preProject
+ 报告20240618-1929.diagsession = 报告20240618-1929.diagsession
+ EndProjectSection
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
diff --git a/WsNovelParser/WsNovelParser.vcxproj.user b/WsNovelParser/WsNovelParser.vcxproj.user
index f1d0210..cb29a3a 100644
--- a/WsNovelParser/WsNovelParser.vcxproj.user
+++ b/WsNovelParser/WsNovelParser.vcxproj.user
@@ -6,12 +6,12 @@
--path "D:\手作小说\科学+修仙+创造世界"
- 2024-06-18T03:59:54.5896562Z
+ 2024-06-18T15:36:03.6534384Z
- 2024-06-18T03:59:54.6990325Z
+ 2024-06-18T15:36:03.7471721Z
diff --git a/WsNovelParser/novelparser.cpp b/WsNovelParser/novelparser.cpp
index 6b377c8..8de0f6d 100644
--- a/WsNovelParser/novelparser.cpp
+++ b/WsNovelParser/novelparser.cpp
@@ -29,9 +29,9 @@ std::shared_ptr NovelParser::parse(const QFileInfo
auto time_stamp = QTime::currentTime();
for (auto& file : source_list) {
- auto tokens = lex_reader->extractFrom(file.canonicalFilePath());
+ auto tokens = lex_reader->tokensWithin(file.canonicalFilePath());
auto exprs_result = this->syntax_defines->parse(context, tokens);
- forst_root.append(exprs_result);
+ forst_root.append(std::get<0>(exprs_result));
}
auto current_stamp = QTime::currentTime();
qDebug() << QString(u8"ʷ+ʱ䣺%1 ms").arg(time_stamp.msecsTo(current_stamp));
diff --git a/libParse/libParse.vcxproj.user b/libParse/libParse.vcxproj.user
index a0a6cec..9d18e80 100644
--- a/libParse/libParse.vcxproj.user
+++ b/libParse/libParse.vcxproj.user
@@ -5,12 +5,12 @@
WindowsLocalDebugger
- 2024-06-18T03:59:54.8553531Z
+ 2024-06-18T15:36:03.9815477Z
- 2024-06-18T03:59:54.9178555Z
+ 2024-06-18T15:36:04.0440621Z
diff --git a/libSyntax/ast_basic.cpp b/libSyntax/ast_basic.cpp
index cf39feb..18b19ec 100644
--- a/libSyntax/ast_basic.cpp
+++ b/libSyntax/ast_basic.cpp
@@ -1,4 +1,5 @@
#include "ast_basic.h"
+#include
using namespace ast_basic;
using namespace lib_token;
diff --git a/libSyntax/libSyntax.vcxproj.user b/libSyntax/libSyntax.vcxproj.user
index db5007c..5fc4fad 100644
--- a/libSyntax/libSyntax.vcxproj.user
+++ b/libSyntax/libSyntax.vcxproj.user
@@ -5,12 +5,12 @@
WindowsLocalDebugger
- 2024-06-18T03:59:54.7302802Z
+ 2024-06-18T15:36:03.7784470Z
- 2024-06-18T03:59:54.8084783Z
+ 2024-06-18T15:36:03.8565020Z
diff --git a/libSyntax/libsyntax.cpp b/libSyntax/libsyntax.cpp
index ffa98f9..1ef54b8 100644
--- a/libSyntax/libsyntax.cpp
+++ b/libSyntax/libsyntax.cpp
@@ -22,15 +22,14 @@ std::tuple> TokenMatch
// std::tuple, std::shared_ptr>
std::tuple, std::shared_ptr> TokenMatch::parse(std::shared_ptr rt_inst, std::shared_ptr head) const {
if (!head)
- throw new SyntaxException(u8"Syntax[0x0000]tokenǰֹ");
+ throw std::make_shared();
if (head->define()->name() == define_peer->name()) {
rt_inst->currentInst()->addToken(head);
return std::make_tuple(nullptr, head->nextToken());
}
- throw new SyntaxException(QString(u8"Syntax[0x00001]ƥʶtoken%1<%2,%3>")
- .arg(head->content()).arg(head->row()).arg(head->column()));
+ throw std::make_shared(head);
}
QString TokenMatch::token_present() const {
@@ -96,7 +95,10 @@ std::tuple, std::shared_ptr> Rept
temp_head = std::get<1>(result_gen);
}
- catch (...) {
+ catch (std::shared_ptr ex) {
+ return std::make_tuple(nullptr, temp_head);
+ }
+ catch (std::shared_ptr ex) {
return std::make_tuple(nullptr, temp_head);
}
}
@@ -197,8 +199,34 @@ std::tuple> Any::match
}
std::tuple, std::shared_ptr> Any::parse(std::shared_ptr rt_inst, std::shared_ptr head) const {
- auto temp = rule_select(head);
- return std::get<2>(temp)->parse(rt_inst, head);
+ std::function, std::shared_ptr)> measure_span =
+ [&](std::shared_ptr anchor, std::shared_ptr head)->int {
+ if (anchor == head)
+ return 1;
+ return measure_span(anchor, head->nextToken()) + 1;
+ };
+
+ std::tuple, int> temp_result = std::make_tuple(mbrs_store.first(), 0);
+ for (auto& fork : mbrs_store) {
+ try {
+ auto gen = fork->parse(rt_inst, head);
+
+ // ɹֱӷؽ
+ if (std::get<0>(gen))
+ rt_inst->currentInst()->addChild(std::get<0>(gen));
+ return std::make_tuple(nullptr, std::get<1>(gen));
+ }
+ // ĻбȽ
+ catch (std::shared_ptr ex) {
+ auto current_span = measure_span(ex->targetToken(), head);
+
+ if (current_span > std::get<1>(temp_result))
+ temp_result = std::make_tuple(fork, current_span);
+ }
+ }
+
+ // ƥķ֧
+ return std::get<0>(temp_result)->parse(rt_inst, head);
}
QString Any::token_present() const
@@ -240,19 +268,37 @@ std::tuple> Expression
}
std::tuple, std::shared_ptr> ExpressionRule::parse(std::shared_ptr rt_inst, std::shared_ptr head) const {
- std::shared_ptr elm_ast = this->newEmptyInstance();
+ std::shared_ptr elm_ast = this->newEmptyInstance();
rt_inst->pushExpressionRule(this->shared_from_this());
rt_inst->pushInst(elm_ast);
- auto rstg = child_store->parse(rt_inst, head);
- auto tokens_decl = this->filter_proc(elm_ast->tokens());
- elm_ast->tokensReset(tokens_decl);
+ try {
+ auto rstg = child_store->parse(rt_inst, head);
- rt_inst->popExpressionRule();
- return std::make_tuple(rt_inst->popInst(), std::get<1>(rstg));
+ auto tokens_decl = this->filter_proc(elm_ast->tokens());
+ elm_ast->tokensReset(tokens_decl);
+
+ rt_inst->popInst();
+ rt_inst->popExpressionRule();
+ return std::make_tuple(elm_ast, std::get<1>(rstg));
+ }
+ catch (...) {
+ rt_inst->popInst();
+ rt_inst->popExpressionRule();
+ throw;
+ }
}
QString ExpressionRule::token_present() const {
return QString(u8"(%1)").arg(child_store->token_present());
}
+
+MismatchException::MismatchException(std::shared_ptr inst) :SyntaxException(
+ QString(u8"Syntax[0x00001]ƥʶtoken%1<%2,%3>").arg(inst->content()).arg(inst->row()).arg(inst->column())), target(inst) {}
+
+std::shared_ptrMismatchException::targetToken() const {
+ return this->target;
+}
+
+InputTerminal::InputTerminal() :SyntaxException(u8"Syntax[0x0000]tokenǰֹ") {}
\ No newline at end of file
diff --git a/libSyntax/libsyntax.h b/libSyntax/libsyntax.h
index 846d43a..27e91c6 100644
--- a/libSyntax/libsyntax.h
+++ b/libSyntax/libsyntax.h
@@ -11,6 +11,8 @@ namespace ast_basic {
}
namespace lib_syntax {
+ class BaseRule;
+
/**
* @brief 쳣
*/
@@ -25,8 +27,6 @@ namespace lib_syntax {
virtual QString message() const;
};
-
- class BaseRule;
// ӿ ===================================================================================================
/**
* @brief Ľӿ
@@ -107,7 +107,7 @@ namespace lib_syntax {
// BaseRule interface
public:
virtual QList> children() const override;
- virtual std::tuple> match(std::shared_ptr remains_head) const override;
+ virtual std::tuple> match(std::shared_ptr head) const override;
virtual std::tuple, std::shared_ptr>
parse(std::shared_ptr rt_inst, std::shared_ptr head) const override;
virtual QString token_present() const override;
@@ -223,4 +223,20 @@ namespace lib_syntax {
}
};
+
+ class MismatchException : public SyntaxException {
+ private:
+ std::shared_ptr target;
+
+ public:
+ MismatchException(std::shared_ptr inst);
+ virtual ~MismatchException() = default;
+
+ virtual std::shared_ptr targetToken() const;
+ };
+
+ class InputTerminal : public SyntaxException {
+ public:
+ InputTerminal();
+ };
} // namespace lib_syntax
\ No newline at end of file
diff --git a/libSyntax/syntax_novel.cpp b/libSyntax/syntax_novel.cpp
index 2891c95..7ea6861 100644
--- a/libSyntax/syntax_novel.cpp
+++ b/libSyntax/syntax_novel.cpp
@@ -112,8 +112,7 @@ std::shared_ptr example_novel::NovalSyntax::tidy(s
}
void example_novel::NovalSyntax::cache_load(std::shared_ptr root, QList> children)
{
- std::const_pointer_cast(root)->cacheLoad();
-
+ root->cacheLoad();
for (auto& cinst : children) {
cinst->setParent(root);
diff --git a/libToken/libToken.vcxproj.user b/libToken/libToken.vcxproj.user
index 48b6bf1..1ac2b50 100644
--- a/libToken/libToken.vcxproj.user
+++ b/libToken/libToken.vcxproj.user
@@ -2,12 +2,12 @@
- 2024-06-18T03:59:54.9646551Z
+ 2024-06-18T15:36:03.8877508Z
- 2024-06-18T03:59:55.0271675Z
+ 2024-06-18T15:36:03.9502420Z