227 lines
6.1 KiB
C++
227 lines
6.1 KiB
C++
#include "tokens_novel.h"
|
|
#include <QtCore/QRegExp>
|
|
#include "tokens_impl.h"
|
|
|
|
using namespace example_novel;
|
|
using namespace lib_token;
|
|
using namespace lib_words;
|
|
|
|
|
|
QString LBracket::reviseWords() const {
|
|
return "{";
|
|
}
|
|
|
|
int LBracket::typeMark() const {
|
|
return 0x01000000;
|
|
}
|
|
|
|
QString LBracket::regex() const {
|
|
return "{";
|
|
}
|
|
|
|
std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IPrimitiveWord>>
|
|
LBracket::analysis(std::shared_ptr<const IPrimitiveWord> content) const {
|
|
auto text = content->content();
|
|
if (!text.startsWith(regex()))
|
|
return std::make_tuple(nullptr, content);
|
|
|
|
auto token_inst = std::make_shared<TokenContent>(content->row(), content->column(), content->position(),
|
|
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<WordContent>(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 RBracket::reviseWords() const {
|
|
return "}";
|
|
}
|
|
|
|
int RBracket::typeMark() const {
|
|
return 0x02000000;
|
|
}
|
|
|
|
QString RBracket::regex() const {
|
|
return "}";
|
|
}
|
|
|
|
QString ReferMk::reviseWords() const {
|
|
return "@";
|
|
}
|
|
|
|
int ReferMk::typeMark() const {
|
|
return 0x03000000;
|
|
}
|
|
|
|
QString ReferMk::regex() const {
|
|
return "@";
|
|
}
|
|
|
|
__keywords::__keywords(const QString& val, uint type_code) : means_store(val), type_code(type_code) { }
|
|
|
|
QString __keywords::reviseWords() const {
|
|
return means_store;
|
|
}
|
|
|
|
int __keywords::typeMark() const {
|
|
return 0x06000000 | (0x00ffffff & type_code);
|
|
}
|
|
|
|
QString __keywords::regex() const {
|
|
return means_store;
|
|
}
|
|
|
|
std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IPrimitiveWord>>
|
|
__keywords::analysis(std::shared_ptr<const IPrimitiveWord> content) const {
|
|
if (content->content() != regex()) {
|
|
return std::make_tuple(nullptr, content);
|
|
}
|
|
|
|
auto token_inst = std::make_shared<TokenContent>(content->row(), content->column(), content->position(),
|
|
content->content(), content->file(), shared_from_this());
|
|
return std::make_tuple(token_inst, nullptr);
|
|
}
|
|
|
|
QString Numbers::reviseWords() const {
|
|
return "正整数";
|
|
}
|
|
|
|
int Numbers::typeMark() const {
|
|
return 0x07000000;
|
|
}
|
|
|
|
QString Numbers::regex() const {
|
|
return "^([0-9]+)$";
|
|
}
|
|
|
|
std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IPrimitiveWord>>
|
|
Numbers::analysis(std::shared_ptr<const IPrimitiveWord> 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<TokenContent>(content->row(), content->column(), content->position(),
|
|
content->content(), content->file(), shared_from_this());
|
|
return std::make_tuple(tinst, nullptr);
|
|
}
|
|
|
|
QString NormalText::reviseWords() const {
|
|
return "文本";
|
|
}
|
|
|
|
int NormalText::typeMark() const {
|
|
return 0x09000000;
|
|
}
|
|
|
|
QString NormalText::regex() const {
|
|
return "^([^\\{\\}@&]+)";
|
|
}
|
|
|
|
std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IPrimitiveWord>>
|
|
NormalText::analysis(std::shared_ptr<const IPrimitiveWord> 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<TokenContent>(content->row(), content->column(), content->position(),
|
|
match, content->file(), shared_from_this());
|
|
if (remains.length()) {
|
|
auto t_remains = std::make_shared<WordContent>(content->row(), content->column() + match.length(), remains, content->file());
|
|
return std::make_tuple(tinst, t_remains);
|
|
}
|
|
return std::make_tuple(tinst, nullptr);
|
|
}
|
|
|
|
QString SplitMk::reviseWords() const {
|
|
return "&";
|
|
}
|
|
|
|
int SplitMk::typeMark() const {
|
|
return 0x05000000;
|
|
}
|
|
|
|
QString SplitMk::regex() const {
|
|
return "&";
|
|
}
|
|
|
|
QString NameText::reviseWords() const {
|
|
return "名称";
|
|
}
|
|
|
|
int NameText::typeMark() const {
|
|
return 0x08000000;
|
|
}
|
|
|
|
QString NameText::regex() const {
|
|
return "^([^\\{\\}@&]+)";
|
|
}
|
|
|
|
std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IPrimitiveWord> >
|
|
NameText::analysis(std::shared_ptr<const IPrimitiveWord> 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<TokenContent>(content->row(), content->column(), content->position(),
|
|
match, content->file(), shared_from_this());
|
|
if (remains.length()) {
|
|
auto t_remains = std::make_shared<WordContent>(content->row(), content->column() + match.length(), remains, content->file());
|
|
return std::make_tuple(tinst, t_remains);
|
|
}
|
|
return std::make_tuple(tinst, nullptr);
|
|
}
|
|
|
|
QString DeclareSymbo::reviseWords() const {
|
|
return "#";
|
|
}
|
|
|
|
int DeclareSymbo::typeMark() const {
|
|
return 0x0A000000;
|
|
}
|
|
|
|
QString DeclareSymbo::regex() const {
|
|
return "#";
|
|
}
|
|
|
|
std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IPrimitiveWord>>
|
|
DeclareSymbo::analysis(std::shared_ptr<const IPrimitiveWord> 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<TokenContent>(content->row(), content->column(), content->position(),
|
|
"#", content->file(), shared_from_this());
|
|
if (remains.length()) {
|
|
auto t_remains = std::make_shared<WordContent>(content->row(), content->column() + regex().length(), remains, content->file());
|
|
return std::make_tuple(tinst, t_remains);
|
|
}
|
|
return std::make_tuple(tinst, nullptr);
|
|
}
|
|
|
|
inline example_novel::RankWord::RankWord() : __keywords("排序", 0xAEu) { }
|
|
|
|
inline example_novel::StoryWord::StoryWord() : __keywords("故事", 0xAAu) { }
|
|
|
|
inline example_novel::SliceWord::SliceWord() : __keywords("情节", 0xAFu) { }
|
|
|
|
inline example_novel::VolumeWord::VolumeWord() : __keywords("分卷", 0xACu) { }
|
|
|
|
inline example_novel::ArticleWord::ArticleWord() : __keywords("章节", 0xADu) { }
|