QtNovelUI/libParse/XSyntaxBase.h

258 lines
6.5 KiB
C
Raw Normal View History

2022-11-17 08:26:05 +00:00
#pragma once
#include <QString>
#include <QList>
#include <QHash>
#include <functional>
#include "LexFoundation.h"
#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,
std::function<ParseResult(const QList<Lex::LexResult>&, int)>);
virtual ~ParseRule() = default;
int level() const;
QString name() const;
void setEnable(bool v);
void addExpression(const QString &name, const QList<Defines::Elm> &_defines);
std::tuple<bool, int> tokensMatch(const QList<Lex::LexResult> &token) const;
ParseResult syntaxTrigger(const QList<Lex::LexResult>& srcs, int count);
private:
bool enable_state;
XSyntaxBase *const host_ins;
int level_store;
QString name_store;
QList<Expression*> expression_list;
std::function<ParseResult(const QList<Lex::LexResult>&, int)> exc_store;
};
/**
* @brief
*/
enum class MatchType
{
Outline,
Entirely
};
/**
* .
*/
class XSyntaxBase : public Syntax::SyntaxParser
{
public:
explicit XSyntaxBase(const QString &section, MatchType type = MatchType::Entirely);
Expression* get_expression(const QString &name);
Element *get_element(const QString &name);
// 通过 Parse::SyntaxParser 继承
virtual void docActive(Parse::Result::DocCore *ins) override;
virtual Parse::Result::DocCore *docRef() const override;
virtual bool applied(const QList<Lex::LexResult>& seqs) override;
virtual void reset() override;
virtual ParseResult parse(QList<Lex::LexResult>& seqs) override;
virtual QList<Syntax::SyntaxParser*> children() const override;
virtual Parse::Result::DesNode * currNode() const override;
protected:
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);
Expression* set_common_expression(const QString &name, const QList<Defines::Elm> &defines);
void resetMatch(MatchType mtype);
private:
MatchType target_type;
QString section_name;
int current_level;
Parse::Result::DesNode *current_node;
Parse::Result::DocCore *src_ref;
QHash<QString, Element*> elements_store;
QHash<QString, Expression*> expressions_store;
QList<Syntax::SyntaxParser*> child_parsers;
QHash<QString, ParseRule*> rule_collect;
};
}