From ffb558b545bf4e1414e74b2cc5fbd813eb502e82 Mon Sep 17 00:00:00 2001
From: codeboss <2422523675@qq.com>
Date: Sat, 8 Feb 2025 13:40:36 +0800
Subject: [PATCH] update
---
CoreTest/CoreTest.vcxproj | 120 ++++++++++++++++++++++++++++++
CoreTest/CoreTest.vcxproj.filters | 33 ++++++++
CoreTest/CoreTest.vcxproj.user | 12 +++
CoreTest/main.cpp | 39 ++++++++++
CoreTest/syntax_example.txt | 8 ++
WsNovelParser.sln | 17 +++++
WsNovelParser/main.cpp | 2 +-
WsNovelParser/novelparser.cpp | 10 +--
WsNovelParser/novelparser.h | 8 +-
libSyntax/ast_gen.cpp | 6 +-
libSyntax/ast_gen.h | 6 +-
libSyntax/libSyntax.vcxproj | 4 +-
libSyntax/libsyntax.cpp | 51 +++++++++----
libSyntax/libsyntax.h | 44 ++++++++---
libSyntax/tokens_impl.h | 4 +-
libSyntax/tokens_novel.cpp | 12 +--
libWords/libwords.cpp | 17 +----
libWords/libwords.h | 5 +-
18 files changed, 333 insertions(+), 65 deletions(-)
create mode 100644 CoreTest/CoreTest.vcxproj
create mode 100644 CoreTest/CoreTest.vcxproj.filters
create mode 100644 CoreTest/CoreTest.vcxproj.user
create mode 100644 CoreTest/main.cpp
create mode 100644 CoreTest/syntax_example.txt
diff --git a/CoreTest/CoreTest.vcxproj b/CoreTest/CoreTest.vcxproj
new file mode 100644
index 0000000..77d7ee5
--- /dev/null
+++ b/CoreTest/CoreTest.vcxproj
@@ -0,0 +1,120 @@
+
+
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+ {9B3EEB2A-26D7-4B2C-B890-505715283400}
+ QtVS_v304
+ 10.0
+ 10.0
+ $(MSBuildProjectDirectory)\QtMsBuild
+
+
+
+ Application
+ v143
+ true
+ Unicode
+
+
+ Application
+ v143
+ false
+ true
+ Unicode
+
+
+
+
+
+
+ 5.12.11_msvc2017_64
+ core
+ debug
+
+
+ 5.12.11_msvc2017_64
+ core
+ release
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $(SolutionDir)libSyntax;$(SolutionDir)libWords;$(IncludePath)
+ $(SolutionDir)$(Platform)\$(Configuration);$(LibraryPath)
+
+
+ $(SolutionDir)libSyntax;$(SolutionDir)libWords;$(IncludePath)
+ $(SolutionDir)$(Platform)\$(Configuration)\;$(LibraryPath)
+
+
+
+ libWords.lib;libSyntax.lib;%(AdditionalDependencies)
+
+
+
+
+ libWords.lib;libSyntax.lib;%(AdditionalDependencies)
+
+
+
+
+ true
+ Level3
+ true
+ true
+
+
+ Console
+ true
+
+
+
+
+ true
+ Level3
+ true
+ true
+ true
+ true
+
+
+ Console
+ false
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CoreTest/CoreTest.vcxproj.filters b/CoreTest/CoreTest.vcxproj.filters
new file mode 100644
index 0000000..c4f5d37
--- /dev/null
+++ b/CoreTest/CoreTest.vcxproj.filters
@@ -0,0 +1,33 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ qml;cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;hm;inl;inc;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ qrc;rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+ {99349809-55BA-4b9d-BF79-8FDBB0286EB3}
+ ui
+
+
+ {639EADAA-A684-42e4-A9AD-28FC9BCB8F7C}
+ ts
+
+
+
+
+ Source Files
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CoreTest/CoreTest.vcxproj.user b/CoreTest/CoreTest.vcxproj.user
new file mode 100644
index 0000000..41a709a
--- /dev/null
+++ b/CoreTest/CoreTest.vcxproj.user
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CoreTest/main.cpp b/CoreTest/main.cpp
new file mode 100644
index 0000000..7b681f9
--- /dev/null
+++ b/CoreTest/main.cpp
@@ -0,0 +1,39 @@
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+int main(int argc, char *argv[])
+{
+ QCoreApplication a(argc, argv);
+
+ QFile in(u8"D:\\Projects\\Cpp\\WsNovelParser\\CoreTest\\syntax_example.txt");
+ in.open(QIODevice::ReadOnly|QIODevice::Text);
+ QTextStream tt(&in);
+ lib_words::WordReader reader;
+ auto vwords = reader.wordsFrom(tt, u8"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 one : rst) {
+ qDebug() << u8"===================================================";
+ qDebug().noquote() << one->totalErrors();
+ auto vtoken = one->currentToken();
+ while (vtoken) {
+ if(vtoken->defines())
+ qDebug() << vtoken->content();
+ vtoken = vtoken->prevToken();
+ }
+ }
+
+ return a.exec();
+}
diff --git a/CoreTest/syntax_example.txt b/CoreTest/syntax_example.txt
new file mode 100644
index 0000000..552c44d
--- /dev/null
+++ b/CoreTest/syntax_example.txt
@@ -0,0 +1,8 @@
+#ÅÅÐò 1
+
+{¹ÊÊ ¹ÊÊÂÃû³Æ1
+
+}
+
+{¹ÊÊ ¹ÊÊÂÃû³Æ2
+ ¹ÊʽéÉܶÎÂä}
\ No newline at end of file
diff --git a/WsNovelParser.sln b/WsNovelParser.sln
index e20c69d..a061804 100644
--- a/WsNovelParser.sln
+++ b/WsNovelParser.sln
@@ -11,6 +11,9 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WsNovelParser", "WsNovelPar
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libSyntax", "libSyntax\libSyntax.vcxproj", "{EF557F71-99AA-4F2B-A5F5-1A4518A11C19}"
+ ProjectSection(ProjectDependencies) = postProject
+ {386F6D42-C6EB-4973-9511-181472391B21} = {386F6D42-C6EB-4973-9511-181472391B21}
+ EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libParse", "libParse\libParse.vcxproj", "{C3AADEB5-3695-4DF4-B8E1-D37F928F3B2F}"
ProjectSection(ProjectDependencies) = postProject
@@ -34,6 +37,12 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WsNovelManager", "WsNovelMa
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libWords", "libWords\libWords.vcxproj", "{386F6D42-C6EB-4973-9511-181472391B21}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CoreTest", "CoreTest\CoreTest.vcxproj", "{9B3EEB2A-26D7-4B2C-B890-505715283400}"
+ ProjectSection(ProjectDependencies) = postProject
+ {386F6D42-C6EB-4973-9511-181472391B21} = {386F6D42-C6EB-4973-9511-181472391B21}
+ {EF557F71-99AA-4F2B-A5F5-1A4518A11C19} = {EF557F71-99AA-4F2B-A5F5-1A4518A11C19}
+ EndProjectSection
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
@@ -98,6 +107,14 @@ Global
{386F6D42-C6EB-4973-9511-181472391B21}.Release|x64.Build.0 = Release|x64
{386F6D42-C6EB-4973-9511-181472391B21}.Release|x86.ActiveCfg = Release|x64
{386F6D42-C6EB-4973-9511-181472391B21}.Release|x86.Build.0 = Release|x64
+ {9B3EEB2A-26D7-4B2C-B890-505715283400}.Debug|x64.ActiveCfg = Debug|x64
+ {9B3EEB2A-26D7-4B2C-B890-505715283400}.Debug|x64.Build.0 = Debug|x64
+ {9B3EEB2A-26D7-4B2C-B890-505715283400}.Debug|x86.ActiveCfg = Debug|x64
+ {9B3EEB2A-26D7-4B2C-B890-505715283400}.Debug|x86.Build.0 = Debug|x64
+ {9B3EEB2A-26D7-4B2C-B890-505715283400}.Release|x64.ActiveCfg = Release|x64
+ {9B3EEB2A-26D7-4B2C-B890-505715283400}.Release|x64.Build.0 = Release|x64
+ {9B3EEB2A-26D7-4B2C-B890-505715283400}.Release|x86.ActiveCfg = Release|x64
+ {9B3EEB2A-26D7-4B2C-B890-505715283400}.Release|x86.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/WsNovelParser/main.cpp b/WsNovelParser/main.cpp
index 31c3abb..443f243 100644
--- a/WsNovelParser/main.cpp
+++ b/WsNovelParser/main.cpp
@@ -81,7 +81,7 @@ int main(int argc, char* argv[]) {
}
access_ptr = parser->validsApply(docs);
}
- catch (lib_syntax::SyntaxException* e) {
+ catch (SyntaxException* e) {
qDebug().noquote() << e->message();
delete e;
exit(0);
diff --git a/WsNovelParser/novelparser.cpp b/WsNovelParser/novelparser.cpp
index 8376fe9..df59d18 100644
--- a/WsNovelParser/novelparser.cpp
+++ b/WsNovelParser/novelparser.cpp
@@ -11,7 +11,7 @@ using namespace lib_parse;
NovelParser::NovelParser()
{
- this->syntax_defines = NovalSyntax::getParseTree();
+ this->syntax_defines = NovalSyntax::getSyntaxTree();
checker_list << std::make_shared();
checker_list << std::make_shared();
checker_list << std::make_shared();
@@ -29,12 +29,12 @@ QString NovelParser::version() const
return "1.0.0";
}
-std::shared_ptr NovelParser::parserContext() const
+std::shared_ptr NovelParser::parserContext() const
{
return context;
}
-QList> NovelParser::parse(const QFileInfoList source_list) const {
+QList> NovelParser::parse(const QFileInfoList source_list) const {
const_cast(this)->context = std::make_shared(u8"С˵");
auto word_reader = std::make_shared();
@@ -45,14 +45,14 @@ QList> NovelParser::parse(const QFil
this->syntax_defines->parse(context, words);
}
- QList> forst_root = context->getDocInsts();
+ QList> forst_root = context->getDocInsts();
auto current_stamp = QTime::currentTime();
qDebug().noquote() << QString(u8"%´Ê·¨½âÎö+Óï·¨½âÎöÏûºÄʱ¼ä£º%1 ms¡£").arg(time_stamp.msecsTo(current_stamp));
return forst_root;
}
-std::shared_ptr NovelParser::validsApply(QList> forst_root) const {
+std::shared_ptr NovelParser::validsApply(QList> forst_root) const {
auto time_stamp = QTime::currentTime();
QList> docs_node;
for (auto& it : forst_root) {
diff --git a/WsNovelParser/novelparser.h b/WsNovelParser/novelparser.h
index 2bd365e..ed41c61 100644
--- a/WsNovelParser/novelparser.h
+++ b/WsNovelParser/novelparser.h
@@ -13,7 +13,7 @@ class NovelParser
{
private:
std::shared_ptr context = nullptr;
- std::shared_ptr syntax_defines;
+ std::shared_ptr syntax_defines;
QList> checker_list;
std::shared_ptr analyzer_ref;
@@ -22,7 +22,7 @@ public:
QList> fragmentsSorted() const;
virtual QString version() const;
- std::shared_ptr parserContext() const;
- QList> parse(const QFileInfoList souurce_list) const;
- std::shared_ptr validsApply(QList> docs_list) const;
+ std::shared_ptr parserContext() const;
+ QList> parse(const QFileInfoList souurce_list) const;
+ std::shared_ptr validsApply(QList> docs_list) const;
};
\ No newline at end of file
diff --git a/libSyntax/ast_gen.cpp b/libSyntax/ast_gen.cpp
index 1fa6a85..13afbb5 100644
--- a/libSyntax/ast_gen.cpp
+++ b/libSyntax/ast_gen.cpp
@@ -6,11 +6,11 @@ using namespace lib_token;
using namespace lib_syntax;
using namespace lib_words;
-SyntaxParser::SyntaxParser(std::shared_ptr rule)
+SyntaxParser::SyntaxParser(std::shared_ptr rule)
: _rule_bind(rule) { }
-QList> SyntaxParser::parse(std::shared_ptr words) {
- auto cursor = std::make_shared();
+QList> SyntaxParser::parse(std::shared_ptr words) {
+ auto cursor = std::make_shared(words->file());
cursor->setCurrent(nullptr, words);
auto list = this->_rule_bind->parse(cursor);
diff --git a/libSyntax/ast_gen.h b/libSyntax/ast_gen.h
index b98a0eb..f8f078f 100644
--- a/libSyntax/ast_gen.h
+++ b/libSyntax/ast_gen.h
@@ -11,17 +11,17 @@ namespace ast_gen {
*/
class LIBSYNTAX_EXPORT SyntaxParser {
private:
- std::shared_ptr _rule_bind = nullptr;
+ std::shared_ptr _rule_bind = nullptr;
public:
- SyntaxParser(std::shared_ptr rule);
+ SyntaxParser(std::shared_ptr rule);
/**
* @brief ÒÀ¾ÝÔ´ÂëÓï·¨¹æÔò£¬½âÎöÔ´ÂëÁ´±í
* @param wods Ô´ÂëÁ´±í
* @return ËùÓнâÎö·¾¶£¬°´ÕÕ´íÎóÊýÁ¿ÅÅÐò£ºÉÙ->¶à
*/
- QList> parse(std::shared_ptr words);
+ QList> parse(std::shared_ptr words);
/**
* @brief ÒÀ¾ÝÖ¸¶¨½âÎö·¾¶£¬ÌáÈ¡³ÌÐò½â¹¹
diff --git a/libSyntax/libSyntax.vcxproj b/libSyntax/libSyntax.vcxproj
index c4ef402..3144ba8 100644
--- a/libSyntax/libSyntax.vcxproj
+++ b/libSyntax/libSyntax.vcxproj
@@ -61,7 +61,7 @@
- $(SolutionDir)libToken\;$(IncludePath)
+ $(SolutionDir)libWords\;$(IncludePath)
$(SolutionDir)$(Platform)\$(Configuration)\;$(LibraryPath)
@@ -70,7 +70,7 @@
- libToken.lib;%(AdditionalDependencies);$(Qt_LIBS_)
+ libWords.lib;%(AdditionalDependencies);$(Qt_LIBS_)
Default
diff --git a/libSyntax/libsyntax.cpp b/libSyntax/libsyntax.cpp
index 3a64d30..d0b43cd 100644
--- a/libSyntax/libsyntax.cpp
+++ b/libSyntax/libsyntax.cpp
@@ -16,13 +16,12 @@ QList> Any::children() const {
}
QList> Any::parse(std::shared_ptr cursor) const {
- QList> result_list;
-
if (cursor->mustStop())
- result_list << cursor;
- else
- for (auto rx : this->children())
- result_list.append(rx->parse(cursor));
+ return QList>() << cursor;
+
+ QList> result_list;
+ for (auto rx : this->children())
+ result_list.append(rx->parse(cursor));
return result_list;
}
@@ -42,8 +41,10 @@ QList> Seqs::children() const {
}
QList> Seqs::parse(std::shared_ptr cursor) const {
- QList> results;
+ if (cursor->mustStop())
+ return QList>() << cursor;
+ QList> results;
QList> bridge_list{ cursor };
for (auto rule : this->children()) {
QList> current_result;
@@ -78,8 +79,10 @@ QList> Rept::children() const {
}
QList> Rept::parse(std::shared_ptr cursor) const {
- QList> results;
+ if (cursor->mustStop())
+ return QList>() << cursor;
+ QList> results;
QList> bridge_list{ cursor };
// ×îÐ¡ÖØ¸´´ÎÊýÆ¥Åä
for (auto idx = 0; idx < min_match; ++idx) {
@@ -123,14 +126,21 @@ QList> Rept::parse(std::shared_ptrmustStop()) {
+ if (rst_branch->mustStop() && rst_branch->currentWords()) {
results.append(rst_branch->previous());
current_list.removeAt(idx--);
}
+ if (rst_branch->mustStop() && !rst_branch->currentWords()) {
+ results.append(rst_branch);
+ current_list.removeAt(idx--);
+ }
}
+ if (!current_list.size())
+ break;
+
bridge_list = current_list;
}
@@ -183,19 +193,24 @@ QString ExprRule::present() const {
return child_store->present();
}
-MatchCursor::MatchCursor() { }
+MatchCursor::MatchCursor(const QString& path) :_file_path(path) { }
-lib_syntax::MatchCursor::MatchCursor(std::shared_ptr other_ptr)
+MatchCursor::MatchCursor(std::shared_ptr other_ptr)
: _prev_cursor(other_ptr),
+ _file_path(other_ptr->_file_path),
_total_errors(other_ptr->_total_errors),
_exprs_errors(other_ptr->_exprs_errors),
_current_token(other_ptr->_current_token),
_remains_word(other_ptr->_remains_word) { }
-std::shared_ptr lib_syntax::MatchCursor::previous() const {
+std::shared_ptr MatchCursor::previous() const {
return _prev_cursor;
}
+QString MatchCursor::filePath() const {
+ return _file_path;
+}
+
void MatchCursor::enterExprs() {
auto new_expr = std::make_shared();
this->_exprs_errors.push_back(new_expr);
@@ -211,11 +226,13 @@ void MatchCursor::quitExprs() {
}
bool MatchCursor::mustStop() const {
- return exprsErrorCount() >= 2;
+ return exprsErrorCount() >= 2 || parse_stop();
}
int MatchCursor::exprsErrorCount() const {
- return this->_exprs_errors.last()->errorCount();
+ if (this->_exprs_errors.size())
+ return this->_exprs_errors.last()->errorCount();
+ return 0;
}
int MatchCursor::totalErrorCount() const {
@@ -239,6 +256,10 @@ std::shared_ptr MatchCursor::currentWords() const {
return this->_remains_word;
}
+bool lib_syntax::MatchCursor::parse_stop() const {
+ return !currentWords();
+}
+
void MatchCursor::ErrsPack::addError(const QString& msg) {
this->_error_collection.append(msg);
}
diff --git a/libSyntax/libsyntax.h b/libSyntax/libsyntax.h
index b0fab99..58e917b 100644
--- a/libSyntax/libsyntax.h
+++ b/libSyntax/libsyntax.h
@@ -44,11 +44,12 @@ namespace lib_syntax {
QList _error_collection;
};
- MatchCursor();
+ MatchCursor(const QString& path);
MatchCursor(std::shared_ptr other_ptr);
virtual ~MatchCursor() = default;
virtual std::shared_ptr previous() const;
+ virtual QString filePath() const;
virtual void enterExprs();
virtual void logExprsError(const QString& msg);
@@ -64,12 +65,15 @@ namespace lib_syntax {
virtual std::shared_ptr currentWords() const;
private:
+ QString _file_path;
std::shared_ptr _prev_cursor = nullptr;
QList _total_errors; // ËùÓнâÎö´íÎó
QList> _exprs_errors; // µ±Ç°±í´ïʽ½âÎö´íÎó
std::shared_ptr _current_token = nullptr; // µ±Ç°Token
std::shared_ptr _remains_word = nullptr; // Ê£Óà´ÊÓï
+
+ bool parse_stop() const;
};
/**
@@ -151,7 +155,7 @@ namespace lib_syntax {
virtual QList> parse(std::shared_ptr cursor) const override;
virtual QString present() const override;
};
-
+
/**
* @brief ¶ÔÓ¦Óï·¨±í´ïʽ½âÎö¹æÔò
*/
@@ -197,6 +201,15 @@ namespace lib_syntax {
}
virtual QList> parse(std::shared_ptr current) const override {
auto w_this = current->currentWords();
+ if (!w_this) {
+ auto clone_ins = std::make_shared(current);
+ clone_ins->logExprsError(QString(u8"Syntax[0x00001]Ó﷨ƥÅä´íÎó£¬È±Ê§\"%1\">")
+ .arg(this->_define_peers->reviseWords()).arg(current->filePath()));
+ clone_ins->logExprsError(QString(u8"Syntax[0x00001]ÊäÈëÁ÷Ìáǰ½áÊø,<%1>").arg(current->filePath()));
+ return QList>() << clone_ins;
+ }
+
+
auto t_this = current->currentToken();
auto match_result = _define_peers->analysis(w_this);
@@ -216,7 +229,7 @@ namespace lib_syntax {
// ÉÙÒ»¸ö
{
auto short_one = std::make_shared(current);
- short_one->logExprsError(QString(u8"Syntax[0x00001]Ó﷨ƥÅä´íÎó£¬È±Ê§\"%1\"")
+ short_one->logExprsError(QString(u8"Syntax[0x00001]Ó﷨ƥÅä´íÎó£¬È±Ê§\"%1\">")
.arg(this->_define_peers->reviseWords())
.arg(w_this->row()).arg(w_this->column()).arg(w_this->file()));
retvals << short_one;
@@ -225,18 +238,19 @@ namespace lib_syntax {
// ´íÒ»¸ö
{
auto error_one = std::make_shared(current);
- error_one->logExprsError(QString(u8"Syntax[0x00001]Ó﷨ƥÅä´íÎó£¬ÇëÐÞÕý\"%1\"")
+ error_one->logExprsError(QString(u8"Syntax[0x00001]Ó﷨ƥÅä´íÎó£¬ÇëÐÞÕý\"%1\">")
.arg(w_this->content()).arg(w_this->row()).arg(w_this->column()).arg(w_this->file()));
auto tkins = std::make_shared(
w_this->row(), w_this->column(), w_this->position(),
- QString(u8"Ãû³Æ´íÎó_%1").arg((uint64_t)error_one.get()), w_this->file(), this->_define_peers);
+ QString(u8"%2_%1").arg((uint64_t) error_one.get()).arg(this->_define_peers->reviseWords()),
+ w_this->file(), this->_define_peers);
auto tkchain = std::make_shared>(tkins, t_this);
error_one->setCurrent(tkchain, w_this->nextWord());
retvals << error_one;
}
// ¶àÒ»¸ö
- {
+ if (w_this->nextWord()) {
auto nx_word = w_this->nextWord();
auto nx_result = this->_define_peers->analysis(nx_word);
if (std::get<0>(nx_result)) {
@@ -247,6 +261,8 @@ namespace lib_syntax {
}
auto clone_ins = std::make_shared(current);
+ clone_ins->logExprsError(QString(u8"Syntax[0x00001]Ó﷨ƥÅä´íÎó£¬Çëɾ³ý\"%1\">")
+ .arg(w_this->content()).arg(w_this->row()).arg(w_this->column()).arg(w_this->file()));
clone_ins->setCurrent(chain, remains);
retvals << clone_ins;
}
@@ -281,8 +297,18 @@ namespace lib_syntax {
ncursor->enterExprs();
auto nbranch = this->child_store->parse(ncursor);
- decltype(nbranch) branch_procs;
- std::for_each(nbranch.begin(), nbranch.end(), [&](std::shared_ptr curs) {
+ decltype(nbranch) list_ok;
+ std::copy_if(nbranch.begin(), nbranch.end(), std::back_inserter(list_ok),
+ [](std::shared_ptr ins) { return !ins->exprsErrorCount(); });
+ if (!list_ok.size()) {
+ std::copy_if(nbranch.begin(), nbranch.end(), std::back_inserter(list_ok),
+ [](std::shared_ptr ins) { return !ins->mustStop(); });
+ if (!list_ok.size())
+ list_ok = nbranch;
+ }
+
+ decltype(list_ok) branch_procs;
+ std::for_each(list_ok.begin(), list_ok.end(), [&](std::shared_ptr curs) {
if (curs->mustStop()) {
branch_procs.append(curs);
}
@@ -301,7 +327,7 @@ namespace lib_syntax {
return branch_procs;
}
-
+
protected:
virtual std::shared_ptr make_copy() const {
return std::make_shared>(this->name(), this->typeMark());
diff --git a/libSyntax/tokens_impl.h b/libSyntax/tokens_impl.h
index 2ae7dbb..727a85a 100644
--- a/libSyntax/tokens_impl.h
+++ b/libSyntax/tokens_impl.h
@@ -129,7 +129,7 @@ namespace lib_token {
}
std::shared_ptr defines() const override {
- throw new lib_token::TokenException(u8"²»Ó¦¸ÃÖ±½Ó·ÃÎÊExprBeginToken");
+ return nullptr;
}
std::shared_ptr prevToken() const override {
@@ -173,7 +173,7 @@ namespace lib_token {
throw new lib_token::TokenException(u8"²»Ó¦¸ÃÖ±½Ó·ÃÎÊExprEndToken");
}
std::shared_ptr defines() const override {
- throw new lib_token::TokenException(u8"²»Ó¦¸ÃÖ±½Ó·ÃÎÊExprEndToken");
+ return nullptr;
}
std::shared_ptr prevToken() const override {
return _prev_token;
diff --git a/libSyntax/tokens_novel.cpp b/libSyntax/tokens_novel.cpp
index d5b6362..3fd7f75 100644
--- a/libSyntax/tokens_novel.cpp
+++ b/libSyntax/tokens_novel.cpp
@@ -7,7 +7,7 @@ using namespace lib_token;
using namespace lib_words;
-QString LeftBracket::reviseWords() const { return u8"'{'"; }
+QString LeftBracket::reviseWords() const { return u8"{"; }
int LeftBracket::typeMark() const
{
@@ -34,7 +34,7 @@ LeftBracket::analysis(std::shared_ptr content) const {
return std::make_tuple(token_inst, nullptr);
}
-QString RightBracket::reviseWords() const { return u8"'}'"; }
+QString RightBracket::reviseWords() const { return u8"}"; }
int RightBracket::typeMark() const
{
@@ -43,7 +43,7 @@ int RightBracket::typeMark() const
QString RightBracket::regex() const { return u8"}"; }
-QString ReferMark::reviseWords() const { return u8"'@'"; }
+QString ReferMark::reviseWords() const { return u8"@"; }
int ReferMark::typeMark() const
{
@@ -54,7 +54,7 @@ QString ReferMark::regex() const { return u8"@"; }
Keywords::Keywords(const QString& val, uint type_code) : means_store(val), type_code(type_code) {}
-QString Keywords::reviseWords() const { return "'"+means_store+"'"; }
+QString Keywords::reviseWords() const { return means_store; }
int Keywords::typeMark() const
{
@@ -125,7 +125,7 @@ VTextSection::analysis(std::shared_ptr content) const {
return std::make_tuple(tinst, nullptr);
}
-QString Split::reviseWords() const { return u8"'&'"; }
+QString Split::reviseWords() const { return u8"&"; }
int Split::typeMark() const
{
@@ -166,7 +166,7 @@ NameSection::analysis(std::shared_ptr content) const
}
QString DeclareSymbo::reviseWords() const {
- return u8"'ÉùÃ÷·û'";
+ return u8"#";
}
int DeclareSymbo::typeMark() const
diff --git a/libWords/libwords.cpp b/libWords/libwords.cpp
index 344359d..887b1f5 100644
--- a/libWords/libwords.cpp
+++ b/libWords/libwords.cpp
@@ -5,8 +5,8 @@
using namespace lib_words;
-std::shared_ptr WordReader::wordsFrom(const QString& path) const {
- auto primary_words = extract_primary(path);
+std::shared_ptr WordReader::wordsFrom(QTextStream &tin, const QString& path) const {
+ auto primary_words = extract_primary(tin, path);
if (!primary_words.size())
return nullptr;
@@ -18,23 +18,14 @@ std::shared_ptr WordReader::wordsFrom(const QString& path)
return prev_ptr;
}
-
-QList> WordReader::extract_primary(const QString& path) const {
- QFile file(path);
- if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
- throw new WordsException(u8"Lex[0x0000]Ö¸¶¨ÎļþÎÞ·¨´ò¿ª£º" + path);
- }
-
- QTextStream tin(&file);
- tin.setCodec("UTF-8");
-
+QList> lib_words::WordReader::extract_primary(QTextStream& tin, const QString& f) const{
QList> ret_list;
int line_number = 1;
while (!tin.atEnd()) {
uint64_t relative_offset = line_number;
relative_offset = relative_offset << 32;
auto line = tin.readLine();
- ret_list.append(this->parse_line(relative_offset, line_number++, line, path));
+ ret_list.append(this->parse_line(relative_offset, line_number++, line, f));
}
return ret_list;
diff --git a/libWords/libwords.h b/libWords/libwords.h
index 562faea..8d8ae3d 100644
--- a/libWords/libwords.h
+++ b/libWords/libwords.h
@@ -3,6 +3,7 @@
#include "libwords_global.h"
#include
#include
+#include
namespace lib_words {
@@ -94,13 +95,13 @@ namespace lib_words {
class LIBWORDS_EXPORT WordReader {
private:
QList> parse_line(uint64_t start_pos, int row, const QString& line_text, const QString& path) const;
- QList> extract_primary(const QString& path) const;
+ QList> extract_primary(QTextStream& in, const QString &f_path) const;
public:
/**
* @brief ÌáȡԴÂëÖÐËùÓеĴÊÓï
*/
- std::shared_ptr wordsFrom(const QString& path) const;
+ std::shared_ptr wordsFrom(QTextStream& tin, const QString& path) const;
};