#include "novelparser.h" #include #include #include #include #include using namespace example_novel; NovelParser::NovelParser() { this->syntax_defines = example_novel::NovalSyntax::getParseTree(); checker_list << std::make_shared(); checker_list << std::make_shared(); analyzer_ref = std::make_shared(checker_list); } QString NovelParser::version() const { return "1.0.0"; } std::shared_ptr NovelParser::parse(const QFileInfoList source_list) const { QList> forst_root; auto lex_reader = NovalSyntax::getLexReader(); auto time_stamp = QTime::currentTime(); for (auto& file : source_list) { auto tokens = lex_reader->extractFrom(file.canonicalFilePath()); auto exprs_result = std::make_shared(this->syntax_defines)->parseFrom(tokens); forst_root.append(exprs_result); } auto current_stamp = QTime::currentTime(); qDebug() << QString(u8"词法解析+语法解析消耗时间:%1 ms。").arg(time_stamp.msecsTo(current_stamp)); std::function>(QList> input)> summary = [&](QList> input) -> QList> { QList> temp; if (input.size()) { auto item = std::dynamic_pointer_cast(input.first()); temp << item; temp.append(summary(input.mid(1))); } return temp; }; time_stamp = QTime::currentTime(); auto tree_visit = std::make_shared(); auto vinst = std::make_shared(tree_visit); auto resultx = vinst->parse("test", summary(forst_root)); auto novel_accesstree = vinst->tidy(resultx); current_stamp = QTime::currentTime(); qDebug() << QString(u8"程序结构重建消耗时间:%1 ms。").arg(time_stamp.msecsTo(current_stamp)); return analyzer_ref->validCheckWith(novel_accesstree); }