WsParser_VS/libSyntax/tokens_novel.cpp

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) { }