Compare commits

..

4 Commits

Author SHA1 Message Date
codeboss 7d14a5a207 改进解析过程 2024-07-13 06:47:28 +08:00
codeboss e8534447be 改进整理代码 2024-07-13 06:20:49 +08:00
codeboss 5fea845666 Context接口改进 2024-07-13 06:19:30 +08:00
codeboss 740e7b0bef 改进接口 2024-07-13 06:16:11 +08:00
11 changed files with 64 additions and 64 deletions

View File

@ -69,15 +69,16 @@ int main(int argc, char* argv[]) {
if (files.size()) {
try {
auto parser = std::make_shared<NovelParser>();
access_ptr = parser->parse(files);
auto docs = parser->parse(files);
auto errors_list = std::dynamic_pointer_cast<const ast_gen::GlobalElement>(access_ptr->element())->errors();
auto errors_list = parser->parserContext()->errors();
if (errors_list.size()) {
for (auto& err : errors_list) {
qDebug().noquote() << err;
}
exit(0);
}
access_ptr = parser->validsApply(docs);
}
catch (lib_syntax::SyntaxException* e) {
qDebug().noquote() << e->message();

View File

@ -29,10 +29,14 @@ QString NovelParser::version() const
return "1.0.0";
}
std::shared_ptr<const ast_gen::ElementAccess> NovelParser::parse(const QFileInfoList source_list) const {
QList<std::shared_ptr<const ast_basic::IExprInst>> forst_root;
std::shared_ptr<lib_syntax::IContext> NovelParser::parserContext() const
{
return context;
}
QList<std::shared_ptr<const ast_basic::IExprInst>> NovelParser::parse(const QFileInfoList source_list) const {
const_cast<NovelParser*>(this)->context = std::make_shared<ast_gen::GlobalElement>(u8"С˵");
auto word_reader = std::make_shared<lib_token::WordReader>();
auto context = std::make_shared<ast_gen::GlobalElement>(u8"С˵");
auto time_stamp = QTime::currentTime();
for (auto& file : source_list) {
@ -41,13 +45,17 @@ std::shared_ptr<const ast_gen::ElementAccess> NovelParser::parse(const QFileInfo
this->syntax_defines->parse(context, words);
}
forst_root = context->getDocs();
QList<std::shared_ptr<const ast_basic::IExprInst>> forst_root = context->getDocInsts();
auto current_stamp = QTime::currentTime();
qDebug().noquote() << QString(u8"%词法解析+语法解析消耗时间:%1 ms。").arg(time_stamp.msecsTo(current_stamp));
time_stamp = QTime::currentTime();
return forst_root;
}
std::shared_ptr<const ast_gen::ElementAccess> NovelParser::validsApply(QList<std::shared_ptr<const ast_basic::IExprInst>> forst_root) const {
auto time_stamp = QTime::currentTime();
QList<std::shared_ptr<ast_gen::SyntaxElement>> docs_node;
for (auto &it : forst_root) {
for (auto& it : forst_root) {
auto xitem = std::dynamic_pointer_cast<const ast_gen::SyntaxElement>(it);
docs_node.append(std::const_pointer_cast<ast_gen::SyntaxElement>(xitem));
context->addChild(docs_node.last());
@ -55,7 +63,7 @@ std::shared_ptr<const ast_gen::ElementAccess> NovelParser::parse(const QFileInfo
auto x_root = NovalSyntax::tidy(context, docs_node);
auto novel_accesstree = std::make_shared<ast_gen::ElementAccess>(x_root);
current_stamp = QTime::currentTime();
auto current_stamp = QTime::currentTime();
qDebug().noquote() << QString(u8"%程序结构重建消耗时间:%1 ms。").arg(time_stamp.msecsTo(current_stamp));
return analyzer_ref->validCheckWith(novel_accesstree);

View File

@ -12,6 +12,7 @@ namespace example_novel {
class NovelParser
{
private:
std::shared_ptr<ast_gen::GlobalElement> context = nullptr;
std::shared_ptr<const lib_syntax::ExprRule> syntax_defines;
QList<std::shared_ptr<const lib_parse::CheckProvider>> checker_list;
std::shared_ptr<const lib_parse::Analyzer> analyzer_ref;
@ -21,5 +22,7 @@ public:
QList<std::shared_ptr<const example_novel::FragmentGraphHelper>> fragmentsSorted() const;
virtual QString version() const;
std::shared_ptr<const ast_gen::ElementAccess> parse(const QFileInfoList souurce_list) const;
std::shared_ptr<lib_syntax::IContext> parserContext() const;
QList<std::shared_ptr<const ast_basic::IExprInst>> parse(const QFileInfoList souurce_list) const;
std::shared_ptr<const ast_gen::ElementAccess> validsApply(QList<std::shared_ptr<const ast_basic::IExprInst>> docs_list) const;
};

View File

@ -18,10 +18,6 @@ QString ExpressionElement::filePath() const {
return tokens_bind.first()->file();
}
void ExpressionElement::tokensReset(const QList<std::shared_ptr<const IToken>>& list) {
this->tokens_bind = list;
}
void ExpressionElement::addToken(std::shared_ptr<const IToken> token_inst) {
this->tokens_bind.append(token_inst);
}
@ -87,7 +83,7 @@ void ExpressionContext::appendParseErrors(const QString& file_path, int start, c
QStringList ExpressionContext::errors() const {
QStringList values;
for (auto& tp : this->errors_storage)
values.append(QString(u8"%2\n\tÎļþ£¨%1£©").arg(std::get<0>(tp)).arg(std::get<2>(tp)));
values.append(QString(u8"Îļþ£º%1\n\t%2").arg(std::get<0>(tp)).arg(std::get<2>(tp)));
return values;
}
@ -100,15 +96,15 @@ void ExpressionContext::clearErrors(const QString &file_path, int start) {
}
}
QList<std::shared_ptr<const IBasicRule>> ExpressionContext::currentExpressionRuleStack() const {
QList<std::shared_ptr<const IBasicRule>> ExpressionContext::currentExprRuleStack() const {
return rule_stack;
}
void ExpressionContext::appendDoc(std::shared_ptr<ast_basic::IExprInst> inst) {
void ExpressionContext::appendDocInst(std::shared_ptr<ast_basic::IExprInst> inst) {
this->document_store.append(inst);
}
QList<std::shared_ptr<const ast_basic::IExprInst>> ExpressionContext::getDocs() const {
QList<std::shared_ptr<const ast_basic::IExprInst>> ExpressionContext::getDocInsts() const {
return this->document_store;
}

View File

@ -32,12 +32,6 @@ namespace ast_basic {
* \return token序列
*/
virtual QList<std::shared_ptr<const lib_token::IToken>> tokens() const = 0;
/**
* ÖØÖÃÓï·¨Token¼¯.
*
* \param list
*/
virtual void tokensReset(const QList<std::shared_ptr<const lib_token::IToken>> &list) = 0;
/**
* token实例.
*
@ -77,7 +71,6 @@ namespace ast_basic {
QString filePath() const override;
QList<std::shared_ptr<const lib_token::IToken>> tokens() const override;
void tokensReset(const QList<std::shared_ptr<const lib_token::IToken>>& list) override;
void addToken(std::shared_ptr<const lib_token::IToken> token_inst) override;
QList<std::shared_ptr<const IExprInst>> children() const override;
@ -95,10 +88,10 @@ namespace ast_basic {
public:
ExpressionContext();
// 通过 IContext 继承
virtual void setCurrentFile(const QString& path);
virtual QString currentFile() const;
// ͨ¹ý IContext ¼Ì³Ð
std::shared_ptr<ast_basic::IExprInst> currentExprInst() const override;
void pushExprInst(std::shared_ptr<ast_basic::IExprInst> current_inst) override;
std::shared_ptr<ast_basic::IExprInst> popExprInst() override;
@ -106,10 +99,10 @@ namespace ast_basic {
std::shared_ptr<const lib_syntax::IBasicRule> currentExprRule() const override;
void pushExprRule(std::shared_ptr<const lib_syntax::IBasicRule> inst) override;
std::shared_ptr<const lib_syntax::IBasicRule> popExprRule() override;
virtual QList<std::shared_ptr<const lib_syntax::IBasicRule>> currentExpressionRuleStack() const;
virtual QList<std::shared_ptr<const lib_syntax::IBasicRule>> currentExprRuleStack() const;
virtual void appendDoc(std::shared_ptr<ast_basic::IExprInst> inst) override;
virtual QList<std::shared_ptr<const ast_basic::IExprInst>> getDocs() const override;
virtual void appendDocInst(std::shared_ptr<ast_basic::IExprInst> inst) override;
virtual QList<std::shared_ptr<const ast_basic::IExprInst>> getDocInsts() const override;
void appendParseErrors(const QString& file_path, int start, const QString& error_msg) override;
QStringList errors() const override;

View File

@ -23,8 +23,8 @@ std::tuple<IBasicRule::MatchResult, std::shared_ptr<const IWordBase>> TokenMatch
}
else {
rt_inst->appendParseErrors(rt_inst->currentFile(), head->position(),
QString(u8"Syntax[0x00001]语法匹配错误不能识别token%1<%2,%3>(%4)")
.arg(head->content()).arg(head->row()).arg(head->column()).arg(head->file()));
QString(u8"Syntax[0x00001]语法匹配错误不能识别token\"%1\"<row:%2,col:%3>(应该为:%4)")
.arg(head->content()).arg(head->row()).arg(head->column()).arg(this->define_peer->reviseWords()));
return std::make_tuple(IBasicRule::MatchResult::Part, head);
}
@ -37,7 +37,7 @@ std::tuple<IBasicRule::MatchResult, std::shared_ptr<const IWordBase>> TokenMatch
}
QString TokenMatch::token_present() const {
return QString(u8"<%1>").arg(this->define_peer->typeName());
return QString(u8"<%1>").arg(this->define_peer->reviseWords());
}
Rept::Rept(std::shared_ptr<const IBasicRule> rule, int min, int max) : rule_peer(rule), min_match(min), max_match(max) {}
@ -228,7 +228,7 @@ ExprRule::parse(std::shared_ptr<IContext> rt_inst, std::shared_ptr<const IWordBa
rt_inst->currentExprInst()->addChild(elm_ast);
}
else {
rt_inst->appendDoc(elm_ast);
rt_inst->appendDocInst(elm_ast);
}
}break;
default:

View File

@ -42,8 +42,8 @@ namespace lib_syntax {
virtual QStringList errors() const = 0;
virtual void clearErrors(const QString &file_path, int start) = 0;
virtual void appendDoc(std::shared_ptr<ast_basic::IExprInst> inst) = 0;
virtual QList<std::shared_ptr<const ast_basic::IExprInst>> getDocs() const = 0;
virtual void appendDocInst(std::shared_ptr<ast_basic::IExprInst> inst) = 0;
virtual QList<std::shared_ptr<const ast_basic::IExprInst>> getDocInsts() const = 0;
/**
* \brief µ±Ç°±í´ïÊ½ÔªËØ.
@ -57,7 +57,7 @@ namespace lib_syntax {
virtual std::shared_ptr<const IBasicRule> currentExprRule() const = 0;
virtual void pushExprRule(std::shared_ptr<const IBasicRule> inst) = 0;
virtual std::shared_ptr<const IBasicRule> popExprRule() = 0;
virtual QList<std::shared_ptr<const IBasicRule>> currentExpressionRuleStack() const = 0;
virtual QList<std::shared_ptr<const IBasicRule>> currentExprRuleStack() const = 0;
};
/**

View File

@ -13,12 +13,12 @@ auto rightb = std::make_shared<RightBracket>(); // }
auto refers = std::make_shared<ReferMark>(); // @
auto declare = std::make_shared<DeclareSymbo>(); // #
auto rank_key = std::make_shared<Keywords>(u8"排序", u8"rank-symbol", 0xAEu); // 排序
auto story_key = std::make_shared<Keywords>(u8"故事", u8"story-mark", 0xAAu); // 故事
auto rank_key = std::make_shared<Keywords>(u8"排序", 0xAEu); // 排序
auto story_key = std::make_shared<Keywords>(u8"故事", 0xAAu); // 故事
auto numbers = std::make_shared<Numbers>(); // [0-9]+
auto frag_key = std::make_shared<Keywords>(u8"情节", u8"fragment-mark", 0xABu); // 情节
auto volume_key = std::make_shared<Keywords>(u8"分卷", u8"volume-mark", 0xACu); // 分卷
auto article_key = std::make_shared<Keywords>(u8"章节", u8"article-mark", 0xADu); // 章节
auto frag_key = std::make_shared<Keywords>(u8"情节", 0xABu); // 情节
auto volume_key = std::make_shared<Keywords>(u8"分卷", 0xACu); // 分卷
auto article_key = std::make_shared<Keywords>(u8"章节", 0xADu); // 章节
auto split_mark = std::make_shared<Split>(); // &
auto vtext = std::make_shared<VTextSection>(); // ^([^\\{\\}\\n@&]+)
auto name_text = std::make_shared<NameSection>(); // ^([^:\\{\\}\\n@&][^\\{\\}\\n@&]*)

View File

@ -116,7 +116,7 @@ namespace lib_token {
* @brief
* @return
*/
virtual QString typeName() const = 0;
virtual QString reviseWords() const = 0;
/**
* @brief .
*

View File

@ -26,7 +26,7 @@ std::shared_ptr<const IWordBase> lib_token::TokenContent::nextWord() const
std::shared_ptr<const ITokenDefine> TokenContent::define() const { return this->type_def; }
QString LeftBracket::typeName() const { return u8"left-bracket"; }
QString LeftBracket::reviseWords() const { return u8"{"; }
int LeftBracket::typeMark() const
{
@ -53,7 +53,7 @@ LeftBracket::analysis(std::shared_ptr<const IWordBase> content) const {
return std::make_tuple(token_inst, nullptr);
}
QString RightBracket::typeName() const { return u8"right-bracket"; }
QString RightBracket::reviseWords() const { return u8"}"; }
int RightBracket::typeMark() const
{
@ -62,7 +62,7 @@ int RightBracket::typeMark() const
QString RightBracket::regex() const { return u8"}"; }
QString ReferMark::typeName() const { return u8"refer-mark"; }
QString ReferMark::reviseWords() const { return u8"@"; }
int ReferMark::typeMark() const
{
@ -71,9 +71,9 @@ int ReferMark::typeMark() const
QString ReferMark::regex() const { return u8"@"; }
Keywords::Keywords(const QString& val, const QString& nm, uint type_code) : means_store(val), name_store(nm), type_code(type_code) {}
Keywords::Keywords(const QString& val, uint type_code) : means_store(val), type_code(type_code) {}
QString Keywords::typeName() const { return name_store; }
QString Keywords::reviseWords() const { return means_store; }
int Keywords::typeMark() const
{
@ -93,7 +93,7 @@ Keywords::analysis(std::shared_ptr<const IWordBase> content) const {
return std::make_tuple(token_inst, nullptr);
}
QString Numbers::typeName() const { return u8"numbers"; }
QString Numbers::reviseWords() const { return u8"ÕýÕûÊý"; }
int Numbers::typeMark() const
{
@ -114,7 +114,7 @@ Numbers::analysis(std::shared_ptr<const IWordBase> content) const {
return std::make_tuple(tinst, nullptr);
}
QString VTextSection::typeName() const { return u8"text-section"; }
QString VTextSection::reviseWords() const { return u8"Îı¾"; }
int VTextSection::typeMark() const
{
@ -144,7 +144,7 @@ VTextSection::analysis(std::shared_ptr<const IWordBase> content) const {
return std::make_tuple(tinst, nullptr);
}
QString Split::typeName() const { return u8"split-mark"; }
QString Split::reviseWords() const { return u8"&"; }
int Split::typeMark() const
{
@ -153,7 +153,7 @@ int Split::typeMark() const
QString Split::regex() const { return u8"&"; }
QString NameSection::typeName() const { return u8"name-section"; }
QString NameSection::reviseWords() const { return u8"Ãû³Æ"; }
int NameSection::typeMark() const
{
@ -183,8 +183,7 @@ std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IWordBase> > Nam
return std::make_tuple(tinst, nullptr);
}
QString DeclareSymbo::typeName() const
{
QString DeclareSymbo::reviseWords() const {
return u8"ÉùÃ÷·û";
}

View File

@ -39,7 +39,7 @@ namespace example_novel {
class LIBTOKEN_EXPORT LeftBracket : public lib_token::ITokenDefine, public std::enable_shared_from_this<LeftBracket> {
// TokenDefine interface
public:
virtual QString typeName() const override;
virtual QString reviseWords() const override;
virtual int typeMark() const override;
virtual QString regex() const override;
virtual std::tuple<std::shared_ptr<const lib_token::IToken>, std::shared_ptr<const lib_token::IWordBase>>
@ -48,36 +48,36 @@ namespace example_novel {
class LIBTOKEN_EXPORT RightBracket : public LeftBracket {
public:
virtual QString typeName() const override;
virtual QString reviseWords() const override;
virtual int typeMark() const override;
virtual QString regex() const override;
};
class LIBTOKEN_EXPORT ReferMark : public LeftBracket {
public:
virtual QString typeName() const override;
virtual QString reviseWords() const override;
virtual int typeMark() const override;
virtual QString regex() const override;
};
class LIBTOKEN_EXPORT Split : public LeftBracket {
public:
virtual QString typeName() const override;
virtual QString reviseWords() const override;
virtual int typeMark() const override;
virtual QString regex() const override;
};
class LIBTOKEN_EXPORT Keywords : public lib_token::ITokenDefine, public std::enable_shared_from_this<Keywords> {
private:
QString means_store, name_store;
QString means_store;
int type_code;
public:
Keywords(const QString& val, const QString& nm, uint type_code);
Keywords(const QString& val, uint type_code);
// TokenDefine interface
public:
virtual QString typeName() const override;
virtual QString reviseWords() const override;
virtual int typeMark() const override;
virtual QString regex() const override;
virtual std::tuple<std::shared_ptr<const lib_token::IToken>, std::shared_ptr<const lib_token::IWordBase>>
@ -87,7 +87,7 @@ namespace example_novel {
class LIBTOKEN_EXPORT Numbers : public lib_token::ITokenDefine, public std::enable_shared_from_this<Numbers> {
// TokenDefine interface
public:
virtual QString typeName() const override;
virtual QString reviseWords() const override;
virtual int typeMark() const override;
virtual QString regex() const override;
virtual std::tuple<std::shared_ptr<const lib_token::IToken>, std::shared_ptr<const lib_token::IWordBase>>
@ -98,7 +98,7 @@ namespace example_novel {
class LIBTOKEN_EXPORT NameSection : public lib_token::ITokenDefine, public std::enable_shared_from_this<NameSection> {
// TokenDefine interface
public:
virtual QString typeName() const override;
virtual QString reviseWords() const override;
virtual int typeMark() const override;
virtual QString regex() const override;
virtual std::tuple<std::shared_ptr<const lib_token::IToken>, std::shared_ptr<const lib_token::IWordBase>>
@ -108,7 +108,7 @@ namespace example_novel {
class LIBTOKEN_EXPORT VTextSection : public lib_token::ITokenDefine, public std::enable_shared_from_this<VTextSection> {
// TokenDefine interface
public:
virtual QString typeName() const override;
virtual QString reviseWords() const override;
virtual int typeMark() const override;
virtual QString regex() const override;
virtual std::tuple<std::shared_ptr<const lib_token::IToken>, std::shared_ptr<const lib_token::IWordBase>>
@ -118,7 +118,7 @@ namespace example_novel {
class LIBTOKEN_EXPORT DeclareSymbo : public lib_token::ITokenDefine, public std::enable_shared_from_this<DeclareSymbo> {
public:
// ͨ¹ý TokenDefine ¼Ì³Ð
virtual QString typeName() const override;
virtual QString reviseWords() const override;
virtual int typeMark() const override;
virtual QString regex() const override;
virtual std::tuple<std::shared_ptr<const lib_token::IToken>, std::shared_ptr<const lib_token::IWordBase>>