#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "novelparser.h" #include "htmlprint.h" using namespace example_novel; using namespace std; using namespace args_parse; int main(int argc, char* argv[]) { QCoreApplication a(argc, argv); ArgsParser args_parser; auto help_mode = make_shared(0x000Au, u8"打印帮助信息"); args_parser << help_mode; *help_mode << make_shared(u8"nsc", u8"程序名称") << make_shared(u8"help", u8"帮助"); auto build_mode = make_shared(0x000Bu, u8"执行故事线编译任务"); args_parser << build_mode; *build_mode << make_shared(u8"nsc", u8"程序名称") << make_shared(u8"path", u8"指定源代码目录") << make_shared(u8"dest", u8"指定生成目录") << make_shared(u8"html", u8"生成html文件格式取代AST", true); auto p_result = args_parser.parse(argc, argv); if (!p_result) { qDebug().noquote() << args_parser.helpDoc(); } else { switch (p_result->modeCode()) { case 0xAu: default: qDebug().noquote() << u8"命令行参数错误!"; qDebug().noquote() << args_parser.helpDoc(); break; case 0xBu: { auto src_dir = dynamic_pointer_cast(p_result->getUnitViaKey(u8"path")); auto dst_dir = dynamic_pointer_cast(p_result->getUnitViaKey(u8"dest")); auto html_opt = dynamic_pointer_cast(p_result->getUnitViaKey(u8"html")); auto source_dir = QDir(src_dir->value().toString()); if (!source_dir.exists()) { cout << "%编译指定的源代码目录不存在!" << endl; exit(0); } auto destination_dir = QDir::current(); auto target_output = dst_dir->value(); if (!target_output.isNull() && QDir(target_output.toString()).exists()) { destination_dir = QDir(target_output.toString()); } else { cout << "%编译指定的生成目录不存在,重置为:" << destination_dir.absolutePath().toLocal8Bit().data() << endl; } auto files = source_dir.entryInfoList(QStringList() << "*.story"); shared_ptr access_ptr = nullptr; if (files.size()) { try { auto parser = make_shared(); auto docs = parser->parse(files); auto errors_list = parser->parserContext()->errors(); if (errors_list.size()) { for (auto& err : errors_list) { qDebug().noquote() << err; } exit(0); } access_ptr = parser->validsApply(docs); } catch (lib_syntax::SyntaxException* e) { qDebug().noquote() << e->message(); delete e; exit(0); } catch (lib_parse::CheckException* e) { qDebug().noquote() << e->message(); delete e; exit(0); } } if (html_opt->value().toInt() == 1 && access_ptr) { printer::tools_printer tool; tool.plain_html_output(access_ptr, destination_dir); } else if (access_ptr) { QTime time_stamp = QTime::currentTime(); lib_parse::VisitorControl control; auto visitor = make_shared(source_dir); control.visitWith(access_ptr, visitor);; auto dom_result = visitor->content(); QFile file(destination_dir.absoluteFilePath(u8"storyline.xast")); if (file.open(QIODevice::Text | QIODevice::WriteOnly)) { QTextStream tout(&file); tout.setCodec("UTF-8"); tout << dom_result; tout.flush(); } auto current_stamp = QTime::currentTime(); qDebug().noquote() << QString(u8"%AST构建消耗时间:%1 ms。").arg(time_stamp.msecsTo(current_stamp)); qDebug().noquote() << QString(u8"%编译成功:%1。").arg(QFileInfo(file).absoluteFilePath()); } }break; } } //return a.exec(); return 0; }