重构,组织解析类

This commit is contained in:
玉宇清音 2022-11-06 19:40:11 +08:00
parent 477aa07f13
commit 53afe58730
16 changed files with 479 additions and 451 deletions

View File

@ -8,7 +8,7 @@ CONFIG -= app_bundle
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
LexicalBase.cpp \
LexFoundation.cpp \
ParseFrame.cpp \
StoryChainDocumentParser.cpp \
StoryUnitDocumentParser.cpp \
@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
HEADERS += \
LexicalBase.h \
LexFoundation.h \
ParseFrame.h \
StoryChainDocumentParser.h \
StoryUnitDocumentParser.h \

View File

@ -1,9 +1,9 @@
#include "LexicalBase.h"
#include "LexFoundation.h"
#include <tuple>
using namespace Lex;
LexicalBase::LexicalBase(QList<LexUnit> seqence, const QString UnknownToken)
LexFoundation::LexFoundation(QList<LexDef> seqence, const QString UnknownToken)
: unknown_token(UnknownToken), lexical_seq(seqence)
{
empty_seq << '\t' << '\b' << ' ' << '\r' << EOF;
@ -12,7 +12,7 @@ LexicalBase::LexicalBase(QList<LexUnit> seqence, const QString UnknownToken)
typedef int lexunit_index;
typedef int match_start;
QList<LexResult> LexicalBase::push(int row, int col, const QChar w)
QList<LexResult> LexFoundation::push(int row, int col, const QChar w)
{
QList<LexResult> result;
@ -44,7 +44,7 @@ QList<LexResult> LexicalBase::push(int row, int col, const QChar w)
return mid_result;
}
QList<LexResult> LexicalBase::lexical_parse(const QString & segment)
QList<LexResult> LexFoundation::lexical_parse(const QString & segment)
{
// 获取匹配词法分析
QList<LexResult> result;

View File

@ -4,12 +4,12 @@
#include <QList>
namespace Lex {
class LexicalBase;
class LexFoundation;
/**
* .
*/
struct LexUnit
struct LexDef
{
QString TokenType; // Token字符
QString RegExpression; // 词法解析表达式
@ -24,7 +24,7 @@ namespace Lex {
QString Text; // 内容
int StartRow, StartCol, EndRow, EndCol; // 波及范围
friend class LexicalBase;
friend class LexFoundation;
private:
int index_at_segment;
};
@ -48,11 +48,11 @@ namespace Lex {
/**
* .
*/
class LexicalBase
class LexFoundation
{
public:
explicit LexicalBase(QList<LexUnit> seqence, const QString UnknownToken);
virtual ~LexicalBase() = default;
explicit LexFoundation(QList<LexDef> seqence, const QString UnknownToken);
virtual ~LexFoundation() = default;
/**
* .
@ -69,8 +69,8 @@ namespace Lex {
QList<QChar> empty_seq;
QList<XChar> code_acc;
QList<LexUnit> lexical_seq;
QList<LexDef> lexical_seq;
QList<LexResult> lexical_parse(const QString &segment);
};
}
}

View File

@ -2,17 +2,19 @@
#include "WordsPeak.h"
using namespace Parse;
using namespace Parse::Result;
using namespace Syntax;
using namespace Lex;
Parse::ParseFrame::ParseFrame() {}
ParseFrame::ParseFrame() {}
QList<DesNode*> Parse::ParseFrame::analysis(DocCore*doc, const QString & path)
QList<DesNode*> ParseFrame::analysis(DocCore*doc, const QString & path)
{
ForwardStream stream;
ExStream stream;
if (stream.initSource(path))
return QList<DesNode*>();
LexicalBase token_s(this->token_seqs, this->unknown_token);
LexFoundation token_s(this->token_seqs, this->unknown_token);
QList<LexResult> lex_seqence;
std::tuple<int, int, QChar> temp;
@ -42,18 +44,18 @@ QList<DesNode*> Parse::ParseFrame::analysis(DocCore*doc, const QString & path)
return xrets;
}
void Parse::ParseFrame::appendTokensDefine(QList<LexUnit> seqs, const QString & unknown_token)
void ParseFrame::appendTokensDefine(QList<LexDef> seqs, const QString & unknown_token)
{
this->unknown_token = unknown_token;
token_seqs.append(seqs);
}
void Parse::ParseFrame::appendParser(SyntaxParser * u)
void ParseFrame::appendParser(SyntaxParser * u)
{
cascade_parsers << u;
}
Parse::ParseResult Parse::ParseFrame::inner_parse(QList<LexResult> &lex_seqence, QList<SyntaxParser*> parsers, QList<DesNode*> &nodes_out)
ParseResult ParseFrame::inner_parse(QList<LexResult> &lex_seqence, QList<SyntaxParser*> parsers, QList<DesNode*> &nodes_out)
{
QList<DesNode*> nodes;

View File

@ -3,7 +3,7 @@
#include <QList>
#include "SyntaxBase.h"
namespace Parse
namespace Syntax
{
/**
* .
@ -14,17 +14,19 @@ namespace Parse
explicit ParseFrame();
virtual ~ParseFrame() = default;
QList<DesNode*> analysis(DocCore *doc, const QString &path);
QList<Parse::Result::DesNode*> analysis(Parse::Result::DocCore *doc, const QString &path);
protected:
void appendTokensDefine(QList<Lex::LexUnit> seqs, const QString &unknown_token);
void appendParser(SyntaxParser* u);
void appendTokensDefine(QList<Lex::LexDef> seqs, const QString &unknown_token);
void appendParser(Syntax::SyntaxParser* u);
private:
QString unknown_token;
QList<Lex::LexUnit> token_seqs;
QList<SyntaxParser*> cascade_parsers;
QList<Lex::LexDef> token_seqs;
QList<SyntaxParser*> cascade_parsers;
Parse::ParseResult Parse::ParseFrame::inner_parse(QList<Lex::LexResult> &lex_seqence, QList<SyntaxParser*> parsers, QList<DesNode*> &nodes_out);
ParseResult ParseFrame::inner_parse(QList<Lex::LexResult> &lex_seqence,
QList<Syntax::SyntaxParser*> parsers,
QList<Parse::Result::DesNode*> &nodes_out);
};
}

View File

@ -4,6 +4,7 @@ using namespace Parse;
using namespace Lex;
using namespace Syntax;
using namespace Syntax::Defines;
using namespace Parse::Result;
// storychain 解析器================================================
NodeStoryChainParser::NodeStoryChainParser(ProjectCore *core)

View File

@ -17,7 +17,7 @@ namespace Parse
/**
* .
*/
class NodeStoryChain : public NamedNode
class NodeStoryChain : public Result::NamedNode
{
public:
/**
@ -25,7 +25,7 @@ namespace Parse
*
* \param src_path
*/
explicit NodeStoryChain(DocCore *doc, const QString &name);
explicit NodeStoryChain(Result::DocCore *doc, const QString &name);
virtual ~NodeStoryChain() = default;
/**
@ -41,7 +41,7 @@ namespace Parse
return 0;
}
virtual QString name() const override;
virtual DocCore * document() const override;
virtual Result::DocCore * document() const override;
virtual int typeValue() const override;
virtual DesNode * parent() const override;
virtual void appendChild(DesNode * ins) override;
@ -50,7 +50,7 @@ namespace Parse
virtual QString toString() const override;
private:
DocCore *const doc_store;
Result::DocCore *const doc_store;
QString name_store;
QList<DesNode*> children_nodes;
};
@ -61,19 +61,19 @@ namespace Parse
class NodeStoryChainParser : public Syntax::XSyntaxBase
{
public:
NodeStoryChainParser(ProjectCore *core);
NodeStoryChainParser(Result::ProjectCore *core);
virtual ~NodeStoryChainParser() = default;
ProjectCore* project() const;
Result::ProjectCore* project() const;
private:
ProjectCore *pjt_ref;
Result::ProjectCore *pjt_ref;
};
/**
* .
*/
class NodeStoryPoint : public NamedNode
class NodeStoryPoint : public Result::NamedNode
{
public:
explicit NodeStoryPoint(NodeStoryChain *chain, const QString &name);
@ -90,7 +90,7 @@ namespace Parse
inline virtual int depth() const override {
return chain_store->depth() + 1;
}
virtual DocCore * document() const override;
virtual Result::DocCore * document() const override;
virtual int typeValue() const override;
virtual DesNode * parent() const override;
virtual void appendChild(DesNode * ins) override;
@ -115,7 +115,7 @@ namespace Parse
virtual ~NodeStoryPointParser() = default;
NodeStoryChainParser* storyChainParser() const;
virtual DocCore* docRef() const override;
virtual Result::DocCore* docRef() const override;
private:
NodeStoryChainParser *const parent_parser;
@ -124,7 +124,7 @@ namespace Parse
/**
* .
*/
class NodeStoryDesGroup : public DesNode
class NodeStoryDesGroup : public Result::DesNode
{
public:
NodeStoryDesGroup(DesNode *parent_refer);
@ -134,7 +134,7 @@ namespace Parse
inline virtual int depth() const override {
return parent_refer->depth() + 1;
}
virtual DocCore * document() const override;
virtual Result::DocCore * document() const override;
virtual int typeValue() const override;
virtual DesNode * parent() const override;
virtual void appendChild(DesNode * ins) override;
@ -160,7 +160,7 @@ namespace Parse
/**
* .
*/
class NodeStoryDesBlock : public DesNode
class NodeStoryDesBlock : public Result::DesNode
{
public:
explicit NodeStoryDesBlock(DesNode *parent_node, const QString &text);
@ -170,7 +170,7 @@ namespace Parse
inline virtual int depth() const override {
return parent_refer->depth() + 1;
}
virtual DocCore * document() const override;
virtual Result::DocCore * document() const override;
virtual int typeValue() const override;
virtual DesNode * parent() const override;
virtual void appendChild(DesNode * ins) override;
@ -183,10 +183,10 @@ namespace Parse
QString text_block;
};
class StoryChainDocumentParser : public ParseFrame
class StoryChainDocumentParser : public Syntax::ParseFrame
{
public:
StoryChainDocumentParser(ProjectCore *pjt);
StoryChainDocumentParser(Result::ProjectCore *pjt);
virtual ~StoryChainDocumentParser() = default;
};
}

View File

@ -1,6 +1,7 @@
#include "StoryUnitDocumentParser.h"
using namespace Parse;
using namespace Parse::Result;
using namespace Lex;
using namespace Syntax;
using namespace Syntax::Defines;
@ -95,7 +96,7 @@ QString NodeStoryFragment::toString() const
QString rets = QString(depth(), ' ') + "#情节 " + name() + "{";
for (auto cin : children_nodes)
rets += "\n" + QString(depth(), ' ') + cin->toString();
return rets + "}";
return rets + "\n"+QString(depth(), ' ') + "}";
}
QString NodeStoryFragment::name() const

View File

@ -7,10 +7,10 @@ namespace Parse {
/**
* .
*/
class NodeStoryUnit : public NamedNode
class NodeStoryUnit : public Result::NamedNode
{
public:
explicit NodeStoryUnit(DocCore *doc, const QString &name);
explicit NodeStoryUnit(Result::DocCore *doc, const QString &name);
virtual ~NodeStoryUnit() = default;
// 通过 NamedNode
@ -20,7 +20,7 @@ namespace Parse {
inline virtual int depth() const override {
return 0;
}
virtual DocCore * document() const override;
virtual Result::DocCore * document() const override;
virtual int typeValue() const override;
virtual DesNode * parent() const override;
virtual void appendChild(DesNode * ins) override;
@ -29,7 +29,7 @@ namespace Parse {
virtual QString toString() const override;
private:
DocCore *doc_ref;
Result::DocCore *doc_ref;
QString name_store;
QList<DesNode*> children_nodes;
@ -39,18 +39,18 @@ namespace Parse {
class NodeStoryUnitParser : public Syntax::XSyntaxBase
{
public:
NodeStoryUnitParser(ProjectCore *core);
NodeStoryUnitParser(Result::ProjectCore *core);
ProjectCore* project() const;
Result::ProjectCore* project() const;
private:
ProjectCore *const pjt_core;
Result::ProjectCore *const pjt_core;
};
/**
* .
*/
class NodeStoryFragment : public NamedNode
class NodeStoryFragment : public Result::NamedNode
{
public:
explicit NodeStoryFragment(NodeStoryUnit* unit, const QString &name);
@ -60,7 +60,7 @@ namespace Parse {
inline virtual int depth() const override {
return unit_ins->depth() + 1;
}
virtual DocCore * document() const override;
virtual Result::DocCore * document() const override;
virtual int typeValue() const override;
virtual DesNode * parent() const override;
virtual void appendChild(DesNode * ins) override;
@ -85,7 +85,7 @@ namespace Parse {
NodeStoryFragmentParser(NodeStoryUnitParser *pparser);
NodeStoryUnitParser * nodeStoryUnitParser() const;
DocCore * docRef() const;
Result::DocCore * docRef() const;
private:
NodeStoryUnitParser *const parent_parser;
@ -94,7 +94,7 @@ namespace Parse {
/**
* .
*/
class NodeStoryPointRefer : public DesNode
class NodeStoryPointRefer : public Result::DesNode
{
public:
explicit NodeStoryPointRefer(DesNode *parent, const QString &chain, const QString &point);
@ -104,7 +104,7 @@ namespace Parse {
inline virtual int depth() const override {
return parent_ins->depth() + 1;
}
virtual DocCore * document() const override;
virtual Result::DocCore * document() const override;
virtual int typeValue() const override;
virtual DesNode * parent() const override;
virtual void appendChild(DesNode * ins) override;
@ -148,8 +148,12 @@ namespace Parse {
/**
*
* # {
*
*
* }
*/
class NodeStoryFragmentComment : public NamedNode
class NodeStoryFragmentComment : public Result::NamedNode
{
public:
NodeStoryFragmentComment(DesNode *parent, const QString &order, const QString &name);
@ -162,7 +166,7 @@ namespace Parse {
{
return parent_ins->depth() + 1;
}
virtual DocCore * document() const override;
virtual Result::DocCore * document() const override;
virtual int typeValue() const override;
virtual DesNode * parent() const override;
virtual void appendChild(DesNode * ins) override;
@ -179,9 +183,9 @@ namespace Parse {
};
class StoryUnitDocumentParser : public ParseFrame
class StoryUnitDocumentParser : public Syntax::ParseFrame
{
public:
StoryUnitDocumentParser(ProjectCore *ins);
StoryUnitDocumentParser(Result::ProjectCore *ins);
};
}

View File

@ -3,127 +3,131 @@
using namespace Parse;
using namespace Lex;
using namespace Syntax;
using namespace Parse::Result;
class Unknown : public DesNode
{
public:
explicit Unknown(DocCore *ins)
: doc_store(ins) {}
namespace Parse {
class Unknown : public DesNode
{
public:
explicit Unknown(DocCore *ins)
: doc_store(ins) {}
// 通过 DesNode 继承
virtual int depth() const override
{
return 0;
}
virtual DocCore * document() const override
{
return doc_store;
}
virtual int typeValue() const override
{
return NODE_UNKNOWNHOST;
}
virtual DesNode * parent() const override
{
return nullptr;
}
virtual void appendChild(DesNode * ins) override
{
}
virtual QList<DesNode*> children() const override
{
return QList<DesNode*>();
}
virtual bool check(QList<QString>& reasons) const override
{
return true;
}
virtual QString toString() const override
{
return QString();
}
private:
DocCore *const doc_store;
};
// 通过 DesNode 继承
virtual int depth() const override
{
return 0;
}
virtual DocCore * document() const override
{
return doc_store;
}
virtual int typeValue() const override
{
return NODE_UNKNOWNHOST;
}
virtual DesNode * parent() const override
{
return nullptr;
}
virtual void appendChild(DesNode *) override
{
}
virtual QList<DesNode*> children() const override
{
return QList<DesNode*>();
}
virtual bool check(QList<QString>&) const override
{
return true;
}
virtual QString toString() const override
{
return QString();
}
private:
DocCore *const doc_store;
};
Parse::Words::Words(DesNode* host, DocCore *doc, const QString & value, int row, int col)
: value_store(value), row_store(row), col_store(col)
}
Words::Words(Result::DesNode *host, DocCore *doc, const QString & value, int row, int col)
: value_store(value), row_store(row), col_store(col), desnode_store(host), docpresent_store(doc)
{
}
int Parse::Words::row() const
int Words::row() const
{
return row_store;
}
int Parse::Words::column() const
int Words::column() const
{
return col_store;
}
int Parse::Words::length() const
int Words::length() const
{
return value_store.length();
}
DesNode * Parse::Words::host() const
DesNode * Words::host() const
{
return desnode_store;
}
DocCore * Parse::Words::doc() const
DocCore * Words::doc() const
{
return docpresent_store;
}
QString Parse::Words::toString() const
QString Words::toString() const
{
return value_store;
}
Parse::DocCore::DocCore(ProjectCore * core, const QString & path)
: core_store(core), file_path_store(path), unknown_host(new Unknown(this))
DocCore::DocCore(ProjectCore * core, const QString & path)
: unknown_host(new Unknown(this)), core_store(core), file_path_store(path)
{
}
DesNode * Parse::DocCore::unknowns() const
DesNode * DocCore::unknowns() const
{
return unknown_host;
}
ProjectCore * Parse::DocCore::project() const
ProjectCore * DocCore::project() const
{
return core_store;
}
void Parse::DocCore::rename(const QString & new_name)
void DocCore::rename(const QString & new_name)
{
file_path_store = new_name;
}
QString Parse::DocCore::filePath() const
QString DocCore::filePath() const
{
return file_path_store;
}
QString Parse::DocCore::fileName() const
QString DocCore::fileName() const
{
return QFileInfo(file_path_store).fileName();
}
void Parse::DocCore::clear()
void DocCore::clear()
{
nodes_store.clear();
}
int Parse::DocCore::append(Words * ins)
int DocCore::append(Words * ins)
{
nodes_store << ins;
return 0;
}
Words * Parse::DocCore::getWords(int row, int col) const
Words * DocCore::getWords(int row, int col) const
{
for (auto it : nodes_store)
if (it->row() == row && it->column() <= col && it->column() + it->length() >= col)

View File

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

View File

@ -1,19 +1,19 @@
#include "WordsPeak.h"
#include <QDebug>
using namespace Parse;
using namespace Lex;
ForwardStream::ForwardStream() :file_target(nullptr), text_input(nullptr),
ExStream::ExStream() :file_target(nullptr), text_input(nullptr),
current_line(""), current_row(-1), current_col(0) {}
ForwardStream::~ForwardStream() {
ExStream::~ExStream() {
if (file_target)
delete file_target;
if (text_input)
delete text_input;
}
int ForwardStream::initSource(const QString & path)
int ExStream::initSource(const QString & path)
{
if (file_target)
delete file_target;
@ -31,7 +31,7 @@ int ForwardStream::initSource(const QString & path)
return 0;
}
std::tuple<ForwardStream::n_row, ForwardStream::n_col, QChar> Parse::ForwardStream::read()
std::tuple<ExStream::n_row, ExStream::n_col, QChar> ExStream::read()
{
if (current_col >= current_line.length()) {
if (!text_input->atEnd()) {

View File

@ -4,14 +4,14 @@
#include <QFile>
#include <tuple>
namespace Parse {
class ForwardStream
namespace Lex {
class ExStream
{
public:
typedef int n_row;
typedef int n_col;
explicit ForwardStream();
virtual ~ForwardStream();
explicit ExStream();
virtual ~ExStream();
/**
* .

View File

@ -1,6 +1,7 @@
#include "XSyntaxBase.h"
using namespace Parse;
using namespace Parse::Result;
using namespace Syntax;
using namespace Lex;
using namespace Defines;

View File

@ -2,7 +2,7 @@
#include <QString>
#include <QList>
#include <QHash>
#include "LexicalBase.h"
#include "LexFoundation.h"
#include "SyntaxBase.h"
namespace Syntax
@ -178,7 +178,7 @@ namespace Syntax
{
public:
ParseRule(XSyntaxBase *host, const QString &rule_name, unsigned short level,
std::function<Parse::ParseResult(const QList<Lex::LexResult>&, int)>);
std::function<ParseResult(const QList<Lex::LexResult>&, int)>);
virtual ~ParseRule() = default;
int level() const;
@ -186,7 +186,7 @@ namespace Syntax
void addExpression(const QString &name, const QList<Defines::Elm> &_defines);
std::tuple<bool, int> tokensMatch(const QList<Lex::LexResult> &token) const;
Parse::ParseResult syntaxTrigger(const QList<Lex::LexResult>& srcs, int count);
ParseResult syntaxTrigger(const QList<Lex::LexResult>& srcs, int count);
private:
XSyntaxBase *const host_ins;
@ -194,7 +194,7 @@ namespace Syntax
QString name_store;
QList<Expression*> expression_list;
std::function<Parse::ParseResult(const QList<Lex::LexResult>&, int)> exc_store;
std::function<ParseResult(const QList<Lex::LexResult>&, int)> exc_store;
};
@ -210,7 +210,7 @@ namespace Syntax
/**
* .
*/
class XSyntaxBase : public Parse::SyntaxParser
class XSyntaxBase : public Syntax::SyntaxParser
{
public:
explicit XSyntaxBase(const QString &section, MatchType type = MatchType::Entirely);
@ -219,19 +219,19 @@ namespace Syntax
Element *get_element(const QString &name);
// 通过 Parse::SyntaxParser 继承
virtual void docActive(Parse::DocCore *ins) override;
virtual Parse::DocCore *docRef() const override;
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 Parse::ParseResult parse(QList<Lex::LexResult>& seqs) override;
virtual QList<Parse::SyntaxParser*> children() const override;
virtual ParseResult parse(QList<Lex::LexResult>& seqs) override;
virtual QList<Syntax::SyntaxParser*> children() const override;
virtual Parse::DesNode * currNode() const override;
virtual Parse::Result::DesNode * currNode() const override;
protected:
ParseRule* addRule(const QString &name, unsigned short level, std::function<Parse::ParseResult(const QList<Lex::LexResult>&, int)> exc);
virtual void addChild(QList<Parse::SyntaxParser*> parsers) override;
void refocusNode(Parse::DesNode *ins);
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);
@ -239,12 +239,12 @@ namespace Syntax
MatchType target_type;
QString section_name;
int current_level;
Parse::DesNode *current_node;
Parse::DocCore *src_ref;
Parse::Result::DesNode *current_node;
Parse::Result::DocCore *src_ref;
QHash<QString, Element*> elements_store;
QHash<QString, Expression*> expressions_store;
QList<Parse::SyntaxParser*> child_parsers;
QList<Syntax::SyntaxParser*> child_parsers;
QHash<QString, ParseRule*> rule_collect;
};

View File

@ -7,6 +7,7 @@
#include "ParseFrame.h"
using namespace Parse;
using namespace Parse::Result;
int main(int argc, char *argv[])
{