WsParser_VS/WsNovelParser/novelparser.cpp

72 lines
2.5 KiB
C++

#include "novelparser.h"
#include <syntax_novel.h>
#include <ast_novel.h>
#include <parse_novel.h>
#include <QTime>
#include <QDebug>
using namespace example_novel;
using namespace lib_parse;
NovelParser::NovelParser()
{
this->syntax_defines = NovalSyntax::getSyntaxTree();
checker_list << std::make_shared<FragmentExistsCheck>();
checker_list << std::make_shared<StoryOrderCheck>();
checker_list << std::make_shared<FragmentGraphCheck>();
analyzer_ref = std::make_shared<Analyzer>(checker_list);
}
QList<std::shared_ptr<const FragmentGraphHelper>> NovelParser::fragmentsSorted() const
{
return std::dynamic_pointer_cast<const FragmentGraphCheck>(checker_list[1])->fragmentsSequence();
}
QString NovelParser::version() const
{
return "1.0.0";
}
std::shared_ptr<IContext> NovelParser::parserContext() const
{
return context;
}
QList<std::shared_ptr<const IExprInstance>> NovelParser::parse(const QFileInfoList source_list) const {
const_cast<NovelParser*>(this)->context = std::make_shared<ast_gen::GlobalElement>(u8"小说");
auto word_reader = std::make_shared<lib_words::WordReader>();
auto time_stamp = QTime::currentTime();
for (auto& file : source_list) {
context->setCurrentFile(file.canonicalFilePath());
auto words = word_reader->wordsFrom(file.canonicalFilePath());
this->syntax_defines->parse(context, words);
}
QList<std::shared_ptr<const IExprInstance>> 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<const ast_gen::ElementAccess> NovelParser::validsApply(QList<std::shared_ptr<const IExprInstance>> forst_root) const {
auto time_stamp = QTime::currentTime();
QList<std::shared_ptr<ast_gen::SyntaxElement>> docs_node;
for (auto& it : forst_root) {
auto xitem = std::dynamic_pointer_cast<const ast_gen::SyntaxElement>(it);
docs_node.append(std::const_pointer_cast<ast_gen::SyntaxElement>(xitem));
context->addChild(docs_node.last());
}
auto x_root = NovalSyntax::tidy(context, docs_node);
auto novel_accesstree = std::make_shared<ast_gen::ElementAccess>(x_root);
auto current_stamp = QTime::currentTime();
qDebug().noquote() << QString(u8"%程序结构重建消耗时间:%1 ms。").arg(time_stamp.msecsTo(current_stamp));
return analyzer_ref->validCheckWith(novel_accesstree);
}