#include "tokens_novel.h" using namespace example_novel; using namespace lib_token; TokenContent::TokenContent(int r, int c, const QString& t, const QString& p, std::shared_ptr paramType) : row_n(r), col_n(c), text_n(t), path_p(p), type_def(paramType) {} QString TokenContent::file() const { return path_p; } QString TokenContent::content() const { return text_n; } int TokenContent::row() const { return row_n; } int TokenContent::column() const { return col_n; } std::shared_ptr lib_token::TokenContent::nextWord() const { return nullptr; } std::shared_ptr TokenContent::define() const { return this->type_def; } QString LeftBracket::typeName() const { return u8"left-bracket"; } int LeftBracket::typeMark() const { return 0x01000000; } QString LeftBracket::regex() const { return u8"{"; } std::tuple, std::shared_ptr> LeftBracket::analysis(std::shared_ptr content) const { auto text = content->content(); if (!text.startsWith(regex())) return std::make_tuple(nullptr, content); auto token_inst = std::make_shared(content->row(), content->column(), content->content().mid(0, regex().length()), content->file(), shared_from_this()); auto t_remains = content->content().mid(regex().length()); if (t_remains.length() > 0) { auto remains = std::make_shared(content->row(), content->column() + regex().length(), t_remains, content->file()); return std::make_tuple(token_inst, remains); } return std::make_tuple(token_inst, nullptr); } QString RightBracket::typeName() const { return u8"right-bracket"; } int RightBracket::typeMark() const { return 0x02000000; } QString RightBracket::regex() const { return u8"}"; } QString ReferMark::typeName() const { return u8"refer-mark"; } int ReferMark::typeMark() const { return 0x03000000; } 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) {} QString Keywords::typeName() const { return name_store; } int Keywords::typeMark() const { return 0x06000000 | (0x00ffffff & type_code); } QString Keywords::regex() const { return means_store; } std::tuple, std::shared_ptr> Keywords::analysis(std::shared_ptr content) const { if (content->content() != regex()) { return std::make_tuple(nullptr, content); } auto token_inst = std::make_shared(content->row(), content->column(), content->content(), content->file(), shared_from_this()); return std::make_tuple(token_inst, nullptr); } QString NewLine::typeName() const { return u8"new-line"; } int NewLine::typeMark() const { return 0x04000000; } QString NewLine::regex() const { return u8"\n"; } QString Numbers::typeName() const { return u8"numbers"; } int Numbers::typeMark() const { return 0x07000000; } QString Numbers::regex() const { return u8"^([0-9]+)$"; } std::tuple, std::shared_ptr> Numbers::analysis(std::shared_ptr content) const { auto text = content->content(); QRegExp regx(regex()); if (regx.indexIn(text) == -1) return std::make_tuple(nullptr, content); auto tinst = std::make_shared(content->row(), content->column(), content->content(), content->file(), shared_from_this()); return std::make_tuple(tinst, nullptr); } QString VTextSection::typeName() const { return u8"text-section"; } int VTextSection::typeMark() const { return 0x09000000; } QString VTextSection::regex() const { return u8"^([^\\{\\}\\n@&]+)"; } std::tuple, std::shared_ptr> VTextSection::analysis(std::shared_ptr content) const { auto text = content->content(); QRegExp regx(regex()); if (regx.indexIn(text) == -1) { return std::make_tuple(nullptr, content); } auto match = regx.cap(1); auto remains = content->content().mid(match.length()); auto tinst = std::make_shared(content->row(), content->column(), match, content->file(), shared_from_this()); if (remains.length()) { auto t_remains = std::make_shared(content->row(), content->column(), remains, content->file()); return std::make_tuple(tinst, t_remains); } return std::make_tuple(tinst, nullptr); } QString Split::typeName() const { return u8"split-mark"; } int Split::typeMark() const { return 0x05000000; } QString Split::regex() const { return u8"&"; } QString NameSection::typeName() const { return u8"name-section"; } int NameSection::typeMark() const { return 0x08000000; } QString NameSection::regex() const { return u8"^([^:\\{\\}\\n@&][^\\{\\}\\n@&]*)"; } std::tuple, std::shared_ptr > NameSection::analysis(std::shared_ptr content) const { auto text = content->content(); QRegExp regx(regex()); if (regx.indexIn(text) == -1) { return std::make_tuple(nullptr, content); } auto match = regx.cap(1); auto remains = content->content().mid(match.length()); auto tinst = std::make_shared(content->row(), content->column(), match, content->file(), shared_from_this()); if (remains.length()) { auto t_remains = std::make_shared(content->row(), content->column(), remains, content->file()); return std::make_tuple(tinst, t_remains); } return std::make_tuple(tinst, nullptr); } QString DeclareSymbo::typeName() const { return u8"ÉùÃ÷·û"; } int DeclareSymbo::typeMark() const { return 0x0A000000; } QString DeclareSymbo::regex() const { return u8"#"; } std::tuple, std::shared_ptr> DeclareSymbo::analysis(std::shared_ptr content) const { auto text = content->content(); if (content->column() != 1 && !text.startsWith(regex())) { return std::make_tuple(nullptr, content); } auto remains = content->content().mid(regex().size()); auto tinst = std::make_shared(content->row(), content->column(), u8"#", content->file(), shared_from_this()); if (remains.length()) { auto t_remains = std::make_shared(content->row(), content->column()+1, remains, content->file()); return std::make_tuple(tinst, t_remains); } return std::make_tuple(tinst, nullptr); }