218 lines
6.8 KiB
C++
218 lines
6.8 KiB
C++
#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"^([^\\{\\}@&]+)"; }
|
||
|
||
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"^([^\\{\\}@&]+)"; }
|
||
|
||
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"'<27><><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);
|
||
}
|