改进解析过程

This commit is contained in:
codeboss 2024-07-13 06:47:28 +08:00
parent e8534447be
commit 7d14a5a207
3 changed files with 22 additions and 10 deletions

View File

@ -69,15 +69,16 @@ int main(int argc, char* argv[]) {
if (files.size()) { if (files.size()) {
try { try {
auto parser = std::make_shared<NovelParser>(); auto parser = std::make_shared<NovelParser>();
access_ptr = parser->parse(files); auto docs = parser->parse(files);
auto errors_list = std::dynamic_pointer_cast<const ast_gen::GlobalElement>(access_ptr->element())->errors(); auto errors_list = parser->parserContext()->errors();
if (errors_list.size()) { if (errors_list.size()) {
for (auto& err : errors_list) { for (auto& err : errors_list) {
qDebug().noquote() << err; qDebug().noquote() << err;
} }
exit(0); exit(0);
} }
access_ptr = parser->validsApply(docs);
} }
catch (lib_syntax::SyntaxException* e) { catch (lib_syntax::SyntaxException* e) {
qDebug().noquote() << e->message(); qDebug().noquote() << e->message();

View File

@ -29,10 +29,14 @@ QString NovelParser::version() const
return "1.0.0"; return "1.0.0";
} }
std::shared_ptr<const ast_gen::ElementAccess> NovelParser::parse(const QFileInfoList source_list) const { std::shared_ptr<lib_syntax::IContext> NovelParser::parserContext() const
QList<std::shared_ptr<const ast_basic::IExprInst>> forst_root; {
return context;
}
QList<std::shared_ptr<const ast_basic::IExprInst>> 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_token::WordReader>(); auto word_reader = std::make_shared<lib_token::WordReader>();
auto context = std::make_shared<ast_gen::GlobalElement>(u8"С˵");
auto time_stamp = QTime::currentTime(); auto time_stamp = QTime::currentTime();
for (auto& file : source_list) { for (auto& file : source_list) {
@ -41,13 +45,17 @@ std::shared_ptr<const ast_gen::ElementAccess> NovelParser::parse(const QFileInfo
this->syntax_defines->parse(context, words); this->syntax_defines->parse(context, words);
} }
forst_root = context->getDocInsts(); QList<std::shared_ptr<const ast_basic::IExprInst>> forst_root = context->getDocInsts();
auto current_stamp = QTime::currentTime(); auto current_stamp = QTime::currentTime();
qDebug().noquote() << QString(u8"%词法解析+语法解析消耗时间:%1 ms。").arg(time_stamp.msecsTo(current_stamp)); qDebug().noquote() << QString(u8"%词法解析+语法解析消耗时间:%1 ms。").arg(time_stamp.msecsTo(current_stamp));
time_stamp = QTime::currentTime(); return forst_root;
}
std::shared_ptr<const ast_gen::ElementAccess> NovelParser::validsApply(QList<std::shared_ptr<const ast_basic::IExprInst>> forst_root) const {
auto time_stamp = QTime::currentTime();
QList<std::shared_ptr<ast_gen::SyntaxElement>> docs_node; QList<std::shared_ptr<ast_gen::SyntaxElement>> docs_node;
for (auto &it : forst_root) { for (auto& it : forst_root) {
auto xitem = std::dynamic_pointer_cast<const ast_gen::SyntaxElement>(it); auto xitem = std::dynamic_pointer_cast<const ast_gen::SyntaxElement>(it);
docs_node.append(std::const_pointer_cast<ast_gen::SyntaxElement>(xitem)); docs_node.append(std::const_pointer_cast<ast_gen::SyntaxElement>(xitem));
context->addChild(docs_node.last()); context->addChild(docs_node.last());
@ -55,7 +63,7 @@ std::shared_ptr<const ast_gen::ElementAccess> NovelParser::parse(const QFileInfo
auto x_root = NovalSyntax::tidy(context, docs_node); auto x_root = NovalSyntax::tidy(context, docs_node);
auto novel_accesstree = std::make_shared<ast_gen::ElementAccess>(x_root); auto novel_accesstree = std::make_shared<ast_gen::ElementAccess>(x_root);
current_stamp = QTime::currentTime(); auto current_stamp = QTime::currentTime();
qDebug().noquote() << QString(u8"%程序结构重建消耗时间:%1 ms。").arg(time_stamp.msecsTo(current_stamp)); qDebug().noquote() << QString(u8"%程序结构重建消耗时间:%1 ms。").arg(time_stamp.msecsTo(current_stamp));
return analyzer_ref->validCheckWith(novel_accesstree); return analyzer_ref->validCheckWith(novel_accesstree);

View File

@ -12,6 +12,7 @@ namespace example_novel {
class NovelParser class NovelParser
{ {
private: private:
std::shared_ptr<ast_gen::GlobalElement> context = nullptr;
std::shared_ptr<const lib_syntax::ExprRule> syntax_defines; std::shared_ptr<const lib_syntax::ExprRule> syntax_defines;
QList<std::shared_ptr<const lib_parse::CheckProvider>> checker_list; QList<std::shared_ptr<const lib_parse::CheckProvider>> checker_list;
std::shared_ptr<const lib_parse::Analyzer> analyzer_ref; std::shared_ptr<const lib_parse::Analyzer> analyzer_ref;
@ -21,5 +22,7 @@ public:
QList<std::shared_ptr<const example_novel::FragmentGraphHelper>> fragmentsSorted() const; QList<std::shared_ptr<const example_novel::FragmentGraphHelper>> fragmentsSorted() const;
virtual QString version() const; virtual QString version() const;
std::shared_ptr<const ast_gen::ElementAccess> parse(const QFileInfoList souurce_list) const; std::shared_ptr<lib_syntax::IContext> parserContext() const;
QList<std::shared_ptr<const ast_basic::IExprInst>> parse(const QFileInfoList souurce_list) const;
std::shared_ptr<const ast_gen::ElementAccess> validsApply(QList<std::shared_ptr<const ast_basic::IExprInst>> docs_list) const;
}; };