WsParser_VS/libSyntax/ast_novel.h

334 lines
7.7 KiB
C
Raw Permalink Normal View History

2024-03-17 07:58:28 +00:00
#pragma once
2025-02-07 15:26:20 +00:00
#include "ast_basic.h"
#include "libsyntax.h"
2025-02-08 01:06:39 +00:00
#include <QtCore/QHash>
#include <QtCore/QString>
namespace ast_gen {
class TokenAccess;
/**
2025-02-11 14:32:10 +00:00
* @brief
2025-02-08 01:06:39 +00:00
*/
class SyntaxElement {
public:
virtual ~SyntaxElement() = default;
/**
2025-02-11 14:32:10 +00:00
* .
2025-02-08 01:06:39 +00:00
*
2025-02-11 14:32:10 +00:00
* \return
2025-02-08 01:06:39 +00:00
*/
virtual std::shared_ptr<const ast_basic::IExprInstance> bindExpression() const = 0;
/**
2025-02-11 14:32:10 +00:00
* @brief
2025-02-08 01:06:39 +00:00
* @return
*/
virtual int typeMark() const = 0;
/**
2025-02-11 14:32:10 +00:00
* .
2025-02-08 01:06:39 +00:00
*
2025-02-11 14:32:10 +00:00
* \return
2025-02-08 01:06:39 +00:00
*/
virtual bool isAnonymous() const = 0;
/**
2025-02-11 14:32:10 +00:00
* @brief
2025-02-08 01:06:39 +00:00
* @return
*/
virtual QString path() const = 0;
/**
2025-02-11 14:32:10 +00:00
* @brief
2025-02-08 01:06:39 +00:00
* @return
*/
virtual QString signature() const = 0;
2025-03-01 13:15:15 +00:00
/**
* @brief Ast深度
* @return depth
*/
virtual int depth() const = 0;
2025-02-08 01:06:39 +00:00
/**
2025-02-11 14:32:10 +00:00
* @brief
* @return parentnullptr
2025-02-08 01:06:39 +00:00
*/
virtual std::weak_ptr<const SyntaxElement> parent() const = 0;
/**
2025-02-11 14:32:10 +00:00
* @brief Token集合
2025-02-08 01:06:39 +00:00
* @return
*/
virtual QList<std::shared_ptr<const TokenAccess>> selfTokens() const = 0;
};
/**
2025-02-11 14:32:10 +00:00
* @brief 访
2025-02-08 01:06:39 +00:00
*/
class LIBSYNTAX_EXPORT ElementAccess {
private:
std::shared_ptr<const SyntaxElement> peers;
public:
ElementAccess(std::shared_ptr<const SyntaxElement> point);
std::shared_ptr<const SyntaxElement> element() const;
QList<std::shared_ptr<const ElementAccess>> children() const;
/**
2025-02-11 14:32:10 +00:00
* @brief Token定义
2025-02-08 01:06:39 +00:00
* @return
*/
virtual QList<std::shared_ptr<const TokenAccess>> tokens() const;
};
/**
2025-02-11 14:32:10 +00:00
* @brief Token元素访问接口
2025-02-08 01:06:39 +00:00
*/
class LIBSYNTAX_EXPORT TokenAccess {
private:
std::shared_ptr<const ast_gen::SyntaxElement> element_bind;
std::shared_ptr<const lib_token::IToken> token_store;
public:
TokenAccess(std::shared_ptr<const ast_gen::SyntaxElement> elm_inst, std::shared_ptr<const lib_token::IToken> token_inst);
virtual std::shared_ptr<const ast_gen::SyntaxElement> bind() const;
virtual std::shared_ptr<const lib_token::IToken> token() const;
};
}
2024-03-17 07:58:28 +00:00
2025-02-02 14:06:49 +00:00
namespace example_novel {
enum class NovelNode {
GlobalElement = 0,
TextSection = 1,
2025-03-29 09:53:28 +00:00
FragmentRefers = 2,
FragmentSlice = 3,
StoryDefine = 4,
Document = 5,
ArticleDefine = 6,
VolumeDefine = 7,
RankDeclaration = 8,
};
2025-02-07 15:26:20 +00:00
/*
GlobalElement
\-Document
|-RankDeclaration
|-StoryDefine
| |-TextSection
| \-FragmentSlice
| |-TextSection
2025-03-29 09:53:28 +00:00
| \-FragmentRefers
2025-02-07 15:26:20 +00:00
| \-TextSection
\-VolumeDefine
|-TextSection
\-ArticleDefine
|-TextSection
2025-03-29 09:53:28 +00:00
\-FragmentRefers
2025-02-07 15:26:20 +00:00
\-TextSection
*/
template<NovelNode type, bool named>
class AbstractImpl : public ast_basic::ExprInstance, public ast_gen::SyntaxElement {
public:
2025-02-07 15:26:20 +00:00
AbstractImpl(std::shared_ptr<const lib_syntax::ExprRule> rule_bind)
: ExprInstance(rule_bind) {
}
2025-02-11 14:32:10 +00:00
// 通过 SyntaxElement 继承
2025-02-07 15:26:20 +00:00
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();
}
2025-03-01 13:15:15 +00:00
int depth() const {
return parent().lock()->depth() + 1;
}
2025-02-07 15:26:20 +00:00
virtual std::weak_ptr<const ast_gen::SyntaxElement> parent() const override {
2025-02-15 15:47:42 +00:00
return std::dynamic_pointer_cast<const ast_gen::SyntaxElement>(ExprInstance::parentExpr().lock());
2025-02-07 15:26:20 +00:00
}
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));
}
2025-02-07 15:26:20 +00:00
return values;
}
};
2025-02-07 15:26:20 +00:00
/**
2025-02-11 14:32:10 +00:00
* @brief
2025-02-07 15:26:20 +00:00
*/
class LIBSYNTAX_EXPORT TextSection : public AbstractImpl<NovelNode::TextSection, false> {
public:
TextSection(std::shared_ptr<const lib_syntax::ExprRule> rule_bind);
2025-02-07 15:26:20 +00:00
/**
2025-02-11 14:32:10 +00:00
* @brief
2025-02-07 15:26:20 +00:00
*/
QString content() const;
2025-02-11 14:32:10 +00:00
// 通过 AbstractImpl 继承
virtual QString signature() const override;
};
2025-02-07 15:26:20 +00:00
/**
2025-03-29 09:53:28 +00:00
* @brief
2025-02-07 15:26:20 +00:00
*/
class LIBSYNTAX_EXPORT FragmentSlice : public AbstractImpl<NovelNode::FragmentSlice, true> {
private:
QString _slice_name;
2025-02-04 14:26:34 +00:00
public:
2025-02-07 15:26:20 +00:00
FragmentSlice(std::shared_ptr<const lib_syntax::ExprRule> rule);
QString name() const;
void setName(const QString& nm);
2025-02-11 14:32:10 +00:00
// 通过 AbstractImpl 继承
2025-02-04 14:26:34 +00:00
QString signature() const override;
};
2025-02-07 15:26:20 +00:00
/**
2025-03-29 09:53:28 +00:00
* @brief
2025-02-07 15:26:20 +00:00
*/
2025-03-29 09:53:28 +00:00
class LIBSYNTAX_EXPORT FragmentRefers : public AbstractImpl<NovelNode::FragmentRefers, false> {
2025-02-04 14:26:34 +00:00
private:
2025-03-29 09:53:28 +00:00
QString story_refs, slice_ref;
2025-02-04 14:26:34 +00:00
public:
2025-03-29 09:53:28 +00:00
FragmentRefers(std::shared_ptr<const lib_syntax::ExprRule> rule_bind);
QString storyRefer() const;
2025-02-02 14:06:49 +00:00
void setStoryRefer(const QString& refer);
2024-07-28 08:37:31 +00:00
2025-02-04 14:26:34 +00:00
QString sliceRefer() const;
void setSliceRefer(const QString& refer);
QString referSignature() const;
2025-02-11 14:32:10 +00:00
// 通过 AbstractImpl 继承
virtual QString signature() const override;
};
2025-02-07 15:26:20 +00:00
/**
2025-02-11 14:32:10 +00:00
* @brief
2025-02-07 15:26:20 +00:00
*/
class LIBSYNTAX_EXPORT ArticleDefine : public AbstractImpl<NovelNode::ArticleDefine, true> {
public:
ArticleDefine(std::shared_ptr<const lib_syntax::ExprRule> rule_bind);
QString name() const;
2025-02-02 14:06:49 +00:00
void setName(const QString& nm);
2025-02-11 14:32:10 +00:00
// 通过 AbstractImpl 继承
virtual QString signature() const override;
private:
QString name_store;
};
2025-02-07 15:26:20 +00:00
/**
2025-02-11 14:32:10 +00:00
* @brief
2025-02-07 15:26:20 +00:00
*/
class LIBSYNTAX_EXPORT VolumeDefine : public AbstractImpl<NovelNode::VolumeDefine, true> {
public:
VolumeDefine(std::shared_ptr<const lib_syntax::ExprRule> rule_bind);
QString name() const;
2025-02-02 14:06:49 +00:00
void setName(const QString& nm);
2025-02-11 14:32:10 +00:00
// 通过 AbstractImpl 继承
virtual QString signature() const override;
2024-07-13 05:17:56 +00:00
private:
QString name_store;
};
2025-02-07 15:26:20 +00:00
/**
2025-02-11 14:32:10 +00:00
* @brief
2025-02-07 15:26:20 +00:00
*/
class LIBSYNTAX_EXPORT StoryDefine : public AbstractImpl<NovelNode::StoryDefine, true> {
public:
StoryDefine(std::shared_ptr<const lib_syntax::ExprRule> rule_bind);
QString name() const;
2025-02-02 14:06:49 +00:00
void setName(const QString& nm);
2024-07-28 08:37:31 +00:00
void setSort(int value);
int sort() const;
2025-02-11 14:32:10 +00:00
// 通过 AbstractImpl 继承
virtual QString signature() const override;
private:
QString name_store;
int sort_index;
};
2025-02-07 15:26:20 +00:00
/**
2025-02-11 14:32:10 +00:00
* @brief
2025-02-07 15:26:20 +00:00
*/
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;
2024-07-28 08:37:31 +00:00
void setRank(int nums);
2025-02-11 14:32:10 +00:00
// 通过 AbstractImpl 继承
QString signature() const override;
};
2024-07-13 05:17:56 +00:00
2025-02-07 15:26:20 +00:00
/**
2025-02-11 14:32:10 +00:00
* @brief
2025-02-07 15:26:20 +00:00
*/
class LIBSYNTAX_EXPORT Document : public AbstractImpl<NovelNode::Document, false> {
2024-07-13 05:17:56 +00:00
public:
2025-02-07 15:26:20 +00:00
Document(std::shared_ptr<const lib_syntax::ExprRule> rule_bind);
2024-07-13 05:17:56 +00:00
2025-02-11 14:32:10 +00:00
// 通过 AbstractImpl 继承
2025-02-07 15:26:20 +00:00
virtual QString signature() const override;
};
2024-07-13 05:17:56 +00:00
2025-02-08 01:06:39 +00:00
/**
2025-02-11 14:32:10 +00:00
* @brief
2025-02-08 01:06:39 +00:00
*/
2025-02-07 15:26:20 +00:00
class LIBSYNTAX_EXPORT NGlobalElement : public ast_basic::ExprProgram, public ast_gen::SyntaxElement {
2025-02-15 15:47:42 +00:00
private:
QList<QString> _errors_store;
2025-02-07 15:26:20 +00:00
public:
2025-02-15 15:47:42 +00:00
NGlobalElement(const QString& root);
void appendError(const QList<QString>& errors);
QList<QString> errors() const;
2024-07-13 05:17:56 +00:00
2025-02-11 14:32:10 +00:00
// 通过 SyntaxElement 继承
2025-02-07 15:26:20 +00:00
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;
2025-03-01 13:15:15 +00:00
int depth() const override;
2025-02-07 15:26:20 +00:00
std::weak_ptr<const SyntaxElement> parent() const override;
QList<std::shared_ptr<const ast_gen::TokenAccess>> selfTokens() const override;
2024-07-13 05:17:56 +00:00
};
}