Compare commits
No commits in common. "7d14a5a207d46ae9dd3c2a42aca2644f4085fd09" and "19985a4bb722b507111cf930acd07d23ba27fac9" have entirely different histories.
7d14a5a207
...
19985a4bb7
|
@ -69,16 +69,15 @@ int main(int argc, char* argv[]) {
|
|||
if (files.size()) {
|
||||
try {
|
||||
auto parser = std::make_shared<NovelParser>();
|
||||
auto docs = parser->parse(files);
|
||||
access_ptr = parser->parse(files);
|
||||
|
||||
auto errors_list = parser->parserContext()->errors();
|
||||
auto errors_list = std::dynamic_pointer_cast<const ast_gen::GlobalElement>(access_ptr->element())->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();
|
||||
|
|
|
@ -29,14 +29,10 @@ QString NovelParser::version() const
|
|||
return "1.0.0";
|
||||
}
|
||||
|
||||
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"С˵");
|
||||
std::shared_ptr<const ast_gen::ElementAccess> NovelParser::parse(const QFileInfoList source_list) const {
|
||||
QList<std::shared_ptr<const ast_basic::IExprInst>> forst_root;
|
||||
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) {
|
||||
|
@ -45,17 +41,13 @@ QList<std::shared_ptr<const ast_basic::IExprInst>> NovelParser::parse(const QFil
|
|||
this->syntax_defines->parse(context, words);
|
||||
}
|
||||
|
||||
QList<std::shared_ptr<const ast_basic::IExprInst>> forst_root = context->getDocInsts();
|
||||
forst_root = context->getDocs();
|
||||
auto current_stamp = QTime::currentTime();
|
||||
qDebug().noquote() << QString(u8"%词法解析+语法解析消耗时间:%1 ms。").arg(time_stamp.msecsTo(current_stamp));
|
||||
|
||||
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();
|
||||
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());
|
||||
|
@ -63,7 +55,7 @@ std::shared_ptr<const ast_gen::ElementAccess> NovelParser::validsApply(QList<std
|
|||
|
||||
auto x_root = NovalSyntax::tidy(context, docs_node);
|
||||
auto novel_accesstree = std::make_shared<ast_gen::ElementAccess>(x_root);
|
||||
auto current_stamp = QTime::currentTime();
|
||||
current_stamp = QTime::currentTime();
|
||||
qDebug().noquote() << QString(u8"%程序结构重建消耗时间:%1 ms。").arg(time_stamp.msecsTo(current_stamp));
|
||||
|
||||
return analyzer_ref->validCheckWith(novel_accesstree);
|
||||
|
|
|
@ -12,7 +12,6 @@ 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;
|
||||
|
@ -22,7 +21,5 @@ public:
|
|||
QList<std::shared_ptr<const example_novel::FragmentGraphHelper>> fragmentsSorted() const;
|
||||
|
||||
virtual QString version() 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;
|
||||
std::shared_ptr<const ast_gen::ElementAccess> parse(const QFileInfoList souurce_list) const;
|
||||
};
|
|
@ -18,6 +18,10 @@ 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);
|
||||
}
|
||||
|
@ -83,7 +87,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"Îļþ£º%1\n\t%2").arg(std::get<0>(tp)).arg(std::get<2>(tp)));
|
||||
values.append(QString(u8"%2\n\tÎļþ£¨%1£©").arg(std::get<0>(tp)).arg(std::get<2>(tp)));
|
||||
|
||||
return values;
|
||||
}
|
||||
|
@ -96,15 +100,15 @@ void ExpressionContext::clearErrors(const QString &file_path, int start) {
|
|||
}
|
||||
}
|
||||
|
||||
QList<std::shared_ptr<const IBasicRule>> ExpressionContext::currentExprRuleStack() const {
|
||||
QList<std::shared_ptr<const IBasicRule>> ExpressionContext::currentExpressionRuleStack() const {
|
||||
return rule_stack;
|
||||
}
|
||||
|
||||
|
||||
void ExpressionContext::appendDocInst(std::shared_ptr<ast_basic::IExprInst> inst) {
|
||||
void ExpressionContext::appendDoc(std::shared_ptr<ast_basic::IExprInst> inst) {
|
||||
this->document_store.append(inst);
|
||||
}
|
||||
|
||||
QList<std::shared_ptr<const ast_basic::IExprInst>> ExpressionContext::getDocInsts() const {
|
||||
QList<std::shared_ptr<const ast_basic::IExprInst>> ExpressionContext::getDocs() const {
|
||||
return this->document_store;
|
||||
}
|
|
@ -32,6 +32,12 @@ 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实例.
|
||||
*
|
||||
|
@ -71,6 +77,7 @@ 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;
|
||||
|
@ -88,10 +95,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;
|
||||
|
@ -99,10 +106,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>> currentExprRuleStack() const;
|
||||
virtual QList<std::shared_ptr<const lib_syntax::IBasicRule>> currentExpressionRuleStack() const;
|
||||
|
||||
virtual void appendDocInst(std::shared_ptr<ast_basic::IExprInst> inst) override;
|
||||
virtual QList<std::shared_ptr<const ast_basic::IExprInst>> getDocInsts() const override;
|
||||
virtual void appendDoc(std::shared_ptr<ast_basic::IExprInst> inst) override;
|
||||
virtual QList<std::shared_ptr<const ast_basic::IExprInst>> getDocs() const override;
|
||||
|
||||
void appendParseErrors(const QString& file_path, int start, const QString& error_msg) override;
|
||||
QStringList errors() const override;
|
||||
|
|
|
@ -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\"<row:%2,col:%3>(应该为:%4)")
|
||||
.arg(head->content()).arg(head->row()).arg(head->column()).arg(this->define_peer->reviseWords()));
|
||||
QString(u8"Syntax[0x00001]语法匹配错误,不能识别token:%1<%2,%3>(%4)")
|
||||
.arg(head->content()).arg(head->row()).arg(head->column()).arg(head->file()));
|
||||
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->reviseWords());
|
||||
return QString(u8"<%1>").arg(this->define_peer->typeName());
|
||||
}
|
||||
|
||||
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->appendDocInst(elm_ast);
|
||||
rt_inst->appendDoc(elm_ast);
|
||||
}
|
||||
}break;
|
||||
default:
|
||||
|
|
|
@ -42,8 +42,8 @@ namespace lib_syntax {
|
|||
virtual QStringList errors() const = 0;
|
||||
virtual void clearErrors(const QString &file_path, int start) = 0;
|
||||
|
||||
virtual void appendDocInst(std::shared_ptr<ast_basic::IExprInst> inst) = 0;
|
||||
virtual QList<std::shared_ptr<const ast_basic::IExprInst>> getDocInsts() const = 0;
|
||||
virtual void appendDoc(std::shared_ptr<ast_basic::IExprInst> inst) = 0;
|
||||
virtual QList<std::shared_ptr<const ast_basic::IExprInst>> getDocs() 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>> currentExprRuleStack() const = 0;
|
||||
virtual QList<std::shared_ptr<const IBasicRule>> currentExpressionRuleStack() const = 0;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -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"排序", 0xAEu); // 排序
|
||||
auto story_key = std::make_shared<Keywords>(u8"故事", 0xAAu); // 故事
|
||||
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 numbers = std::make_shared<Numbers>(); // [0-9]+
|
||||
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 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 split_mark = std::make_shared<Split>(); // &
|
||||
auto vtext = std::make_shared<VTextSection>(); // ^([^\\{\\}\\n@&]+)
|
||||
auto name_text = std::make_shared<NameSection>(); // ^([^:\\{\\}\\n@&][^\\{\\}\\n@&]*)
|
||||
|
|
|
@ -116,7 +116,7 @@ namespace lib_token {
|
|||
* @brief 解析机制名称
|
||||
* @return
|
||||
*/
|
||||
virtual QString reviseWords() const = 0;
|
||||
virtual QString typeName() const = 0;
|
||||
/**
|
||||
* @brief 整数类型标识.
|
||||
*
|
||||
|
|
|
@ -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::reviseWords() const { return u8"{"; }
|
||||
QString LeftBracket::typeName() const { return u8"left-bracket"; }
|
||||
|
||||
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::reviseWords() const { return u8"}"; }
|
||||
QString RightBracket::typeName() const { return u8"right-bracket"; }
|
||||
|
||||
int RightBracket::typeMark() const
|
||||
{
|
||||
|
@ -62,7 +62,7 @@ int RightBracket::typeMark() const
|
|||
|
||||
QString RightBracket::regex() const { return u8"}"; }
|
||||
|
||||
QString ReferMark::reviseWords() const { return u8"@"; }
|
||||
QString ReferMark::typeName() const { return u8"refer-mark"; }
|
||||
|
||||
int ReferMark::typeMark() const
|
||||
{
|
||||
|
@ -71,9 +71,9 @@ int ReferMark::typeMark() const
|
|||
|
||||
QString ReferMark::regex() const { return u8"@"; }
|
||||
|
||||
Keywords::Keywords(const QString& val, uint type_code) : means_store(val), type_code(type_code) {}
|
||||
Keywords::Keywords(const QString& val, const QString& nm, uint type_code) : means_store(val), name_store(nm), type_code(type_code) {}
|
||||
|
||||
QString Keywords::reviseWords() const { return means_store; }
|
||||
QString Keywords::typeName() const { return name_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::reviseWords() const { return u8"ÕýÕûÊý"; }
|
||||
QString Numbers::typeName() const { return u8"numbers"; }
|
||||
|
||||
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::reviseWords() const { return u8"Îı¾"; }
|
||||
QString VTextSection::typeName() const { return u8"text-section"; }
|
||||
|
||||
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::reviseWords() const { return u8"&"; }
|
||||
QString Split::typeName() const { return u8"split-mark"; }
|
||||
|
||||
int Split::typeMark() const
|
||||
{
|
||||
|
@ -153,7 +153,7 @@ int Split::typeMark() const
|
|||
|
||||
QString Split::regex() const { return u8"&"; }
|
||||
|
||||
QString NameSection::reviseWords() const { return u8"Ãû³Æ"; }
|
||||
QString NameSection::typeName() const { return u8"name-section"; }
|
||||
|
||||
int NameSection::typeMark() const
|
||||
{
|
||||
|
@ -183,7 +183,8 @@ std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IWordBase> > Nam
|
|||
return std::make_tuple(tinst, nullptr);
|
||||
}
|
||||
|
||||
QString DeclareSymbo::reviseWords() const {
|
||||
QString DeclareSymbo::typeName() const
|
||||
{
|
||||
return u8"ÉùÃ÷·û";
|
||||
}
|
||||
|
||||
|
|
|
@ -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 reviseWords() const override;
|
||||
virtual QString typeName() 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 reviseWords() const override;
|
||||
virtual QString typeName() const override;
|
||||
virtual int typeMark() const override;
|
||||
virtual QString regex() const override;
|
||||
};
|
||||
|
||||
class LIBTOKEN_EXPORT ReferMark : public LeftBracket {
|
||||
public:
|
||||
virtual QString reviseWords() const override;
|
||||
virtual QString typeName() const override;
|
||||
virtual int typeMark() const override;
|
||||
virtual QString regex() const override;
|
||||
};
|
||||
|
||||
class LIBTOKEN_EXPORT Split : public LeftBracket {
|
||||
public:
|
||||
virtual QString reviseWords() const override;
|
||||
virtual QString typeName() 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;
|
||||
QString means_store, name_store;
|
||||
int type_code;
|
||||
|
||||
public:
|
||||
Keywords(const QString& val, uint type_code);
|
||||
Keywords(const QString& val, const QString& nm, uint type_code);
|
||||
|
||||
// TokenDefine interface
|
||||
public:
|
||||
virtual QString reviseWords() const override;
|
||||
virtual QString typeName() 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 reviseWords() const override;
|
||||
virtual QString typeName() 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 reviseWords() const override;
|
||||
virtual QString typeName() 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 reviseWords() const override;
|
||||
virtual QString typeName() 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 reviseWords() const override;
|
||||
virtual QString typeName() 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>>
|
||||
|
|
Loading…
Reference in New Issue