WsParser_VS/libSyntax/ast_novel.h

254 lines
5.9 KiB
C++

#pragma once
#include "ast_access.h"
#include "ast_basic.h"
#include "libsyntax.h"
namespace example_novel {
enum class NovelNode {
GlobalElement = 0,
TextSection = 1,
PointRefers = 2,
PointDefines = 3,
StoryDefine = 4,
Document = 5,
ArticleDefine = 6,
VolumeDefine = 7,
RankDeclaration = 8,
FragmentSlice = 9,
};
/*
GlobalElement
\-Document
|-RankDeclaration
|-StoryDefine
| |-TextSection
| \-FragmentSlice
| |-TextSection
| |-PointDefines
| | \-TextSection
| \-PointRefers
| \-TextSection
\-VolumeDefine
|-TextSection
\-ArticleDefine
|-TextSection
\-PointRefers
\-TextSection
*/
template<NovelNode type, bool named>
class AbstractImpl : public ast_basic::ExprInstance, public ast_gen::SyntaxElement {
private:
std::weak_ptr<const SyntaxElement> parent_store;
public:
AbstractImpl(std::shared_ptr<const lib_syntax::ExprRule> rule_bind)
: ExprInstance(rule_bind) {
parent_store.reset();
}
// ͨ¹ý SyntaxElement ¼Ì³Ð
virtual int typeMark() const override {
return (int) type;
}
virtual bool isAnonymous() const override {
return !named;
}
virtual std::shared_ptr<const IExprInstance> bindExpression() const override {
return shared_from_this();
}
QString path() const override {
return ExprInstance::filePath();
}
virtual std::weak_ptr<const ast_gen::SyntaxElement> parent() const override {
return this->parent_store;
}
virtual void setParent(std::shared_ptr<const ast_gen::SyntaxElement> inst) override {
this->parent_store = inst;
}
virtual QList<std::shared_ptr<const ast_gen::TokenAccess>> selfTokens() const override {
auto tokensx = ExprInstance::tokens();
QList<std::shared_ptr<const ast_gen::TokenAccess>> values;
for (auto xit : tokensx) {
values.append(std::make_shared<ast_gen::TokenAccess>(std::dynamic_pointer_cast<const ast_gen::SyntaxElement>(shared_from_this()), xit));
}
return values;
}
};
/**
* @brief ÎÄ×Ö¶ÎÂä
*/
class LIBSYNTAX_EXPORT TextSection : public AbstractImpl<NovelNode::TextSection, false> {
public:
TextSection(std::shared_ptr<const lib_syntax::ExprRule> rule_bind);
/**
* @brief ¶ÎÂäÄÚÈÝ
*/
QString content() const;
// ͨ¹ý AbstractImpl ¼Ì³Ð
virtual QString signature() const override;
};
/**
* @brief ¹ÊÊÂÇé½Ú
*/
class LIBSYNTAX_EXPORT FragmentSlice : public AbstractImpl<NovelNode::FragmentSlice, true> {
private:
QString _slice_name;
public:
FragmentSlice(std::shared_ptr<const lib_syntax::ExprRule> rule);
QString name() const;
void setName(const QString& nm);
// ͨ¹ý AbstractImpl ¼Ì³Ð
QString signature() const override;
};
/**
* @brief ½ÚµãÒýÓö¨Òå
*/
class LIBSYNTAX_EXPORT PointRefers : public AbstractImpl<NovelNode::PointRefers, false> {
private:
QString story_refs, slice_ref, point_ref;
public:
PointRefers(std::shared_ptr<const lib_syntax::ExprRule> rule_bind);
QString storyRefer() const;
void setStoryRefer(const QString& refer);
QString sliceRefer() const;
void setSliceRefer(const QString& refer);
QString pointRefer() const;
void setPointRefer(const QString& refer);
QString referSignature() const;
// ͨ¹ý AbstractImpl ¼Ì³Ð
virtual QString signature() const override;
};
/**
* @brief ½Úµã¶¨Òå
*/
class LIBSYNTAX_EXPORT PointDefines : public AbstractImpl<NovelNode::PointDefines, true> {
private:
QString name_store;
public:
PointDefines(std::shared_ptr<const lib_syntax::ExprRule> rule_bind);
QString name() const;
void setName(const QString& nm);
// ͨ¹ý AbstractImpl ¼Ì³Ð
virtual QString signature() const override;
};
/**
* @brief Õ½ڶ¨Òå
*/
class LIBSYNTAX_EXPORT ArticleDefine : public AbstractImpl<NovelNode::ArticleDefine, true> {
public:
ArticleDefine(std::shared_ptr<const lib_syntax::ExprRule> rule_bind);
QString name() const;
void setName(const QString& nm);
// ͨ¹ý AbstractImpl ¼Ì³Ð
virtual QString signature() const override;
private:
QString name_store;
};
/**
* @brief ¾í×Ú¶¨Òå
*/
class LIBSYNTAX_EXPORT VolumeDefine : public AbstractImpl<NovelNode::VolumeDefine, true> {
public:
VolumeDefine(std::shared_ptr<const lib_syntax::ExprRule> rule_bind);
QString name() const;
void setName(const QString& nm);
// ͨ¹ý AbstractImpl ¼Ì³Ð
virtual QString signature() const override;
private:
QString name_store;
};
/**
* @brief ¹Êʶ¨Òå
*/
class LIBSYNTAX_EXPORT StoryDefine : public AbstractImpl<NovelNode::StoryDefine, true> {
public:
StoryDefine(std::shared_ptr<const lib_syntax::ExprRule> rule_bind);
QString name() const;
void setName(const QString& nm);
void setSort(int value);
int sort() const;
// ͨ¹ý AbstractImpl ¼Ì³Ð
virtual QString signature() const override;
private:
QString name_store;
int sort_index;
};
/**
* @brief ÅÅÐòÉùÃ÷
*/
class LIBSYNTAX_EXPORT RankDeclare : public AbstractImpl<NovelNode::RankDeclaration, false> {
private:
int page_rank = 0;
public:
RankDeclare(std::shared_ptr<const lib_syntax::ExprRule> rule);
int rankNumber() const;
void setRank(int nums);
// ͨ¹ý AbstractImpl ¼Ì³Ð
QString signature() const override;
};
/**
* @brief Îĵµ¶¨Òå
*/
class LIBSYNTAX_EXPORT Document : public AbstractImpl<NovelNode::Document, false> {
public:
Document(std::shared_ptr<const lib_syntax::ExprRule> rule_bind);
// ͨ¹ý AbstractImpl ¼Ì³Ð
virtual QString signature() const override;
};
class LIBSYNTAX_EXPORT NGlobalElement : public ast_basic::ExprProgram, public ast_gen::SyntaxElement {
public:
NGlobalElement(const QString &root);
// ͨ¹ý SyntaxElement ¼Ì³Ð
std::shared_ptr<const ast_basic::IExprInstance> bindExpression() const override;
int typeMark() const override;
bool isAnonymous() const override;
QString path() const override;
QString signature() const override;
std::weak_ptr<const SyntaxElement> parent() const override;
void setParent(std::shared_ptr<const SyntaxElement> inst) override;
QList<std::shared_ptr<const ast_gen::TokenAccess>> selfTokens() const override;
};
}