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