QtNovelUI/DesParser/XSyntaxBase.h

257 lines
6.5 KiB
C
Raw Normal View History

2022-11-06 00:37:50 +00:00
#pragma once
#include <QString>
#include <QList>
#include <QHash>
2022-11-06 11:40:11 +00:00
#include "LexFoundation.h"
2022-11-06 00:37:50 +00:00
#include "SyntaxBase.h"
namespace Syntax
{
/**
*
*/
namespace Defines
{
/**
* @brief
*/
enum class DefType
{
ELEMENT,
EXPRESSION
};
/**
* .
*/
class Elm
{
public:
explicit Elm(const QString &alias_name, bool tail_mark = false);
virtual ~Elm() = default;
/**
* .
*
* \return
*/
QString aliasName() const;
/**
* .
*
* \return
*/
QString refer() const;
/**
* .
*
* \return
*/
virtual DefType type() const;
/**
* .
*
* \return
*/
bool isTail() const;
private:
QString name_store;
bool tail_mark;
protected:
DefType type_define;
};
/**
* .
*/
class Exp : public Elm
{
public:
explicit Exp(const QString &alias_name, bool tail_mark = false);
virtual ~Exp() = default;
virtual DefType type() const override;
};
}
/**
* token校验.
*/
class Element
{
public:
typedef bool rst_mark;
typedef int match_len;
explicit Element(const QString &token);
virtual ~Element() = default;
QString name() const;
virtual Defines::DefType type() const;
/**
* .
*
* \param tokens
* \param offset
* \return tuple()
*/
virtual std::tuple<rst_mark, match_len>
elementCheck(const QList<Lex::LexResult> &tokens, int offset) const;
private:
QString value_store;
};
/**
* @brief
*/
class Link
{
public:
Link(const QString &alias, Element *elm);
virtual ~Link() = default;
static QString name(const QString &s);
QString aliasName() const;
QString refer() const;
Element* host() const;
bool tailTest() const;
void markTail(bool v);
void appendNext(Link* ins);
QList<Link*> nextElements() const;
virtual std::tuple<Element::rst_mark, Element::match_len>
linkCheck(const QList<Lex::LexResult> &tokens, int offset) const;
private:
QString alias_name;
Element *const host_ins;
bool tail_mark;
QList<Link*> next_inss;
};
/**
* @brief
*/
class Expression : public Element
{
public:
explicit Expression(const QString &name);
virtual ~Expression() = default;
Link* parseFlow() const;
void resetLinks(Link* entry);
virtual Defines::DefType type() const override;
/**
* .
*
* \param tokens
* \param offset
* \return tuple()
*/
virtual std::tuple<rst_mark, match_len>
elementCheck(const QList<Lex::LexResult> &tokens, int offset) const override;
private:
QString name_store;
Link* chain_store;
};
class XSyntaxBase;
/**
* @brief
*/
class ParseRule
{
public:
ParseRule(XSyntaxBase *host, const QString &rule_name, unsigned short level,
2022-11-06 11:40:11 +00:00
std::function<ParseResult(const QList<Lex::LexResult>&, int)>);
2022-11-06 00:37:50 +00:00
virtual ~ParseRule() = default;
int level() const;
QString name() const;
void setEnable(bool v);
2022-11-06 00:37:50 +00:00
void addExpression(const QString &name, const QList<Defines::Elm> &_defines);
2022-11-06 10:15:55 +00:00
std::tuple<bool, int> tokensMatch(const QList<Lex::LexResult> &token) const;
2022-11-06 11:40:11 +00:00
ParseResult syntaxTrigger(const QList<Lex::LexResult>& srcs, int count);
2022-11-06 00:37:50 +00:00
private:
bool enable_state;
2022-11-06 00:37:50 +00:00
XSyntaxBase *const host_ins;
int level_store;
QString name_store;
QList<Expression*> expression_list;
2022-11-06 11:40:11 +00:00
std::function<ParseResult(const QList<Lex::LexResult>&, int)> exc_store;
2022-11-06 00:37:50 +00:00
};
2022-11-06 10:15:55 +00:00
/**
* @brief
*/
enum class MatchType
{
Outline,
2022-11-06 10:15:55 +00:00
Entirely
};
2022-11-06 00:37:50 +00:00
/**
* .
*/
2022-11-06 11:40:11 +00:00
class XSyntaxBase : public Syntax::SyntaxParser
2022-11-06 00:37:50 +00:00
{
public:
2022-11-06 10:15:55 +00:00
explicit XSyntaxBase(const QString &section, MatchType type = MatchType::Entirely);
2022-11-06 00:37:50 +00:00
Expression* get_expression(const QString &name);
Element *get_element(const QString &name);
// 通过 Parse::SyntaxParser 继承
2022-11-06 11:40:11 +00:00
virtual void docActive(Parse::Result::DocCore *ins) override;
virtual Parse::Result::DocCore *docRef() const override;
2022-11-06 00:37:50 +00:00
virtual bool applied(const QList<Lex::LexResult>& seqs) override;
virtual void reset() override;
2022-11-06 11:40:11 +00:00
virtual ParseResult parse(QList<Lex::LexResult>& seqs) override;
virtual QList<Syntax::SyntaxParser*> children() const override;
2022-11-06 00:37:50 +00:00
2022-11-06 11:40:11 +00:00
virtual Parse::Result::DesNode * currNode() const override;
2022-11-06 00:37:50 +00:00
protected:
2022-11-06 11:40:11 +00:00
ParseRule* addRule(const QString &name, unsigned short level, std::function<ParseResult(const QList<Lex::LexResult>&, int)> exc);
virtual void addChild(QList<Syntax::SyntaxParser*> parsers) override;
void refocusNode(Parse::Result::DesNode *ins);
2022-11-06 00:37:50 +00:00
2022-11-06 10:15:55 +00:00
Expression* set_common_expression(const QString &name, const QList<Defines::Elm> &defines);
void resetMatch(MatchType mtype);
2022-11-06 10:15:55 +00:00
2022-11-06 00:37:50 +00:00
private:
2022-11-06 10:15:55 +00:00
MatchType target_type;
2022-11-06 00:37:50 +00:00
QString section_name;
int current_level;
2022-11-06 11:40:11 +00:00
Parse::Result::DesNode *current_node;
Parse::Result::DocCore *src_ref;
2022-11-06 00:37:50 +00:00
QHash<QString, Element*> elements_store;
QHash<QString, Expression*> expressions_store;
2022-11-06 11:40:11 +00:00
QList<Syntax::SyntaxParser*> child_parsers;
2022-11-06 00:37:50 +00:00
QHash<QString, ParseRule*> rule_collect;
};
}