QtNovelUI/DesParser/SyntaxBase.h

357 lines
8.5 KiB
C
Raw Normal View History

2022-11-06 00:37:50 +00:00
#pragma once
#include <QString>
#include <functional>
#include <QList>
2022-11-06 11:40:11 +00:00
#include "LexFoundation.h"
2022-11-06 00:37:50 +00:00
#include "comndef.h"
namespace Parse
{
2022-11-06 11:40:11 +00:00
namespace Result {
class ProjectCore;
class DesNode;
class NamedNode;
class DocCore;
}
namespace Result
{
/**
* .
*/
class Words
{
public:
explicit Words(Result::DesNode* host, Result::DocCore *doc, const QString &value, int row, int col);
virtual ~Words() = default;
/**
* .
*
* \return
*/
virtual int row() const;
/**
* .
*
* \return
*/
virtual int column() const;
/**
* .
*
* \return
*/
virtual int length() const;
/**
* nullptr.
*
* \return
*/
virtual Result::DesNode* host() const;
/**
* .
*
* \return
*/
virtual Result::DocCore* doc() const;
/**
* .
*
* \return
*/
virtual QString toString() const;
private:
QString value_store;
int row_store, col_store;
Result::DesNode *desnode_store;
Result::DocCore *docpresent_store;
};
/**
* .
*/
class DesNode
{
public:
virtual ~DesNode() = default;
/**
* 0
*
* \return
*/
virtual int depth() const = 0;
/**
* .
*
* \return
*/
virtual DocCore* document() const = 0;
/**
* .
*
* \return
*/
virtual int typeValue() const = 0;
/**
* .
*
* \return
*/
virtual DesNode* parent() const = 0;
/**
*
*
* \param ins
*/
virtual void appendChild(DesNode *ins) = 0;
/**
*
*
* \return
*/
virtual QList<DesNode*> children() const = 0;
/**
* .
*
* \return true
*/
virtual bool check(QList<QString> &reasons) const = 0;
/**
* .
*
* \return
*/
virtual QString toString() const = 0;
};
/**
* .
*/
class NamedNode : public Result::DesNode
{
public:
virtual ~NamedNode() = default;
/**
* .
*
* \return
*/
virtual QString name() const = 0;
};
/**
* .
*/
class DocCore
{
public:
explicit DocCore(ProjectCore* core, const QString &path);
virtual ~DocCore() = default;
/**
* .
*
* \return
*/
Result::DesNode* unknowns() const;
/**
* .
*
* \return
*/
ProjectCore* project() const;
/**
* .
*
* \param new_name
*/
void rename(const QString &new_name);
/**
* .
*
* \return
*/
QString filePath() const;
/**
* .
*
* \return
*/
QString fileName() const;
/**
* .
*/
void clear();
/**
* .
*
* \param ins
* \return 0 -
*/
int append(Words *ins);
/**
* .
*
* \param row
* \param col
* \return
*/
Words* getWords(int row, int col) const;
private:
Result::DesNode *const unknown_host;
ProjectCore *const core_store;
QString file_path_store;
QList<Words*> nodes_store;
};
/**
* .
*/
class ProjectCore
{
private:
QString name_store;
public:
explicit ProjectCore(const QString &name);
virtual ~ProjectCore();
/**
* .
*
* \param file_path
* \return
*/
virtual Parse::Result::DocCore* queryDocument(const QString &file_path) const;
virtual void replaceDocument(Parse::Result::DocCore *ins);
virtual Parse::Result::DesNode* queryChain(const QString & name) const;
virtual Parse::Result::DesNode* queryPoint(Parse::Result::NamedNode* chain, const QString &name) const;
virtual Parse::Result::DesNode* queryUnit(const QString &name) const;
virtual Parse::Result::DesNode* queryFragment(Parse::Result::NamedNode *unit, const QString &name) const;
/**
* .
*
* \param type
* \param unit nullptr代表全局范围
* \return
*/
virtual QList<Parse::Result::NamedNode*> queryFragmentsOrderby(const QString &type, Parse::Result::NamedNode* unit = nullptr) const;
};
}
}
namespace Syntax {
/**
* .
*/
enum class ParseResult
{
SelfManipulate = 1,
EnterNext = 2,
Completed = 3,
Failed = 4,
};
/**
* .
*/
class SyntaxParser
{
public:
virtual ~SyntaxParser() = default;
/**
* Doc实例.
*
* \param ins
*/
virtual void docActive(Parse::Result::DocCore *ins) = 0;
/**
* .
*
* \return
*/
virtual Parse::Result::DocCore* docRef() const = 0;
/**
* .
*
* \param seqs
* \return
*/
virtual bool applied(const QList<Lex::LexResult>& seqs) = 0;
/**
*
*/
virtual void reset() = 0;
/**
* Token序列
*
* \param seqs
* \param next_ps
* \return
*/
virtual ParseResult parse(QList<Lex::LexResult>& seqs)= 0;
/**
* .
*
* \return
*/
virtual QList<SyntaxParser*> children() const = 0;
/**
* .
*
* \return
*/
virtual Parse::Result::DesNode* currNode() const = 0;
public:
/**
* .
*
* \param parsers
*/
virtual void addChild(QList<SyntaxParser*> parsers) = 0;
};
2022-11-06 00:37:50 +00:00
}