WsParser_VS/WsNovelParser/novelparser.cpp

64 lines
2.3 KiB
C++
Raw Normal View History

2024-03-17 07:58:28 +00:00
#include "novelparser.h"
#include <syntax_novel.h>
#include <ast_novel.h>
#include <parse_novel.h>
2024-06-15 01:18:33 +00:00
#include <QTime>
#include <QDebug>
2024-03-17 07:58:28 +00:00
using namespace example_novel;
NovelParser::NovelParser()
{
this->syntax_defines = example_novel::NovalSyntax::getParseTree();
checker_list << std::make_shared<example_novel::FragmentExistsCheck>();
checker_list << std::make_shared<example_novel::FragmentOrdersCheck>();
analyzer_ref = std::make_shared<lib_parse::Analyzer>(checker_list);
}
QString NovelParser::version() const
{
return "1.0.0";
}
std::shared_ptr<const ast_gen::ElementAccess> NovelParser::parse(const QFileInfoList source_list) const
{
QList<std::shared_ptr<const ast_basic::TokenNode>> forst_root;
auto lex_reader = NovalSyntax::getLexReader();
2024-06-15 01:18:33 +00:00
auto time_stamp = QTime::currentTime();
2024-03-17 07:58:28 +00:00
for (auto& file : source_list) {
auto tokens = lex_reader->extractFrom(file.canonicalFilePath());
auto exprs_result = std::make_shared<lib_syntax::ExprsChecker>(this->syntax_defines)->parseFrom(tokens);
forst_root.append(exprs_result);
}
2024-06-15 01:18:33 +00:00
auto current_stamp = QTime::currentTime();
qDebug() << QString(u8"<EFBFBD>ʷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+<2B><EFBFBD><EFB7A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䣺%1 ms<6D><73>").arg(time_stamp.msecsTo(current_stamp));
2024-03-17 07:58:28 +00:00
std::function<QList<std::shared_ptr<const ast_basic::ExprNode>>(QList<std::shared_ptr<const ast_basic::TokenNode>> input)> summary =
[&](QList<std::shared_ptr<const ast_basic::TokenNode>> input) -> QList<std::shared_ptr<const ast_basic::ExprNode>> {
QList<std::shared_ptr<const ast_basic::ExprNode>> temp;
if (input.size()) {
auto item = std::dynamic_pointer_cast<const ast_basic::ExprNode>(input.first());
temp << item;
temp.append(summary(input.mid(1)));
}
return temp;
};
2024-06-15 01:18:33 +00:00
time_stamp = QTime::currentTime();
2024-03-17 07:58:28 +00:00
auto tree_visit = std::make_shared<example_novel::NovelExprsVisitor>();
auto vinst = std::make_shared<ast_gen::ExprTreeParser>(tree_visit);
auto resultx = vinst->parse("test", summary(forst_root));
auto novel_accesstree = vinst->tidy(resultx);
2024-06-15 01:18:33 +00:00
current_stamp = QTime::currentTime();
qDebug() << QString(u8"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䣺%1 ms<6D><73>").arg(time_stamp.msecsTo(current_stamp));
2024-03-17 07:58:28 +00:00
return analyzer_ref->validCheckWith(novel_accesstree);
}