WsParser_VS/libSyntax/tokens_novel.cpp

201 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-11 14:32:10 +00:00
QString LeftBracket::reviseWords() const { return "{"; }
2024-06-19 04:05:43 +00:00
2024-06-20 11:18:41 +00:00
int LeftBracket::typeMark() const
2024-06-19 04:05:43 +00:00
{
return 0x01000000;
}
2024-03-17 07:58:28 +00:00
2025-02-11 14:32:10 +00:00
QString LeftBracket::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>>
LeftBracket::analysis(std::shared_ptr<const IPrimitiveWord> content) const {
2024-03-17 07:58:28 +00:00
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());
2024-03-17 07:58:28 +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(),
content->position() + regex().length(), t_remains, content->file());
2024-03-17 07:58:28 +00:00
return std::make_tuple(token_inst, remains);
}
return std::make_tuple(token_inst, nullptr);
}
2025-02-11 14:32:10 +00:00
QString RightBracket::reviseWords() const { return "}"; }
2024-06-19 04:05:43 +00:00
2024-06-20 11:18:41 +00:00
int RightBracket::typeMark() const
2024-06-19 04:05:43 +00:00
{
return 0x02000000;
}
2024-03-17 07:58:28 +00:00
2025-02-11 14:32:10 +00:00
QString RightBracket::regex() const { return "}"; }
2024-03-17 07:58:28 +00:00
2025-02-11 14:32:10 +00:00
QString ReferMark::reviseWords() const { return "@"; }
2024-06-19 04:05:43 +00:00
2024-06-20 11:18:41 +00:00
int ReferMark::typeMark() const
2024-06-19 04:05:43 +00:00
{
return 0x03000000;
}
2024-03-17 07:58:28 +00:00
2025-02-11 14:32:10 +00:00
QString ReferMark::regex() const { return "@"; }
2024-03-17 07:58:28 +00:00
2024-07-12 22:16:11 +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-08 05:40:36 +00:00
QString Keywords::reviseWords() const { return means_store; }
2024-06-19 04:05:43 +00:00
2024-06-20 11:18:41 +00:00
int Keywords::typeMark() const
2024-06-19 04:05:43 +00:00
{
return 0x06000000 | (0x00ffffff & type_code);
}
2024-03-17 07:58:28 +00:00
2024-06-22 10:53:51 +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>>
Keywords::analysis(std::shared_ptr<const IPrimitiveWord> content) const {
2024-03-17 07:58:28 +00:00
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());
2024-03-17 07:58:28 +00:00
return std::make_tuple(token_inst, nullptr);
}
2025-02-11 14:32:10 +00:00
QString Numbers::reviseWords() const { return "正整数"; }
2024-06-19 04:05:43 +00:00
2024-06-20 11:18:41 +00:00
int Numbers::typeMark() const
2024-06-19 04:05:43 +00:00
{
return 0x07000000;
}
2024-03-17 07:58:28 +00:00
2025-02-11 14:32:10 +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 {
2024-03-17 07:58:28 +00:00
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());
2024-03-17 07:58:28 +00:00
return std::make_tuple(tinst, nullptr);
}
2025-02-11 14:32:10 +00:00
QString VTextSection::reviseWords() const { return "文本"; }
2024-06-19 04:05:43 +00:00
2024-06-20 11:18:41 +00:00
int VTextSection::typeMark() const
2024-06-19 04:05:43 +00:00
{
return 0x09000000;
}
2024-03-17 07:58:28 +00:00
2025-02-11 14:32:10 +00:00
QString VTextSection::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>>
VTextSection::analysis(std::shared_ptr<const IPrimitiveWord> content) const {
2024-03-17 07:58:28 +00:00
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());
2024-03-17 07:58:28 +00:00
if (remains.length()) {
auto t_remains = std::make_shared<WordContent>(content->row(), content->column(),
content->position() + match.length(), remains, content->file());
2024-03-17 07:58:28 +00:00
return std::make_tuple(tinst, t_remains);
}
return std::make_tuple(tinst, nullptr);
}
2025-02-11 14:32:10 +00:00
QString Split::reviseWords() const { return "&"; }
2024-06-19 04:05:43 +00:00
2024-06-20 11:18:41 +00:00
int Split::typeMark() const
2024-06-19 04:05:43 +00:00
{
return 0x05000000;
}
2024-03-17 07:58:28 +00:00
2025-02-11 14:32:10 +00:00
QString Split::regex() const { return "&"; }
2024-03-17 07:58:28 +00:00
2025-02-11 14:32:10 +00:00
QString NameSection::reviseWords() const { return "名称"; }
2024-06-19 04:05:43 +00:00
2024-06-20 11:18:41 +00:00
int NameSection::typeMark() const
2024-06-19 04:05:43 +00:00
{
return 0x08000000;
}
2024-03-17 07:58:28 +00:00
2025-02-11 14:32:10 +00:00
QString NameSection::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> >
NameSection::analysis(std::shared_ptr<const IPrimitiveWord> content) const
2024-03-17 07:58:28 +00:00
{
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());
2024-03-17 07:58:28 +00:00
if (remains.length()) {
auto t_remains = std::make_shared<WordContent>(content->row(), content->column(),
content->position() + match.length(), remains, content->file());
2024-06-20 04:49:26 +00:00
return std::make_tuple(tinst, t_remains);
}
return std::make_tuple(tinst, nullptr);
}
2024-07-12 22:16:11 +00:00
QString DeclareSymbo::reviseWords() const {
2025-02-11 14:32:10 +00:00
return "#";
2024-06-20 04:49:26 +00:00
}
2024-06-20 11:18:41 +00:00
int DeclareSymbo::typeMark() const
2024-06-20 04:49:26 +00:00
{
return 0x0A000000;
}
2024-06-20 11:18:41 +00:00
QString DeclareSymbo::regex() const
2024-06-20 04:49:26 +00:00
{
2025-02-11 14:32:10 +00:00
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>>
DeclareSymbo::analysis(std::shared_ptr<const IPrimitiveWord> content) const
2024-06-20 04:49:26 +00:00
{
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(),
2025-02-11 14:32:10 +00:00
"#", content->file(), shared_from_this());
2024-06-20 04:49:26 +00:00
if (remains.length()) {
auto t_remains = std::make_shared<WordContent>(content->row(), content->column()+1,
content->position() + regex().length(), remains, content->file());
2024-03-17 07:58:28 +00:00
return std::make_tuple(tinst, t_remains);
}
return std::make_tuple(tinst, nullptr);
}