Compare commits
No commits in common. "d0fa2671fa8c5d87acf422d1829a0c76df220ade" and "435d01dde7ef89de82f883073e9eb0743b9015e2" have entirely different histories.
d0fa2671fa
...
435d01dde7
|
@ -1,5 +1,4 @@
|
|||
#include "argsparser.h"
|
||||
#include <QVariant>
|
||||
|
||||
using namespace args_parse;
|
||||
using namespace std;
|
||||
|
@ -15,27 +14,27 @@ QString __ArgvPackImpls::means() const {
|
|||
return means_store;
|
||||
}
|
||||
|
||||
void __ArgvPackImpls::setValue(const QVariant& v) {
|
||||
void __ArgvPackImpls::setValue(const QString& v) {
|
||||
this->value_store = v;
|
||||
}
|
||||
|
||||
QVariant __ArgvPackImpls::value() const {
|
||||
QString __ArgvPackImpls::value() const {
|
||||
return value_store;
|
||||
}
|
||||
|
||||
FloatKeyValue::FloatKeyValue(const QString& key, const QString& means, bool optional) :
|
||||
__FloatArgvImpls(key, means, optional) { }
|
||||
__FloatArgvImpl(key, means, optional) { }
|
||||
|
||||
QString __FloatArgvImpls::bindKey() const {
|
||||
QString __FloatArgvImpl::bindKey() const {
|
||||
return key_name;
|
||||
}
|
||||
|
||||
bool __FloatArgvImpls::optional() const {
|
||||
bool __FloatArgvImpl::optional() const {
|
||||
return optional_value;
|
||||
}
|
||||
|
||||
QString args_parse::FloatKeyValue::placeHolder() const {
|
||||
if (optional())
|
||||
if(optional())
|
||||
return QString("[--%1 <%2>]").arg(bindKey(), bindKey());
|
||||
return QString("--%1 <%2>").arg(bindKey(), bindKey());
|
||||
}
|
||||
|
@ -47,11 +46,9 @@ int FloatKeyValue::matchLenth() const {
|
|||
bool FloatKeyValue::parse(const QList<QString> args, int start) {
|
||||
auto args_t = args[start];
|
||||
auto args_v = args[start + 1];
|
||||
if (args_t == u8"--" + bindKey()){
|
||||
if (args_t == bindKey())
|
||||
setValue(args_v);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
return args_t == bindKey();
|
||||
}
|
||||
|
||||
IndexParam::IndexParam(const QString& place_v, const QString& means)
|
||||
|
@ -70,15 +67,16 @@ bool IndexParam::parse(const QList<QString> args, int start) {
|
|||
return true;
|
||||
}
|
||||
|
||||
__FloatArgvImpls::__FloatArgvImpls(const QString& key, const QString& means, bool optional)
|
||||
__FloatArgvImpl::__FloatArgvImpl(const QString& key, const QString& means, bool optional)
|
||||
: __ArgvPackImpls(means, ParamType::FloatParam), key_name(key), optional_value(optional) { }
|
||||
|
||||
FloatOption::FloatOption(const QString& key, const QString& means, bool opt)
|
||||
: __FloatArgvImpls(key, means, opt) {
|
||||
: __FloatArgvImpl(key, means, opt) {
|
||||
setValue(u8"0");
|
||||
}
|
||||
|
||||
QString args_parse::FloatOption::placeHolder() const {
|
||||
if (optional())
|
||||
if(optional())
|
||||
return QString("[--%1]").arg(bindKey());
|
||||
return QString("--%1").arg(bindKey());
|
||||
}
|
||||
|
@ -89,123 +87,83 @@ int FloatOption::matchLenth() const {
|
|||
|
||||
bool FloatOption::parse(const QList<QString> args, int start) {
|
||||
auto args_t = args[start];
|
||||
setValue(args_t == bindKey());
|
||||
return args_t == u8"--" + bindKey();
|
||||
setValue(QString::number(args_t == bindKey()));
|
||||
return args_t == bindKey();
|
||||
}
|
||||
|
||||
MatchMode::MatchMode(int mode_code, const QString& mode)
|
||||
:_means_explain(mode), code_store(mode_code) { }
|
||||
namespace args_parse {
|
||||
class MatchMode {
|
||||
private:
|
||||
QList<shared_ptr<IArgvPack>> args_mode;
|
||||
int code_store;
|
||||
|
||||
/**
|
||||
* @brief 获取模式代码
|
||||
* @return 模式代码
|
||||
*/
|
||||
public:
|
||||
explicit MatchMode(const QList<shared_ptr<IArgvPack>> mode, int mode_code)
|
||||
:args_mode(mode), code_store(mode_code) { }
|
||||
|
||||
MatchMode& args_parse::MatchMode::operator<<(std::shared_ptr<IArgvPack> unit) {
|
||||
args_mode << unit;
|
||||
return *this;
|
||||
}
|
||||
|
||||
int MatchMode::modeCode() const {
|
||||
return code_store;
|
||||
}
|
||||
|
||||
QString args_parse::MatchMode::usageString() const {
|
||||
QString usage_string;
|
||||
for (auto& item : args_mode)
|
||||
usage_string += item->placeHolder() + u8" ";
|
||||
|
||||
return usage_string;
|
||||
}
|
||||
|
||||
QString args_parse::MatchMode::explanString() const {
|
||||
QStringList sections;
|
||||
sections << u8" " + _means_explain;
|
||||
sections << QString(" Switch:");
|
||||
|
||||
for (auto& item : args_mode) {
|
||||
sections << " " + item->placeHolder();
|
||||
sections << " " + item->means();
|
||||
}
|
||||
|
||||
return sections.join("\n");
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 解析匹配参数
|
||||
*/
|
||||
|
||||
bool MatchMode::parse(const QList<QString>& args, int argv_index, int parse_index) {
|
||||
if (argv_index >= args.size())
|
||||
return true;
|
||||
|
||||
// 获取模式匹配单元
|
||||
auto parse_unit = args_mode[parse_index];
|
||||
switch (parse_unit->paramType()) {
|
||||
case ParamType::IndexParam:// 固定位置索引匹配
|
||||
{
|
||||
parse_unit->parse(args, argv_index);
|
||||
// 继续匹配下一个为止
|
||||
return parse(args, argv_index + parse_unit->matchLenth(), parse_index + 1);
|
||||
}break;
|
||||
case ParamType::FloatParam:// 浮动参数匹配
|
||||
{
|
||||
QList<shared_ptr<__FloatArgvImpls>> float_parsers;
|
||||
|
||||
for (auto& unit : args_mode) {
|
||||
if (unit->paramType() == ParamType::FloatParam)
|
||||
float_parsers << dynamic_pointer_cast<__FloatArgvImpls>(unit);
|
||||
}
|
||||
|
||||
for (auto& unit : float_parsers) {
|
||||
if (unit->matchLenth() + argv_index > args.size())
|
||||
continue;
|
||||
|
||||
auto result = unit->parse(args, argv_index);
|
||||
if (result)
|
||||
if (parse(args, argv_index + unit->matchLenth(), parse_index + 1))
|
||||
return true;
|
||||
else if (!result && unit->optional())
|
||||
if (parse(args, argv_index, parse_index + 1))
|
||||
return true;
|
||||
}
|
||||
}break;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
std::shared_ptr<IArgvPack> args_parse::MatchMode::getUnitViaKey(const QString& key) {
|
||||
for (auto& u : args_mode) {
|
||||
if (u->paramType() == ParamType::FloatParam) {
|
||||
auto conv = std::dynamic_pointer_cast<__FloatArgvImpls>(u);
|
||||
if (conv->bindKey() == key)
|
||||
return u;
|
||||
/**
|
||||
* @brief 获取模式代码
|
||||
* @return 模式代码
|
||||
*/
|
||||
int modeCode()const {
|
||||
return code_store;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @brief 获取模式匹配结果
|
||||
* @return 模式匹配结果
|
||||
*/
|
||||
QList<shared_ptr<IArgvPack>> result() const {
|
||||
return args_mode;
|
||||
}
|
||||
/**
|
||||
* @brief 解析匹配参数
|
||||
*/
|
||||
bool parse(const QList<QString>& args, int argv_index, int parse_index) {
|
||||
if (argv_index >= args.size())
|
||||
return true;
|
||||
|
||||
return std::shared_ptr<IArgvPack>();
|
||||
// 获取模式匹配单元
|
||||
auto parse_unit = args_mode[parse_index];
|
||||
switch (parse_unit->paramType()) {
|
||||
case ParamType::IndexParam:// 固定位置索引匹配
|
||||
{
|
||||
parse_unit->parse(args, argv_index);
|
||||
// 继续匹配下一个为止
|
||||
return parse(args, argv_index + parse_unit->matchLenth(), parse_index + 1);
|
||||
}break;
|
||||
case ParamType::FloatParam:// 浮动参数匹配
|
||||
{
|
||||
QList<shared_ptr<__FloatArgvImpl>> float_parsers;
|
||||
|
||||
for (auto& unit : args_mode) {
|
||||
if (unit->paramType() == ParamType::FloatParam)
|
||||
float_parsers << dynamic_pointer_cast<__FloatArgvImpl>(unit);
|
||||
}
|
||||
|
||||
for (auto& unit : float_parsers) {
|
||||
if (unit->matchLenth() + argv_index > args.size())
|
||||
continue;
|
||||
|
||||
auto result = unit->parse(args, argv_index);
|
||||
if (result)
|
||||
if (parse(args, argv_index + unit->matchLenth(), parse_index + 1))
|
||||
return true;
|
||||
else if (!result && unit->optional())
|
||||
if (parse(args, argv_index, parse_index + 1))
|
||||
return true;
|
||||
}
|
||||
}break;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
};
|
||||
}
|
||||
void ArgsParser::loadMode(int mode_code, const QList<shared_ptr<IArgvPack>>& args_model) {
|
||||
this->match_modes.append(make_shared<MatchMode>(args_model, mode_code));
|
||||
}
|
||||
|
||||
std::shared_ptr<IArgvPack> args_parse::MatchMode::getUnitViaPos(int pos) {
|
||||
return args_mode[pos];
|
||||
}
|
||||
|
||||
QString args_parse::ArgsParser::helpDoc() const {
|
||||
QString help_string;
|
||||
for (auto& mode : this->match_modes) {
|
||||
help_string += "Usage:" + mode->usageString() + "\n";
|
||||
help_string += mode->explanString() + "\n\n";
|
||||
}
|
||||
return help_string;
|
||||
}
|
||||
|
||||
ArgsParser& args_parse::ArgsParser::operator<<(std::shared_ptr<MatchMode> mode) {
|
||||
this->match_modes.append(mode);
|
||||
return *this;
|
||||
}
|
||||
|
||||
std::shared_ptr<MatchMode> ArgsParser::parse(int argc, char* argv[]) {
|
||||
tuple<int, QList<shared_ptr<IArgvPack>>> ArgsParser::parse(int argc, char* argv[]) {
|
||||
// 聚合参数数组
|
||||
QList<QString> args_list;
|
||||
for (int idx = 0; idx < argc; idx++) {
|
||||
|
@ -216,8 +174,8 @@ std::shared_ptr<MatchMode> ArgsParser::parse(int argc, char* argv[]) {
|
|||
// 枚举模式匹配
|
||||
for (auto& minst : this->match_modes) {
|
||||
if (minst->parse(args_list, 0, 0))
|
||||
return minst;
|
||||
return tuple<int, QList<shared_ptr<IArgvPack>>>(minst->modeCode(), minst->result());
|
||||
}
|
||||
|
||||
return std::shared_ptr<MatchMode>();
|
||||
return tuple<int, QList<shared_ptr<IArgvPack>>>(0, QList<shared_ptr<IArgvPack>>());
|
||||
}
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
#include <QList>
|
||||
#include <qHash>
|
||||
#include <tuple>
|
||||
#include <QVariant>
|
||||
#include "argsparser_global.h"
|
||||
|
||||
namespace args_parse {
|
||||
|
@ -36,7 +35,7 @@ namespace args_parse {
|
|||
*/
|
||||
virtual QString means() const = 0;
|
||||
virtual QString placeHolder() const = 0;
|
||||
virtual QVariant value() const = 0;
|
||||
virtual QString value() const = 0;
|
||||
/**
|
||||
* @brief 匹配长度.
|
||||
*
|
||||
|
@ -56,27 +55,27 @@ namespace args_parse {
|
|||
class ARGSPARSER_EXPORT __ArgvPackImpls : public IArgvPack {
|
||||
private:
|
||||
QString means_store;
|
||||
QVariant value_store;
|
||||
QString value_store;
|
||||
ParamType type_store;
|
||||
|
||||
public:
|
||||
__ArgvPackImpls(const QString &means, ParamType t);
|
||||
|
||||
void setValue(const QVariant &v);
|
||||
void setValue(const QString &v);
|
||||
|
||||
// 通过 IArgvPack 继承
|
||||
ParamType paramType() const override;
|
||||
QString means() const override;
|
||||
QVariant value() const override;
|
||||
QString value() const override;
|
||||
};
|
||||
|
||||
class ARGSPARSER_EXPORT __FloatArgvImpls : public __ArgvPackImpls {
|
||||
class ARGSPARSER_EXPORT __FloatArgvImpl : public __ArgvPackImpls {
|
||||
private:
|
||||
QString key_name;
|
||||
bool optional_value;
|
||||
|
||||
public:
|
||||
explicit __FloatArgvImpls(const QString& key, const QString& means, bool optional);
|
||||
explicit __FloatArgvImpl(const QString& key, const QString& means, bool optional);
|
||||
|
||||
QString bindKey() const;
|
||||
virtual bool optional() const;
|
||||
|
@ -86,15 +85,8 @@ namespace args_parse {
|
|||
* @brief 命令行key-value解析匹配模式.
|
||||
* --key value
|
||||
*/
|
||||
class ARGSPARSER_EXPORT FloatKeyValue : public __FloatArgvImpls {
|
||||
class ARGSPARSER_EXPORT FloatKeyValue : public __FloatArgvImpl {
|
||||
public:
|
||||
/**
|
||||
* 浮动key-value解析单元.
|
||||
*
|
||||
* \param key 键名
|
||||
* \param means 参数解释
|
||||
* \param optional 是否可选
|
||||
*/
|
||||
explicit FloatKeyValue(const QString& key, const QString &means, bool optional = false);
|
||||
virtual ~FloatKeyValue() = default;
|
||||
|
||||
|
@ -107,15 +99,8 @@ namespace args_parse {
|
|||
* @brief 命令行key解析匹配模式.
|
||||
* --key
|
||||
*/
|
||||
class ARGSPARSER_EXPORT FloatOption : public __FloatArgvImpls {
|
||||
class ARGSPARSER_EXPORT FloatOption : public __FloatArgvImpl {
|
||||
public:
|
||||
/**
|
||||
* 浮动option解析单元.
|
||||
*
|
||||
* \param key 键名
|
||||
* \param means 参数解释
|
||||
* \param optional 是否可选
|
||||
*/
|
||||
explicit FloatOption(const QString& key, const QString& means, bool optional = false);
|
||||
virtual ~FloatOption() = default;
|
||||
|
||||
|
@ -141,69 +126,15 @@ namespace args_parse {
|
|||
bool parse(const QList<QString> args, int start) override;
|
||||
};
|
||||
|
||||
class ARGSPARSER_EXPORT MatchMode {
|
||||
private:
|
||||
int code_store;
|
||||
QString _means_explain;
|
||||
|
||||
QList<std::shared_ptr<IArgvPack>> args_mode;
|
||||
|
||||
public:
|
||||
explicit MatchMode(int mode_code, const QString &explain);
|
||||
|
||||
/**
|
||||
* @brief 获取模式代码
|
||||
* @return 模式代码
|
||||
*/
|
||||
int modeCode()const;
|
||||
|
||||
/**
|
||||
* 获取用例字符串.
|
||||
*
|
||||
* \return
|
||||
*/
|
||||
QString usageString() const;
|
||||
|
||||
/**
|
||||
* 返回模式解析字符串.
|
||||
*
|
||||
* \return
|
||||
*/
|
||||
QString explanString() const;
|
||||
|
||||
/**
|
||||
* 添加参数解析单元.
|
||||
*
|
||||
* \param unit
|
||||
* \return
|
||||
*/
|
||||
MatchMode& operator<<(std::shared_ptr<IArgvPack> unit);
|
||||
|
||||
/**
|
||||
* @brief 解析匹配参数
|
||||
*/
|
||||
bool parse(const QList<QString>& args, int argv_index, int parse_index);
|
||||
|
||||
/**
|
||||
* 获取解析单元.
|
||||
*
|
||||
* \param key
|
||||
* \return
|
||||
*/
|
||||
std::shared_ptr<IArgvPack> getUnitViaKey(const QString& key);
|
||||
std::shared_ptr<IArgvPack> getUnitViaPos(int pos);
|
||||
};
|
||||
|
||||
class MatchMode;
|
||||
class ARGSPARSER_EXPORT ArgsParser {
|
||||
private:
|
||||
QList<std::shared_ptr<MatchMode>> match_modes;
|
||||
|
||||
public:
|
||||
QString helpDoc() const;
|
||||
void loadMode(int mode_code, const QList<std::shared_ptr<IArgvPack>> &args_model);
|
||||
|
||||
ArgsParser& operator<<(std::shared_ptr<MatchMode> mode);
|
||||
|
||||
std::shared_ptr<MatchMode> parse(int argc, char* argv[]);
|
||||
std::tuple<int, QList<std::shared_ptr<IArgvPack>>> parse(int argc, char* argv[]);
|
||||
};
|
||||
|
||||
}
|
|
@ -17,8 +17,6 @@
|
|||
#include "htmlprint.h"
|
||||
|
||||
using namespace example_novel;
|
||||
using namespace std;
|
||||
using namespace args_parse;
|
||||
|
||||
/*
|
||||
* nsc --help
|
||||
|
@ -30,101 +28,99 @@ using namespace args_parse;
|
|||
int main(int argc, char* argv[]) {
|
||||
QCoreApplication a(argc, argv);
|
||||
|
||||
ArgsParser args_parser;
|
||||
auto help_mode = make_shared<MatchMode>(0x000Au, u8"打印帮助信息");
|
||||
args_parser << help_mode;
|
||||
*help_mode << make_shared<IndexParam>(u8"nsc", u8"程序名称")
|
||||
<< make_shared<FloatOption>(u8"help", u8"帮助");
|
||||
args_parse::ArgsParser args_parser;
|
||||
QList<std::shared_ptr<args_parse::IArgvPack>> args_mode;
|
||||
args_mode << std::make_shared<args_parse::IndexParam>(u8"nsc", u8"程序名称");
|
||||
args_mode << std::make_shared<args_parse::FloatOption>(u8"--help", u8"帮助");
|
||||
args_parser.loadMode(0x000Au, args_mode);
|
||||
|
||||
auto build_mode = make_shared<MatchMode>(0x000Bu, u8"执行故事线编译任务");
|
||||
args_parser << build_mode;
|
||||
*build_mode << make_shared<IndexParam>(u8"nsc", u8"程序名称")
|
||||
<< make_shared<FloatKeyValue>(u8"path", u8"指定源代码目录")
|
||||
<< make_shared<FloatKeyValue>(u8"dest", u8"指定生成目录")
|
||||
<< make_shared<FloatOption>(u8"html", u8"生成html文件格式取代AST", true);
|
||||
args_mode.clear();
|
||||
args_mode << std::make_shared<args_parse::IndexParam>(u8"nsc", u8"程序名称");
|
||||
args_mode << std::make_shared<args_parse::FloatKeyValue>(u8"--path", u8"源代码目录");
|
||||
args_mode << std::make_shared<args_parse::FloatKeyValue>(u8"--dest", u8"生成目录");
|
||||
args_mode << std::make_shared<args_parse::FloatOption>(u8"--html", u8"生成html文件格式取代AST", true);
|
||||
args_parser.loadMode(0x000Bu, args_mode);
|
||||
|
||||
|
||||
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() << args_parser.helpDoc();
|
||||
break;
|
||||
case 0xBu:
|
||||
{
|
||||
auto src_dir = dynamic_pointer_cast<FloatKeyValue>(p_result->getUnitViaKey(u8"path"));
|
||||
auto dst_dir = dynamic_pointer_cast<FloatKeyValue>(p_result->getUnitViaKey(u8"dest"));
|
||||
auto html_opt = dynamic_pointer_cast<FloatOption>(p_result->getUnitViaKey(u8"html"));
|
||||
auto parse_result = args_parser.parse(argc, argv);
|
||||
switch (std::get<0>(parse_result)) {
|
||||
case 0xBu: {
|
||||
auto args = std::get<1>(parse_result);
|
||||
auto src_dir = std::dynamic_pointer_cast<args_parse::FloatKeyValue>(args_mode[1]);
|
||||
auto dst_dir = std::dynamic_pointer_cast<args_parse::FloatKeyValue>(args_mode[2]);
|
||||
auto html_opt = std::dynamic_pointer_cast<args_parse::FloatOption>(args_mode[3]);
|
||||
|
||||
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<const ast_gen::ElementAccess> access_ptr = nullptr;
|
||||
if (files.size()) {
|
||||
try {
|
||||
auto parser = make_shared<NovelParser>();
|
||||
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<printer::AstGenerate>(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;
|
||||
auto source_dir = QDir(src_dir->value());
|
||||
if (!source_dir.exists()) {
|
||||
std::cout << "%编译指定的源代码目录不存在!" << std::endl;
|
||||
exit(0);
|
||||
}
|
||||
auto destination_dir = QDir::current();
|
||||
auto target_output = dst_dir->value();
|
||||
if (!target_output.isEmpty() && QDir(target_output).exists()) {
|
||||
destination_dir = QDir(target_output);
|
||||
}
|
||||
else {
|
||||
std::cout << "%编译指定的生成目录不存在,重置为:" << destination_dir.absolutePath().toLocal8Bit().data() << std::endl;
|
||||
}
|
||||
|
||||
auto files = source_dir.entryInfoList(QStringList() << "*.story");
|
||||
std::shared_ptr<const ast_gen::ElementAccess> access_ptr = nullptr;
|
||||
if (files.size()) {
|
||||
try {
|
||||
auto parser = std::make_shared<NovelParser>();
|
||||
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 = std::make_shared<printer::AstGenerate>(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;
|
||||
case 0xAu:
|
||||
default: {
|
||||
std::cout << "nsc(WsNovelStoryCompiler:故事线编译器)" << std::endl;
|
||||
std::cout << "版本:V1.0.0" << std::endl;
|
||||
std::cout << "nsc --path path-to-dir --dest path-to-output [--html]" << std::endl;
|
||||
std::cout << "nsc --help" << std::endl;
|
||||
}break;
|
||||
}
|
||||
//return a.exec();
|
||||
return 0;
|
||||
|
|
Loading…
Reference in New Issue