WsParser_VS/libToken/tokens_novel.cpp

218 lines
6.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "tokens_novel.h"
using namespace example_novel;
using namespace lib_token;
TokenContent::TokenContent(int r, int c, uint64_t pos, const QString& t, const QString& p, std::shared_ptr<const ITokenDefine> paramType)
: row_n(r), col_n(c), doc_offset(pos), text_n(t), path_p(p), type_def(paramType) {}
QString TokenContent::file() const { return path_p; }
uint64_t lib_token::TokenContent::position() const {
return doc_offset;
}
QString TokenContent::content() const { return text_n; }
int TokenContent::row() const { return row_n; }
int TokenContent::column() const { return col_n; }
std::shared_ptr<const IWordBase> lib_token::TokenContent::nextWord() const
{
return nullptr;
}
std::shared_ptr<const ITokenDefine> TokenContent::define() const { return this->type_def; }
QString LeftBracket::reviseWords() const { return u8"{"; }
int LeftBracket::typeMark() const
{
return 0x01000000;
}
QString LeftBracket::regex() const { return u8"{"; }
std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IWordBase>>
LeftBracket::analysis(std::shared_ptr<const IWordBase> 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(),
content->position() + regex().length(), t_remains, content->file());
return std::make_tuple(token_inst, remains);
}
return std::make_tuple(token_inst, nullptr);
}
QString RightBracket::reviseWords() const { return u8"}"; }
int RightBracket::typeMark() const
{
return 0x02000000;
}
QString RightBracket::regex() const { return u8"}"; }
QString ReferMark::reviseWords() const { return u8"@"; }
int ReferMark::typeMark() const
{
return 0x03000000;
}
QString ReferMark::regex() const { return u8"@"; }
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 IWordBase>>
Keywords::analysis(std::shared_ptr<const IWordBase> 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 u8"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"; }
int Numbers::typeMark() const
{
return 0x07000000;
}
QString Numbers::regex() const { return u8"^([0-9]+)$"; }
std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IWordBase>>
Numbers::analysis(std::shared_ptr<const IWordBase> 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 VTextSection::reviseWords() const { return u8"<EFBFBD>ı<EFBFBD>"; }
int VTextSection::typeMark() const
{
return 0x09000000;
}
QString VTextSection::regex() const { return u8"^([^\\{\\}\\n@&]+)"; }
std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IWordBase>>
VTextSection::analysis(std::shared_ptr<const IWordBase> 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(),
content->position() + match.length(), remains, content->file());
return std::make_tuple(tinst, t_remains);
}
return std::make_tuple(tinst, nullptr);
}
QString Split::reviseWords() const { return u8"&"; }
int Split::typeMark() const
{
return 0x05000000;
}
QString Split::regex() const { return u8"&"; }
QString NameSection::reviseWords() const { return u8"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"; }
int NameSection::typeMark() const
{
return 0x08000000;
}
QString NameSection::regex() const { return u8"^([^:\\{\\}\\n@&][^\\{\\}\\n@&]*)"; }
std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IWordBase> > NameSection::analysis(std::shared_ptr<const IWordBase> 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(),
content->position() + match.length(), remains, content->file());
return std::make_tuple(tinst, t_remains);
}
return std::make_tuple(tinst, nullptr);
}
QString DeclareSymbo::reviseWords() const {
return u8"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
}
int DeclareSymbo::typeMark() const
{
return 0x0A000000;
}
QString DeclareSymbo::regex() const
{
return u8"#";
}
std::tuple<std::shared_ptr<const IToken>, std::shared_ptr<const IWordBase>> DeclareSymbo::analysis(std::shared_ptr<const IWordBase> 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(),
u8"#", content->file(), shared_from_this());
if (remains.length()) {
auto t_remains = std::make_shared<WordContent>(content->row(), content->column()+1,
content->position() + regex().length(), remains, content->file());
return std::make_tuple(tinst, t_remains);
}
return std::make_tuple(tinst, nullptr);
}