diff --git a/libSyntax/syntax_novel.cpp b/libSyntax/syntax_novel.cpp index 2450d67..779ba80 100644 --- a/libSyntax/syntax_novel.cpp +++ b/libSyntax/syntax_novel.cpp @@ -29,13 +29,25 @@ auto newl = std::make_shared(); // MatchRule #define MR(x) std::make_shared(x) // Buffer -#define Buff QList>() +#define Rules QList> // Option #define OptMulT(token) std::make_shared(MR(token), 0, INT_MAX) #define OptMulR(rule) std::make_shared(rule, 0, INT_MAX) // multi+ #define MultiR(rule) std::make_shared(rule, 1, INT_MAX) + +QList> LinesMerge(const QList>& mbrs) { + QList> values_ret; + for (auto& item : mbrs) { + values_ret << item << OptMulT(newl); + } + return values_ret; +} +QList> LinesMerge(std::shared_ptr item) { + return QList>() << item << OptMulT(newl); +} + // remove-return auto remove_nl = [](const ExprRule::TokenSeqs& p)->ExprRule::TokenSeqs { ExprRule::TokenSeqs result; @@ -50,51 +62,50 @@ auto remove_nl = [](const ExprRule::TokenSeqs& p)->ExprRule::TokenSeqs { return result; }; -auto decl_comp = std::make_shared(Buff << MR(numbers) << MR(vtext) << MR(ntext) << MR(split)); -auto decl_expr = ExprRule(u8"decl_section", (int)NovelExprs::DESC_SECTION) -.reloadRule(remove_nl, std::make_shared(Buff << MultiR(decl_comp) << OptMulT(newl))); +auto decl_comp = std::make_shared(Rules{MR(numbers), MR(vtext), MR(ntext), MR(split)}); +auto decl_expr = ExprRule(u8"decl_section", (int)NovelExprs::DESC_SECTION).reloadRule(remove_nl, + std::make_shared(LinesMerge(MultiR(decl_comp)) +)); -auto fragment_decl = ExprRule(u8"fragment_define", (int)NovelExprs::FRAG_DEFINES) -.reloadRule(remove_nl, std::make_shared(Buff - << MR(leftb) << OptMulT(newl) << MR(frags) << OptMulT(newl) << MR(ntext) << OptMulT(newl) - << OptMulR(decl_expr) << MR(rightb) << OptMulT(newl))); +auto fragment_decl = ExprRule(u8"fragment_define", (int)NovelExprs::FRAG_DEFINES).reloadRule(remove_nl, std::make_shared( + LinesMerge(Rules{MR(leftb), MR(frags), MR(ntext)}) << + OptMulR(decl_expr) << + LinesMerge(MR(rightb)) +)); -auto fragment_refer = ExprRule(u8"fragment_refer", (int)NovelExprs::FRAG_REFERS) -.reloadRule(remove_nl, std::make_shared(Buff - << MR(leftb) << OptMulT(newl) << MR(refers) << OptMulT(newl) << MR(frags) << OptMulT(newl) - << MR(ntext) << OptMulT(newl) << MR(split) << OptMulT(newl) << MR(ntext) << OptMulT(newl) - << OptMulR(decl_expr) << MR(rightb) << OptMulT(newl))); +auto fragment_refer = ExprRule(u8"fragment_refer", (int)NovelExprs::FRAG_REFERS).reloadRule(remove_nl, std::make_shared( + LinesMerge(Rules{MR(leftb), MR(refers), MR(frags), MR(ntext), MR(split), MR(ntext)}) << + OptMulR(decl_expr) << + LinesMerge(MR(rightb)) +)); -auto fragment_comp = std::make_shared(Buff << fragment_decl << fragment_refer << decl_expr); - -auto story_define = -ExprRule(u8"story_define", (int)NovelExprs::STORY_DEFINES) -.reloadRule(remove_nl, std::make_shared(Buff << OptMulT(newl) - << MR(leftb) << OptMulT(newl) << MR(story) << OptMulT(newl) << MR(numbers) << OptMulT(newl) << MR(ntext) << OptMulT(newl) - << OptMulR(fragment_comp) << MR(rightb) << OptMulT(newl))); +auto fragment_comp = std::make_shared(Rules{fragment_decl, fragment_refer, decl_expr}); +auto story_define = ExprRule(u8"story_define", (int)NovelExprs::STORY_DEFINES).reloadRule(remove_nl, std::make_shared( + LinesMerge(Rules{ MR(leftb), MR(story), MR(numbers), MR(ntext)}) << + OptMulR(fragment_comp) << + LinesMerge(MR(rightb)) +)); // =================================================================== -auto article_decl = -ExprRule(u8"article_define", (int)NovelExprs::ARTICLE_DEFINE) -.reloadRule(remove_nl, std::make_shared( - Buff << MR(leftb) << OptMulT(newl) << MR(article) << OptMulT(newl) << MR(ntext) << OptMulT(newl) - << OptMulR(std::make_shared(Buff << fragment_refer << decl_expr)) - << MR(rightb) << OptMulT(newl))); +auto article_decl = ExprRule(u8"article_define", (int)NovelExprs::ARTICLE_DEFINE).reloadRule(remove_nl, std::make_shared( + LinesMerge(Rules{ MR(leftb), MR(article), MR(ntext)}) << + OptMulR(std::make_shared(Rules{ fragment_refer, decl_expr })) << + LinesMerge(MR(rightb)) +)); -auto volume_decl = -ExprRule(u8"volume_define", (int)NovelExprs::VOLUME_DEFINE) -.reloadRule(remove_nl, - std::make_shared(Buff << OptMulT(newl) - << MR(leftb) << OptMulT(newl) << MR(volume) << OptMulT(newl) << MR(ntext) << OptMulT(newl) - << OptMulR(std::make_shared(Buff << decl_expr << article_decl)) - << MR(rightb) << OptMulT(newl))); +auto volume_decl = ExprRule(u8"volume_define", (int)NovelExprs::VOLUME_DEFINE).reloadRule(remove_nl, std::make_shared( + LinesMerge(Rules{ MR(leftb), MR(volume), MR(ntext)}) << + OptMulR(std::make_shared(Rules{ decl_expr, article_decl })) << + LinesMerge(MR(rightb)) +)); -auto document_define = -ExprRule(u8"decls-doc", (int)NovelExprs::DOC_DEFINES) -.reloadRule(remove_nl, std::make_shared(std::make_shared(Buff << story_define << volume_decl), 1, INT_MAX)); +auto document_define = ExprRule(u8"decls-doc", (int)NovelExprs::DOC_DEFINES).reloadRule(remove_nl, std::make_shared( + Rules{ + OptMulT(newl), + MultiR(std::make_shared(Rules{story_define, volume_decl})) + } +)); std::shared_ptr NovalSyntax::getParseTree() { return document_define; } - - std::shared_ptr NovalSyntax::getLexReader() { auto inst = std::make_shared(QList>()