WsParser_VS/libSyntax/tokens_novel.cpp

229 lines
6.2 KiB
C++
Raw Normal View History

2024-03-17 07:58:28 +00:00
#include "tokens_novel.h"
2025-02-02 12:54:32 +00:00
#include <QtCore/QRegExp>
2025-02-07 15:26:20 +00:00
#include "tokens_impl.h"
2024-03-17 07:58:28 +00:00
using namespace example_novel;
2024-06-18 13:17:06 +00:00
using namespace lib_token;
2025-02-02 12:54:32 +00:00
using namespace lib_words;
2024-03-17 07:58:28 +00:00
2024-06-20 04:49:26 +00:00
2025-02-12 13:50:45 +00:00
QString LBracket::reviseWords() const {
return "{";
}
2024-06-19 04:05:43 +00:00
2025-02-12 13:50:45 +00:00
int LBracket::typeMark() const {
return 0x01000000;
2024-06-19 04:05:43 +00:00
}
2024-03-17 07:58:28 +00:00
2025-02-12 13:50:45 +00:00
QString LBracket::regex() const {
return "{";
}
2024-03-17 07:58:28 +00:00
2025-02-04 14:26:34 +00:00
std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IPrimitiveWord>>
2025-02-11 15:36:30 +00:00
LBracket::analysis(std::shared_ptr<const IPrimitiveWord> content) const {
2025-02-12 13:50:45 +00:00
auto text = content->content();
if (!text.startsWith(regex()))
return std::make_tuple(nullptr, content);
2024-03-17 07:58:28 +00:00
2025-02-12 13:50:45 +00:00
auto token_inst = std::make_shared<TokenContent>(content->row(), content->column(), content->position(),
content->content().mid(0, regex().length()), content->file(), shared_from_this());
2025-02-12 13:50:45 +00:00
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);
2024-03-17 07:58:28 +00:00
}
2025-02-12 13:50:45 +00:00
QString RBracket::reviseWords() const {
return "}";
}
2024-06-19 04:05:43 +00:00
2025-02-12 13:50:45 +00:00
int RBracket::typeMark() const {
return 0x02000000;
2024-06-19 04:05:43 +00:00
}
2024-03-17 07:58:28 +00:00
2025-02-12 13:50:45 +00:00
QString RBracket::regex() const {
return "}";
}
2024-03-17 07:58:28 +00:00
2025-02-12 13:50:45 +00:00
QString ReferMk::reviseWords() const {
return "@";
}
2024-06-19 04:05:43 +00:00
2025-02-12 13:50:45 +00:00
int ReferMk::typeMark() const {
return 0x03000000;
2024-06-19 04:05:43 +00:00
}
2024-03-17 07:58:28 +00:00
2025-02-12 13:50:45 +00:00
QString ReferMk::regex() const {
return "@";
}
2024-03-17 07:58:28 +00:00
2025-02-12 13:50:45 +00:00
__keywords::__keywords(const QString& val, uint type_code) : means_store(val), type_code(type_code) { }
2024-03-17 07:58:28 +00:00
2025-02-12 13:50:45 +00:00
QString __keywords::reviseWords() const {
return means_store;
}
2024-06-19 04:05:43 +00:00
2025-02-12 13:50:45 +00:00
int __keywords::typeMark() const {
return 0x06000000 | (0x00ffffff & type_code);
2024-06-19 04:05:43 +00:00
}
2024-03-17 07:58:28 +00:00
2025-02-12 13:50:45 +00:00
QString __keywords::regex() const {
return means_store;
}
2024-03-17 07:58:28 +00:00
2025-02-04 14:26:34 +00:00
std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IPrimitiveWord>>
2025-02-12 02:15:26 +00:00
__keywords::analysis(std::shared_ptr<const IPrimitiveWord> content) const {
2025-02-12 13:50:45 +00:00
if (content->content() != regex()) {
return std::make_tuple(nullptr, content);
}
2024-03-17 07:58:28 +00:00
2025-02-12 13:50:45 +00:00
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);
2024-03-17 07:58:28 +00:00
}
2025-02-12 13:50:45 +00:00
QString Numbers::reviseWords() const {
return "正整数";
}
2024-06-19 04:05:43 +00:00
2025-02-12 13:50:45 +00:00
int Numbers::typeMark() const {
return 0x07000000;
2024-06-19 04:05:43 +00:00
}
2024-03-17 07:58:28 +00:00
2025-02-12 13:50:45 +00:00
QString Numbers::regex() const {
return "^([0-9]+)$";
}
2024-03-17 07:58:28 +00:00
2025-02-04 14:26:34 +00:00
std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IPrimitiveWord>>
Numbers::analysis(std::shared_ptr<const IPrimitiveWord> content) const {
2025-02-12 13:50:45 +00:00
auto text = content->content();
QRegExp regx(regex());
if (regx.indexIn(text) == -1)
return std::make_tuple(nullptr, content);
2024-03-17 07:58:28 +00:00
2025-02-12 13:50:45 +00:00
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);
2024-03-17 07:58:28 +00:00
}
2025-02-12 13:50:45 +00:00
QString NormalText::reviseWords() const {
return "文本";
}
2024-06-19 04:05:43 +00:00
2025-02-12 13:50:45 +00:00
int NormalText::typeMark() const {
return 0x09000000;
2024-06-19 04:05:43 +00:00
}
2024-03-17 07:58:28 +00:00
2025-02-12 13:50:45 +00:00
QString NormalText::regex() const {
return "^([^\\{\\}@&]+)";
}
2024-03-17 07:58:28 +00:00
2025-02-04 14:26:34 +00:00
std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IPrimitiveWord>>
2025-02-11 15:36:30 +00:00
NormalText::analysis(std::shared_ptr<const IPrimitiveWord> content) const {
2025-02-12 13:50:45 +00:00
auto text = content->content();
QRegExp regx(regex());
if (regx.indexIn(text) == -1) {
return std::make_tuple(nullptr, content);
}
2024-03-17 07:58:28 +00:00
2025-02-12 13:50:45 +00:00
auto match = regx.cap(1);
auto remains = content->content().mid(match.length());
2024-03-17 07:58:28 +00:00
2025-02-12 13:50:45 +00:00
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);
2024-03-17 07:58:28 +00:00
}
2025-02-12 13:50:45 +00:00
QString SplitMk::reviseWords() const {
return "&";
}
2024-06-19 04:05:43 +00:00
2025-02-12 13:50:45 +00:00
int SplitMk::typeMark() const {
return 0x05000000;
2024-06-19 04:05:43 +00:00
}
2024-03-17 07:58:28 +00:00
2025-02-12 13:50:45 +00:00
QString SplitMk::regex() const {
return "&";
}
2024-03-17 07:58:28 +00:00
2025-02-12 13:50:45 +00:00
QString NameText::reviseWords() const {
return "名称";
}
2024-06-19 04:05:43 +00:00
2025-02-12 13:50:45 +00:00
int NameText::typeMark() const {
return 0x08000000;
2024-06-19 04:05:43 +00:00
}
2024-03-17 07:58:28 +00:00
2025-02-12 13:50:45 +00:00
QString NameText::regex() const {
return "^([^\\{\\}@&]+)";
}
2024-03-17 07:58:28 +00:00
2025-02-04 14:26:34 +00:00
std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IPrimitiveWord> >
2025-02-12 13:50:45 +00:00
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);
2024-06-20 04:49:26 +00:00
}
2024-07-12 22:16:11 +00:00
QString DeclareSymbo::reviseWords() const {
2025-02-12 13:50:45 +00:00
return "#";
2024-06-20 04:49:26 +00:00
}
2025-02-12 13:50:45 +00:00
int DeclareSymbo::typeMark() const {
return 0x0A000000;
2024-06-20 04:49:26 +00:00
}
2025-02-12 13:50:45 +00:00
QString DeclareSymbo::regex() const {
return "#";
2024-06-20 04:49:26 +00:00
}
2025-02-04 14:26:34 +00:00
std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IPrimitiveWord>>
2025-02-12 13:50:45 +00:00
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);
2024-03-17 07:58:28 +00:00
}
2025-02-11 15:36:30 +00:00
2025-02-12 02:15:26 +00:00
inline example_novel::RankWord::RankWord() : __keywords("排序", 0xAEu) { }
2025-02-11 15:36:30 +00:00
2025-02-12 02:15:26 +00:00
inline example_novel::StoryWord::StoryWord() : __keywords("故事", 0xAAu) { }
2025-02-11 15:36:30 +00:00
2025-02-12 02:15:26 +00:00
inline example_novel::SliceWord::SliceWord() : __keywords("剧情", 0xAFu) { }
2025-02-11 15:36:30 +00:00
2025-02-12 02:15:26 +00:00
inline example_novel::PointWord::PointWord() : __keywords("节点", 0xABu) { }
2025-02-11 15:36:30 +00:00
2025-02-12 02:15:26 +00:00
inline example_novel::VolumeWord::VolumeWord() : __keywords("分卷", 0xACu) { }
2025-02-11 15:36:30 +00:00
2025-02-12 02:15:26 +00:00
inline example_novel::ArticleWord::ArticleWord() : __keywords("章节", 0xADu) { }