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; };