#include "ast_novel.h" using namespace example_novel; TextSection::TextSection(const QString& text, const QString path, std::shared_ptr parent) : content_store(text), file_path(path), pnode_store(parent) {} QString example_novel::TextSection::content() const { return this->content_store; } int TextSection::typeMark() const { return (int)NovelNode::TextSection; } bool example_novel::TextSection::isAnonymous() const { return true; } QString TextSection::path() const { return file_path; } QString TextSection::signature() const { return u8"::section"; } std::shared_ptr TextSection::parent() const { return pnode_store; } QList > TextSection::selfTokens() const { return TokenSL::selfTokens(); } FragmentRefers::FragmentRefers(const QString& story, const QString& fragment, const QString& path, std::shared_ptr parent) : story_ref(story), fragm_ref(fragment), path_store(path), pnode_store(parent) {} QString FragmentRefers::storyRefer() const { return story_ref; } QString FragmentRefers::fragmentRefer() const { return fragm_ref; } QString FragmentRefers::referSignature() const { return story_ref + u8"&" + fragm_ref; } int FragmentRefers::typeMark() const { return (int)NovelNode::FragmentRefer; } bool example_novel::FragmentRefers::isAnonymous() const { return true; } QString FragmentRefers::path() const { return path_store; } QString FragmentRefers::signature() const { QString signature = u8"@" + storyRefer() + u8"&" + fragmentRefer(); return parent()->signature() + signature; } std::shared_ptr FragmentRefers::parent() const { return pnode_store; } QList > FragmentRefers::selfTokens() const { return TokenSL::selfTokens(); } FragmentDefine::FragmentDefine(const QString& name, const QString& path, std::shared_ptr parent) : name_store(name), path_store(path), pnode_store(parent) {} QString FragmentDefine::name() const { return name_store; } int FragmentDefine::typeMark() const { return (int)NovelNode::FragmentDefine; } bool example_novel::FragmentDefine::isAnonymous() const { return false; } QString FragmentDefine::path() const { return path_store; } QString FragmentDefine::signature() const { return parent()->signature() + u8"&" + name(); } std::shared_ptr FragmentDefine::parent() const { return pnode_store; } QList > FragmentDefine::selfTokens() const { return TokenSL::selfTokens(); } StoryDefine::StoryDefine(const QString name, int sort, const QString path, std::shared_ptr parent) : name_store(name), sort_index(sort), path_store(path), pnode_store(parent) {} QString StoryDefine::name() const { return name_store; } int StoryDefine::sort() const { return sort_index; } int StoryDefine::typeMark() const { return (int)NovelNode::StoryDefine; } bool example_novel::StoryDefine::isAnonymous() const { return false; } QString StoryDefine::path() const { return path_store; } QString StoryDefine::signature() const { return name_store; } std::shared_ptr StoryDefine::parent() const { return pnode_store; } QList > StoryDefine::selfTokens() const { return TokenSL::selfTokens(); } #include "syntax_novel.h" std::shared_ptr NovelExprsVisitor::visit(std::shared_ptr expr, std::shared_ptr pnode) const { auto tidy_tokens = [&](std::shared_ptr expr) { auto vtokens = expr->tokens(); for (auto& cld : expr->exprNodes()) { auto remove_tokens = cld->tokens(); for (auto& rit : remove_tokens) vtokens.removeAll(rit); } return vtokens; }; switch (expr->defined()->typeMark()) { case example_novel::NovelExprs::DOC_DEFINES: return std::make_shared(expr->filePath(), pnode); case example_novel::NovelExprs::STORY_DEFINES: { auto name = expr->tokens().at(3)->content(); auto sort = expr->tokens().at(2)->content().toInt(); auto rinst = std::make_shared(name, sort, expr->filePath(), pnode); rinst->appendDefinedTokens(rinst, tidy_tokens(expr)); return rinst; } case example_novel::NovelExprs::FRAG_DEFINES: { auto name = expr->tokens().at(2)->content(); auto inst = std::make_shared(name, expr->filePath(), pnode); inst->appendDefinedTokens(inst, tidy_tokens(expr)); return inst; } case example_novel::NovelExprs::FRAG_REFERS: { auto fragm_ref = expr->tokens().at(3)->content(); auto story_ref = expr->tokens().at(5)->content(); auto inst = std::make_shared(story_ref, fragm_ref, expr->filePath(), pnode); inst->appendDefinedTokens(inst, tidy_tokens(expr)); return inst; } case example_novel::NovelExprs::DESC_SECTION: { QString content = u8""; for (auto& t : expr->tokens()) content += t->content(); auto inst = std::make_shared(content, expr->filePath(), pnode); inst->appendDefinedTokens(inst, tidy_tokens(expr)); return inst; } case example_novel::NovelExprs::ARTICLE_DEFINE: { auto name = expr->tokens().at(2)->content(); auto inst = std::make_shared(name, expr->filePath(), pnode); inst->appendDefinedTokens(inst, tidy_tokens(expr)); return inst; } case example_novel::NovelExprs::VOLUME_DEFINE: { auto name = expr->tokens().at(2)->content(); auto inst = std::make_shared(name, expr->filePath(), pnode); inst->appendDefinedTokens(inst, tidy_tokens(expr)); return inst; } default: throw new lib_syntax::SyntaxException(u8"InternalError[0x0003]ÀàÐÍÆ¥Åä´íÎó"); } } Document::Document(const QString& path, std::shared_ptr pnode) : path_store(path), pnode_store(pnode) {} int Document::typeMark() const { return (int)NovelNode::Document; } bool example_novel::Document::isAnonymous() const { return true; } QString Document::path() const { return path_store; } QString Document::signature() const { return QString(u8"::document<%1>").arg(path()); } std::shared_ptr Document::parent() const { return pnode_store; } QList > Document::selfTokens() const { return QList>(); } void TokenSL::appendDefinedTokens(std::shared_ptr elm, QList> tokens) { QList> access; for (auto& t : tokens) this->tokens_store << std::make_shared(elm, t); } QList > TokenSL::selfTokens() const { return tokens_store; } VolumeDefine::VolumeDefine(const QString& name, const QString& path, std::shared_ptr parent) : name_store(name), path_store(path), pnode_store(parent) {} QString VolumeDefine::name() const { return name_store; } int VolumeDefine::typeMark() const { return (int)NovelNode::VolumeDefine; } bool example_novel::VolumeDefine::isAnonymous() const { return false; } QString VolumeDefine::path() const { return path_store; } QString VolumeDefine::signature() const { return name(); } std::shared_ptr VolumeDefine::parent() const { return pnode_store; } QList > VolumeDefine::selfTokens() const { return TokenSL::selfTokens(); } ArticleDefine::ArticleDefine(const QString& name, const QString& path, std::shared_ptr parent) : name_store(name), path_store(path), pnode_store(parent) {} QString ArticleDefine::name() const { return name_store; } int ArticleDefine::typeMark() const { return (int)NovelNode::ArticleDefine; } bool example_novel::ArticleDefine::isAnonymous() const { return false; } QString ArticleDefine::path() const { return path_store; } QString ArticleDefine::signature() const { return parent()->signature() + u8"&" + name(); } std::shared_ptr ArticleDefine::parent() const { return pnode_store; } QList > ArticleDefine::selfTokens() const { return TokenSL::selfTokens(); }