diff --git a/CoreTest/main.cpp b/CoreTest/main.cpp index 0b7905b..c4f00c4 100644 --- a/CoreTest/main.cpp +++ b/CoreTest/main.cpp @@ -4,28 +4,33 @@ #include #include #include +#include #include -int main(int argc, char *argv[]) -{ - QCoreApplication a(argc, argv); +int main(int argc, char* argv[]) { + QCoreApplication a(argc, argv); - QFile in("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, "D:\\Projects\\Cpp\\WsNovelParser\\CoreTest\\syntax_example.txt"); + QFile in("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, "D:\\Projects\\Cpp\\WsNovelParser\\CoreTest\\syntax_example.txt"); - ast_gen::SyntaxParser parser(example_novel::NovalSyntax::getSyntaxTree()); - auto rst = parser.parse(vwords); + ast_gen::SyntaxParser parser(example_novel::NovalSyntax::getSyntaxTree()); + auto rst = parser.parse(vwords); - for(auto x : rst) - qDebug() << x->parseSyntax(); - - auto prag_root = std::make_shared< ast_basic::ExprProgram>("HelloWorld!"); - auto structx = parser.getAst(rst.first(), prag_root); - parser.astPresent(structx); - - qDebug() << "===========finished=========================="; - return a.exec(); + if (rst.first()->totalErrorCount()) { + auto pos_mark = rst.first()->token()->position(); + for (auto item : rst) + if (item->token()->position() == pos_mark) + for (auto line : item->totalErrors()) + qDebug().noquote() << line; + } + else { + auto prag_root = std::make_shared("HelloWorld!"); + auto structx = parser.getAst(rst.first(), prag_root); + parser.astPresent(structx); + } + qDebug() << "===========finished=========================="; + return a.exec(); } diff --git a/CoreTest/syntax_example.txt b/CoreTest/syntax_example.txt index db11e91..fc7c32f 100644 --- a/CoreTest/syntax_example.txt +++ b/CoreTest/syntax_example.txt @@ -12,4 +12,118 @@ {故事 故事名称4 故事介绍段落 aldkfjl flwief -} \ No newline at end of file +} + +{故事 故事名称4 + 故事介绍段落 aldkfjl flwief + {剧情 剧情名称} +} + +{故事 故事名称4 + 故事介绍段落 aldkfjl flwief + {剧情 剧情名称 剧情介绍} +} + +{故事 故事名称4 + 故事介绍段落 aldkfjl flwief + {剧情 剧情名称 + 剧情介绍 + } +} + +{故事 故事名称4 + 故事介绍段落 aldkfjl flwief + {剧情 剧情名称 + 剧情介绍 + {节点 节点名称} + } +} + +{故事 故事名称4 + 故事介绍段落 aldkfjl flwief + {剧情 剧情名称 + 剧情介绍 + {节点 节点名称 + 奥龙订饭;爱领克 非两爱看扥} + } +} + +{故事 故事名称4 + 故事介绍段落 aldkfjl flwief + {剧情 剧情名称 + 剧情介绍 + {节点 节点名称 + 奥龙订饭;爱领克 非两爱看扥 + } + } +} + +{故事 故事名称4 + 故事介绍段落 aldkfjl flwief + {剧情 剧情名称 + 剧情介绍 + {节点 节点名称 + 奥龙订饭;爱领克 非两爱看扥 + } + {@节点 节点面&发来垦局&零件扥} + } +} + +{故事 故事名称4 + 故事介绍段落 aldkfjl flwief + {剧情 剧情名称 + 剧情介绍 + {节点 节点名称 + 奥龙订饭;爱领克 非两爱看扥 + } + {@节点 节点面&发来垦局&零件扥 + asldkfj 来看房莱肯} + } +} + +{故事 故事名称4 + 故事介绍段落 aldkfjl flwief + {剧情 剧情名称 + 剧情介绍 + {节点 节点名称 + 奥龙订饭;爱领克 非两爱看扥 + } + {@节点 节点面&发来垦局&零件扥 + asldkfj 来看房莱肯 + } + } +} + +{分卷 卷宗名称} + +{分卷 卷宗名称 + 拉开茯苓领赛季发啦肯} + +{分卷 卷宗名称 + 拉开茯苓领赛季发啦肯 lakdjf;alfj + } + +{分卷 卷宗名称 + 拉开茯苓领赛季发啦肯 lakdjf;alfj + {章节 章节名称} + } + +{分卷 卷宗名称 + 拉开茯苓领赛季发啦肯 lakdjf;alfj + {章节 章节名称 昂来看申领发} + } + +{分卷 卷宗名称 + 拉开茯苓领赛季发啦肯 lakdjf;alfj + {章节 章节名称 昂来看申领发 + {@节点 故事&剧情&节点} + } + } + +{分卷 卷宗名称 + 拉开茯苓领赛季发啦肯 lakdjf;alfj + {章节 章节名称 昂来看申领发 + {@节点 故事&剧情&节点 爱;莱肯爱;冷 + 森铃但凡拉动垦局} + } + } \ No newline at end of file diff --git a/libParse/libParse.vcxproj b/libParse/libParse.vcxproj index 02b20d9..f2932de 100644 --- a/libParse/libParse.vcxproj +++ b/libParse/libParse.vcxproj @@ -61,7 +61,7 @@ - $(SolutionDir)libToken\;$(SolutionDir)libSyntax\;$(IncludePath) + $(SolutionDir)libWords\;$(SolutionDir)libSyntax\;$(IncludePath) $(SolutionDir)$(Platform)\$(Configuration)\;$(LibraryPath) @@ -70,7 +70,7 @@ - libToken.lib;libSyntax.lib;%(AdditionalDependencies);$(Qt_LIBS_) + libWords.lib;libSyntax.lib;%(AdditionalDependencies);$(Qt_LIBS_) Default diff --git a/libSyntax/ast_gen.cpp b/libSyntax/ast_gen.cpp index db2b8f5..5e18907 100644 --- a/libSyntax/ast_gen.cpp +++ b/libSyntax/ast_gen.cpp @@ -53,10 +53,17 @@ std::shared_ptr ast_gen::SyntaxParser::getAst( void ast_gen::SyntaxParser::astPresent(std::shared_ptr node, int depth) { auto msg = QString(depth * 4, ' '); - if (node->definedRule()) - qDebug() << msg + node->definedRule()->name(); - else - qDebug() << msg + "Program"; + if (node->definedRule()) { + auto token_seqs = node->tokens(); + + QList _contents; + std::transform(token_seqs.begin(), token_seqs.end(), + std::back_inserter(_contents), + [](std::shared_ptr t) { return t->content(); }); + qDebug().noquote() << msg + node->definedRule()->name() << _contents; + } + else + qDebug().noquote() << msg + "Program"; for (auto it : node->children()) astPresent(it, depth + 1); diff --git a/libSyntax/libsyntax.h b/libSyntax/libsyntax.h index 70bf4eb..c4b4c4d 100644 --- a/libSyntax/libsyntax.h +++ b/libSyntax/libsyntax.h @@ -206,7 +206,7 @@ namespace lib_syntax { // 鍙湁鍦ㄨ〃杈惧紡鐨勮捣濮嬬偣閬囧埌nullptr锛屾墠鏄甯哥粨鏉熴 if (current->token()->tokenType() != lib_token::IActionToken::Type::ElementBegin) { auto ncurs = std::make_shared(current); - ncurs->logExprsError(QString("Syntax[0x00001]杈撳叆閿欒锛岀▼搴忔彁鍓嶇粨鏉燂細%1銆").arg(current->filePath())); + ncurs->logExprsError(QString("SyntaxError[0x00001]杈撳叆閿欒锛岀▼搴忔彁鍓嶇粨鏉燂細%1銆").arg(current->filePath())); ncurs->setFailure(); return QList>() << ncurs; } @@ -238,14 +238,14 @@ namespace lib_syntax { QList> retvals; // 灏戜竴涓 auto short_one = std::make_shared(current); - short_one->logExprsError(QString("Syntax[0x00001]璇硶鍖归厤閿欒锛岀己澶盶"%1\">") + short_one->logExprsError(QString("SyntaxError[0x00002]璇硶鍖归厤閿欒锛岀己澶盶"%1\">") .arg(this->_define_peers->reviseWords()) .arg(w_this->row()).arg(w_this->column()).arg(w_this->file())); retvals << short_one; // 閿欎竴涓 auto error_one = std::make_shared(current); - error_one->logExprsError(QString("Syntax[0x00001]璇硶鍖归厤閿欒锛岃淇\"%1\">") + error_one->logExprsError(QString("SyntaxError[0x00003]璇硶鍖归厤閿欒锛岃淇\"%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(), @@ -267,7 +267,7 @@ namespace lib_syntax { } auto clone_ins = std::make_shared(current); - clone_ins->logExprsError(QString("Syntax[0x00001]璇硶鍖归厤閿欒锛岃鍒犻櫎\"%1\">") + clone_ins->logExprsError(QString("SyntaxError[0x00004]璇硶鍖归厤閿欒锛岃鍒犻櫎\"%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; diff --git a/libSyntax/syntax_novel.cpp b/libSyntax/syntax_novel.cpp index 5adc5b7..cdcc8f4 100644 --- a/libSyntax/syntax_novel.cpp +++ b/libSyntax/syntax_novel.cpp @@ -152,7 +152,7 @@ public: -using ReferSyntaxDef = lib_composit::Seqs, Match, Match, Action, Match, Action, Match, Action, +using ReferSyntaxDef = lib_composit::Seqs, Match, Match, Action, Match, Action, Match, Action, OptMulti, Match>; class ReferSyntax : public ElementRule {