mirror of
https://github.com/msojocs/wx-compiler.git
synced 2025-07-19 00:00:04 +08:00
feat: 添加一些方法
This commit is contained in:
parent
fc4f2347f2
commit
1b995ef08f
@ -30,10 +30,13 @@ add_executable(wcc
|
||||
src/night/ns_stream.cpp
|
||||
src/night/ns_token.cpp
|
||||
src/night/ns_god/ns_god.cpp
|
||||
src/wxml/expr_lib/base.cpp
|
||||
src/wxml/expr_lib/common.cpp
|
||||
src/wxml/expr_lib/expr_syntax_tree.cpp
|
||||
src/wxml/expr_lib/parser.cpp
|
||||
src/wxml/expr_lib/token.cpp
|
||||
src/wxml/expr_lib/tokenizer.cpp
|
||||
src/wxml/expr_lib/transit_table.cpp
|
||||
src/wxml/compiler.cpp
|
||||
src/wxml/dom_lib/str_cache.cpp
|
||||
src/wxml/dom_lib/wxml_dom.cpp
|
||||
|
@ -522,11 +522,87 @@ namespace WXML
|
||||
{
|
||||
void OutputAsStringOrKeyWord(std::stringstream &,std::string const&,std::string const&, bool &);
|
||||
|
||||
|
||||
class TransitTable
|
||||
{
|
||||
private:
|
||||
/* data */
|
||||
public:
|
||||
TransitTable(/* args */);
|
||||
~TransitTable();
|
||||
static int GetExprNTType(void);
|
||||
static int GetAttrListNTType(void);
|
||||
static void Init(void);
|
||||
};
|
||||
|
||||
class Token
|
||||
{
|
||||
/**
|
||||
* 内存结构:
|
||||
* 00 00 00 00 标识type
|
||||
* 00 00 00 00... 当标识为0时后面为需要的动态字符串tokenName
|
||||
* /////
|
||||
* 03 00 00 00 00 00 00 00 00 00 00 00 70 87 E8 00(std::string地址)
|
||||
*/
|
||||
private:
|
||||
/* data */
|
||||
public:
|
||||
int offset_0;
|
||||
std::string offset_4;
|
||||
std::string offset_12;
|
||||
Token(/* args */);
|
||||
~Token();
|
||||
std::string GetLiteral(void);
|
||||
const char * GetTokenName();
|
||||
};
|
||||
|
||||
using Offset0Type = int();
|
||||
class Base
|
||||
{
|
||||
private:
|
||||
/* data */
|
||||
public:
|
||||
Offset0Type *offset_0;
|
||||
std::string offset_4;
|
||||
std::vector<WXML::EXPRLib::Token> offset_8;
|
||||
// int offset_12 = 0;
|
||||
WXML::EXPRLib::Token offset_28;
|
||||
int offset_32 = 0;
|
||||
Base(/* args */);
|
||||
~Base();
|
||||
};
|
||||
|
||||
class ExprSyntaxTree
|
||||
{
|
||||
private:
|
||||
/* data */
|
||||
public:
|
||||
std::string offset_0;
|
||||
WXML::EXPRLib::Token offset_24;
|
||||
std::vector<std::shared_ptr<WXML::EXPRLib::ExprSyntaxTree>> offset_52;
|
||||
ExprSyntaxTree(/* args */);
|
||||
~ExprSyntaxTree();
|
||||
void RenderAsOps(
|
||||
std::stringstream & a2,
|
||||
std::string const& a3,
|
||||
bool & a4
|
||||
);
|
||||
};
|
||||
|
||||
class Parser
|
||||
{
|
||||
private:
|
||||
/* data */
|
||||
public:
|
||||
/*
|
||||
deque 会占用40个字节
|
||||
E9 3A 55 00 00 00 00 00 38(offset_0) F8 DE 00 08 00 00 00
|
||||
70 F8 DE 00 70 F8 DE 00 70 FA DE 00 44 F8 DE 00
|
||||
70 F8 DE 00 70 F8 DE 00 70 FA DE 00 44 F8 DE 00
|
||||
*/
|
||||
std::deque<std::shared_ptr<WXML::EXPRLib::Base>> offset_0;
|
||||
std::deque<std::shared_ptr<WXML::EXPRLib::ExprSyntaxTree>> offset_40;
|
||||
std::shared_ptr<WXML::EXPRLib::ExprSyntaxTree> offset_80;
|
||||
Parser(/* args */);
|
||||
~Parser();
|
||||
int Parse(
|
||||
@ -538,51 +614,22 @@ namespace WXML
|
||||
bool a7);
|
||||
};
|
||||
|
||||
|
||||
class Tokenizer
|
||||
{
|
||||
private:
|
||||
/* data */
|
||||
public:
|
||||
Tokenizer(/* args */);
|
||||
~Tokenizer();
|
||||
};
|
||||
|
||||
|
||||
class Token
|
||||
{
|
||||
/**
|
||||
* 内存结构:
|
||||
* 00 00 00 00 标识type
|
||||
* 00 00 00 00... 当标识为0时后面为需要的动态字符串tokenName
|
||||
*/
|
||||
private:
|
||||
/* data */
|
||||
public:
|
||||
int offset_0;
|
||||
std::string offset_4;
|
||||
Token(/* args */);
|
||||
~Token();
|
||||
std::string GetLiteral(void);
|
||||
const char * GetTokenName();
|
||||
};
|
||||
|
||||
class ExprSyntaxTree
|
||||
{
|
||||
private:
|
||||
/* data */
|
||||
public:
|
||||
// 006685A0
|
||||
static int TT[0x605C];
|
||||
static bool bInited;
|
||||
std::string offset_0;
|
||||
WXML::EXPRLib::Token offset_24;
|
||||
// offset_52
|
||||
ExprSyntaxTree(/* args */);
|
||||
~ExprSyntaxTree();
|
||||
void RenderAsOps(
|
||||
std::stringstream & a2,
|
||||
std::string const& a3,
|
||||
bool & a4
|
||||
);
|
||||
Tokenizer(/* args */);
|
||||
Tokenizer(char const*,std::string const&,int,int);
|
||||
~Tokenizer();
|
||||
void InitTransitTable(void);
|
||||
int GetTokens(std::vector<WXML::EXPRLib::Token> &,std::string &);
|
||||
};
|
||||
|
||||
enum OPShort
|
||||
{
|
||||
AOP = 2,
|
||||
|
@ -151,6 +151,8 @@ namespace WXML {
|
||||
break;
|
||||
}
|
||||
WXML::EXPRLib::ExprSyntaxTree v70;
|
||||
v70.offset_0 = v85;
|
||||
// v70.offset_0 = v77[i].offset_4;
|
||||
v70.RenderAsOps(a3, v85, v77_b);
|
||||
}
|
||||
else
|
||||
|
17
src/wxml/expr_lib/base.cpp
Normal file
17
src/wxml/expr_lib/base.cpp
Normal file
@ -0,0 +1,17 @@
|
||||
#include "../../include/wxml.h"
|
||||
|
||||
namespace WXML
|
||||
{
|
||||
|
||||
namespace EXPRLib
|
||||
{
|
||||
|
||||
Base::Base(/* args */)
|
||||
{
|
||||
}
|
||||
|
||||
Base::~Base()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
@ -20,6 +20,172 @@ namespace WXML
|
||||
std::string& a6,
|
||||
bool a7)
|
||||
{
|
||||
// WXML::EXPRLib::Parser::Parse - 0
|
||||
this->offset_0.clear();
|
||||
this->offset_40.clear();
|
||||
|
||||
WXML::EXPRLib::Tokenizer v77(&a2[0], a3, a4, a5);
|
||||
std::vector<WXML::EXPRLib::Token> v74;
|
||||
int ret = v77.GetTokens(v74, a6);
|
||||
if (ret)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
|
||||
// WXML::EXPRLib::Parser::Parse - 5
|
||||
// tokenList是空的
|
||||
if (v74.begin() == v74.end())
|
||||
{
|
||||
std::shared_ptr<WXML::EXPRLib::ExprSyntaxTree> v8;
|
||||
this->offset_80 = v8;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// WXML::EXPRLib::Parser::Parse - 10
|
||||
WXML::EXPRLib::Token v82;
|
||||
v82.offset_0 = 5;
|
||||
v74.push_back(v82);
|
||||
|
||||
// WXML::EXPRLib::Parser::Parse - 15
|
||||
std::shared_ptr<WXML::EXPRLib::Base> v68(new WXML::EXPRLib::Base());
|
||||
v68->offset_4 = "$";
|
||||
this->offset_0.push_back(v68);
|
||||
std::shared_ptr<WXML::EXPRLib::Base> v70(new WXML::EXPRLib::Base());
|
||||
if (a7)
|
||||
{
|
||||
v70->offset_4 = WXML::EXPRLib::TransitTable::GetAttrListNTType();
|
||||
}
|
||||
else
|
||||
{
|
||||
v70->offset_4 = WXML::EXPRLib::TransitTable::GetExprNTType();
|
||||
}
|
||||
this->offset_0.push_back(v70);
|
||||
// WXML::EXPRLib::Parser::Parse - 20
|
||||
int v49 = 0;
|
||||
for(auto cur = this->offset_0.rbegin(); cur != this->offset_0.rend(); cur++)
|
||||
{
|
||||
|
||||
auto v72 = *cur;
|
||||
WXML::EXPRLib::Token v84 = v72->offset_8[v49]; // ???
|
||||
int v15 = v72->offset_0();
|
||||
// WXML::EXPRLib::Parser::Parse - 20-1
|
||||
if (v15 == 1)
|
||||
{
|
||||
|
||||
std::string tokenName = v84.GetTokenName();
|
||||
if (v72->offset_4 != tokenName || v49 >= 5)
|
||||
{
|
||||
a6 = "error at token `";
|
||||
a6 += v84.GetLiteral();
|
||||
a6 += "`";
|
||||
return -1;
|
||||
}
|
||||
++v49;
|
||||
this->offset_0.pop_back();
|
||||
if (v84.offset_0 - 1 <= 3)
|
||||
{
|
||||
std::shared_ptr<WXML::EXPRLib::ExprSyntaxTree> v80(new WXML::EXPRLib::ExprSyntaxTree());
|
||||
|
||||
std::string v18 = v84.GetTokenName();
|
||||
v80->offset_0 = v18;
|
||||
this->offset_40.push_back(v80);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
// WXML::EXPRLib::Parser::Parse - 20-2
|
||||
else
|
||||
{
|
||||
if (v15 == 3)
|
||||
{
|
||||
this->offset_0.pop_back();
|
||||
int v47 = v72->offset_28.offset_0;
|
||||
if (v47 == 2)
|
||||
{
|
||||
if (this->offset_40.begin() == this->offset_40.end())
|
||||
{
|
||||
a6 = "interal error: 1001, expr: `";
|
||||
a6 += a2;
|
||||
a6 += "`";
|
||||
return 1001;
|
||||
}
|
||||
auto v78 = this->offset_40.back();
|
||||
this->offset_40.pop_back();
|
||||
if (this->offset_40.begin() == this->offset_40.end())
|
||||
{
|
||||
a6 = "interal error: 1002, expr: `";
|
||||
a6 += a2;
|
||||
a6 += "`";
|
||||
return 1002;
|
||||
}
|
||||
auto v21 = this->offset_40.back();
|
||||
this->offset_40.pop_back();
|
||||
this->offset_40.push_back(v78);
|
||||
|
||||
}
|
||||
///////////////////////
|
||||
else
|
||||
{
|
||||
std::shared_ptr<WXML::EXPRLib::ExprSyntaxTree> v22(new WXML::EXPRLib::ExprSyntaxTree());
|
||||
std::shared_ptr<WXML::EXPRLib::ExprSyntaxTree> v78;
|
||||
v78->offset_0.assign(v72->offset_4);
|
||||
for (size_t i = 0; i < v72->offset_32; i++)
|
||||
{
|
||||
if (this->offset_40.begin() == this->offset_40.end())
|
||||
{
|
||||
a6 = "interal error: 1003, expr: `";
|
||||
a6 += a2;
|
||||
a6 += "`";
|
||||
return 1003;
|
||||
}
|
||||
auto v23 = this->offset_40.back();
|
||||
v78->offset_52.push_back(v23);
|
||||
this->offset_40.pop_back();
|
||||
}
|
||||
|
||||
if (!v47)
|
||||
{
|
||||
if (v78->offset_52.begin() != v78->offset_52.end())
|
||||
{
|
||||
auto v51 = v78->offset_52.begin();
|
||||
for (auto i = v78->offset_52.rbegin(); i < v78->offset_52.rend(); i++)
|
||||
{
|
||||
auto v80 = *v51;
|
||||
*v51 = *i;
|
||||
*i = v80;
|
||||
v51++;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
this->offset_40.push_back(v78);
|
||||
|
||||
}
|
||||
}
|
||||
// WXML::EXPRLib::Parser::Parse - 20-3
|
||||
if ( v15 == 2)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
// while block end
|
||||
|
||||
}
|
||||
|
||||
// WXML::EXPRLib::Parser::Parse - 25
|
||||
if (this->offset_40.begin() == this->offset_40.end())
|
||||
{
|
||||
a6 = "interal error: 1004, expr: `" + a2 + "`";
|
||||
return 1004;
|
||||
}
|
||||
else
|
||||
{
|
||||
auto v37 = this->offset_40.back();
|
||||
this->offset_80 = v37;
|
||||
}
|
||||
// WXML::EXPRLib::Parser::Parse - 30
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -47,13 +47,14 @@ namespace WXML
|
||||
result = "$";
|
||||
if (this->offset_0 != 5)
|
||||
{
|
||||
if (this->offset_4.size())
|
||||
result = "";
|
||||
if (this->offset_12.size())
|
||||
{
|
||||
// return
|
||||
return this->offset_12;
|
||||
}
|
||||
}
|
||||
}
|
||||
return "";
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,13 +2,261 @@
|
||||
|
||||
namespace WXML {
|
||||
namespace EXPRLib {
|
||||
|
||||
inline
|
||||
unsigned char bittest(std::int32_t const *a, std::int32_t b)
|
||||
{
|
||||
auto const bits{ reinterpret_cast<unsigned char const*>(a) };
|
||||
auto const value{ bits[b >> 3] };
|
||||
auto const mask{ (unsigned char)(1 << (b & 7)) };
|
||||
return (value & mask) != 0;
|
||||
}
|
||||
|
||||
int Tokenizer::TT[0x605C];
|
||||
Tokenizer::Tokenizer(/* args */)
|
||||
{
|
||||
}
|
||||
|
||||
Tokenizer::Tokenizer(char const* Str, std::string const& a3, int a4, int a5)
|
||||
{
|
||||
this->offset_0 = Str;
|
||||
}
|
||||
|
||||
Tokenizer::~Tokenizer()
|
||||
{
|
||||
}
|
||||
|
||||
bool Tokenizer::bInited = false;
|
||||
|
||||
void Tokenizer::InitTransitTable(void)
|
||||
{
|
||||
/**
|
||||
* Tokenizer::TT -> 0x006685A0
|
||||
* end -> 0x66E5FC
|
||||
*/
|
||||
if (!Tokenizer::bInited)
|
||||
{
|
||||
Tokenizer::bInited = true;
|
||||
const char* ntr = " \n\t\r";
|
||||
for (const char* i = ntr; ; i++)
|
||||
{
|
||||
char v1 = *i;
|
||||
if (!v1)
|
||||
break;
|
||||
Tokenizer::TT[(0x6689A4 - 0x006685A0) / 4 + v1] = 8388609;
|
||||
}
|
||||
const char* $abc = "$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_";
|
||||
for (const char* j = $abc; ; ++j )
|
||||
{
|
||||
char v3 = *j;
|
||||
if ( !v3 )
|
||||
break;
|
||||
// dword_6689A4[v3] = 13;
|
||||
Tokenizer::TT[(0x6689A4 - 0x006685A0) / 4 + v3] = 13;
|
||||
}
|
||||
const char *_0123 = "0123456789";
|
||||
for ( const char* k = _0123; ; ++k )
|
||||
{
|
||||
char v5 = *k;
|
||||
if ( !v5 )
|
||||
break;
|
||||
// dword_6689A4[v5] = 10;
|
||||
Tokenizer::TT[(0x6689A4 - 0x006685A0) / 4 + v5] = 10;
|
||||
}
|
||||
const char* plus = "+-*/%^~()[],?:{}";
|
||||
for ( const char* m = plus; ; ++m )
|
||||
{
|
||||
char v7 = *m;
|
||||
if ( !v7 )
|
||||
break;
|
||||
// dword_6689A4[v7] = 327681;
|
||||
Tokenizer::TT[(0x6689A4 - 0x006685A0) / 4 + v7] = 327681;
|
||||
}
|
||||
Tokenizer::TT[(0x668A5C - 0x006685A0) / 4] = 3;
|
||||
Tokenizer::TT[(0x668A2C - 0x006685A0) / 4] = 6;
|
||||
Tokenizer::TT[(0x668A40 - 0x006685A0) / 4] = 8;
|
||||
Tokenizer::TT[(0x668A98 - 0x006685A0) / 4] = 12;
|
||||
Tokenizer::TT[(0x668B94 - 0x006685A0) / 4] = 15;
|
||||
Tokenizer::TT[(0x668A3C - 0x006685A0) / 4] = 14;
|
||||
Tokenizer::TT[(0x668A94 - 0x006685A0) / 4] = 16;
|
||||
Tokenizer::TT[(0x668A9C - 0x006685A0) / 4] = 17;
|
||||
Tokenizer::TT[(0x668A28 - 0x006685A0) / 4] = 18;
|
||||
Tokenizer::TT[(0x6689A4 - 0x006685A0) / 4] = 8519681;
|
||||
Tokenizer::TT[(0x668DA4 - 0x006685A0) / 4] = -1;
|
||||
Tokenizer::TT[(0x668A60 - 0x006685A0) / 4] = 21;
|
||||
Tokenizer::TT[(0x66DA9C - 0x006685A0) / 4] = 22;
|
||||
Tokenizer::TT[(0x66DDF4 - 0x006685A0) / 4] = 4325377;
|
||||
Tokenizer::TT[(0x66DEA0 - 0x006685A0) / 4] = 23;
|
||||
Tokenizer::TT[(0x66E1F8 - 0x006685A0) / 4] = 8388630;
|
||||
Tokenizer::TT[(0x66E2B8 - 0x006685A0) / 4] = 8388609;
|
||||
Tokenizer::TT[(0x66E2A4 - 0x006685A0) / 4] = 4194326;
|
||||
Tokenizer::TT[(0x66E5FC - 0x006685A0) / 4] = 22;
|
||||
const char* v8 = $abc;
|
||||
while ( 1 )
|
||||
{
|
||||
char v9 = *v8;
|
||||
if ( !v9 )
|
||||
break;
|
||||
// dword_66B9D4[v9] = 13;
|
||||
Tokenizer::TT[(0x66B9D4 - 0x006685A0) / 4 + v9] = 13;
|
||||
++v8;
|
||||
}
|
||||
for (const char* n = _0123; ; ++n )
|
||||
{
|
||||
char v11 = *n;
|
||||
if ( !v11 )
|
||||
break;
|
||||
// dword_66B9D4[v11] = 13;
|
||||
Tokenizer::TT[(0x66B9D4 - 0x006685A0) / 4 + v11] = 13;
|
||||
}
|
||||
Tokenizer::TT[(0x66BDD4 - 0x006685A0) / 4] = 0x620001;
|
||||
for (const char* n = _0123; ; ++n )
|
||||
{
|
||||
char v11 = *n;
|
||||
if ( !v11 )
|
||||
break;
|
||||
Tokenizer::TT[(0x6691AC - 0x006685A0) / 4 + v11] = 11;
|
||||
}
|
||||
Tokenizer::TT[(0x669264 - 0x006685A0) / 4] = 4;
|
||||
Tokenizer::TT[(0x6695AC - 0x006685A0) / 4] = 0x460001;
|
||||
Tokenizer::TT[(0x669668 - 0x006685A0) / 4] = 327681;
|
||||
Tokenizer::TT[(0x6699B0 - 0x006685A0) / 4] = -1;
|
||||
v8 = _0123;
|
||||
while ( 1 )
|
||||
{
|
||||
char v9 = *v8;
|
||||
if ( !v9 )
|
||||
break;
|
||||
Tokenizer::TT[(0x66ADC8 - 0x006685A0) / 4 + v9] = 10;
|
||||
++v8;
|
||||
}
|
||||
Tokenizer::TT[(0x66AE80 - 0x006685A0) / 4] = 11;
|
||||
Tokenizer::TT[(0x66B1C8 - 0x006685A0) / 4] = 0x4A0001;
|
||||
v8 = _0123;
|
||||
while ( 1 )
|
||||
{
|
||||
char v9 = *v8;
|
||||
if ( !v9 )
|
||||
break;
|
||||
Tokenizer::TT[(0x66B1CC - 0x006685A0) / 4 + v9] = 11;
|
||||
++v8;
|
||||
}
|
||||
Tokenizer::TT[(0x66B5CC - 0x006685A0) / 4] = 0x4A0001;
|
||||
Tokenizer::TT[(0x66B6C4 - 0x006685A0) / 4] = 19;
|
||||
Tokenizer::TT[(0x66B9D0 - 0x006685A0) / 4] = -1;
|
||||
Tokenizer::TT[(0x66D2E0 - 0x006685A0) / 4] = 327681;
|
||||
Tokenizer::TT[(0x66D5EC - 0x006685A0) / 4] = 0x460001;
|
||||
Tokenizer::TT[(0x66BE70 - 0x006685A0) / 4] = 327681;
|
||||
Tokenizer::TT[(0x66C1D8 - 0x006685A0) / 4] = 4325377;
|
||||
Tokenizer::TT[(0x66C3CC - 0x006685A0) / 4] = 327681;
|
||||
Tokenizer::TT[(0x66C5DC - 0x006685A0) / 4] = 4325377;
|
||||
Tokenizer::TT[(0x668E9C - 0x006685A0) / 4] = 327681;
|
||||
Tokenizer::TT[(0x6691A8 - 0x006685A0) / 4] = 0x460001;
|
||||
Tokenizer::TT[(0x669F28 - 0x006685A0) / 4] = 7;
|
||||
Tokenizer::TT[(0x669DE0 - 0x006685A0) / 4] = 9568257;
|
||||
Tokenizer::TT[(0x66A5BC - 0x006685A0) / 4] = 6;
|
||||
Tokenizer::TT[(0x66A1E4 - 0x006685A0) / 4] = 9568257;
|
||||
Tokenizer::TT[(0x669E40 - 0x006685A0) / 4] = 1114113;
|
||||
Tokenizer::TT[(0x66A1B8 - 0x006685A0) / 4] = 6;
|
||||
Tokenizer::TT[(0x66A730 - 0x006685A0) / 4] = 9;
|
||||
Tokenizer::TT[(0x66A5E8 - 0x006685A0) / 4] = 9568257;
|
||||
Tokenizer::TT[(0x66ADC4 - 0x006685A0) / 4] = 8;
|
||||
Tokenizer::TT[(0x66A9EC - 0x006685A0) / 4] = 9568257;
|
||||
Tokenizer::TT[(0x66A65C - 0x006685A0) / 4] = 1114113;
|
||||
Tokenizer::TT[(0x66A9C0 - 0x006685A0) / 4] = 8;
|
||||
Tokenizer::TT[(0x66C6D4 - 0x006685A0) / 4] = 327681;
|
||||
Tokenizer::TT[(0x66C6D0 - 0x006685A0) / 4] = 327681;
|
||||
Tokenizer::TT[(0x66C9E0 - 0x006685A0) / 4] = 0x460001;
|
||||
Tokenizer::TT[(0x66CAD8 - 0x006685A0) / 4] = 327681;
|
||||
Tokenizer::TT[(0x66CADC - 0x006685A0) / 4] = 327681;
|
||||
Tokenizer::TT[(0x66CDE4 - 0x006685A0) / 4] = 0x460001;
|
||||
Tokenizer::TT[(0x66CEDC - 0x006685A0) / 4] = 20;
|
||||
Tokenizer::TT[(0x66D6E4 - 0x006685A0) / 4] = 327681;
|
||||
Tokenizer::TT[(0x66D9F0 - 0x006685A0) / 4] = 0x460001;
|
||||
Tokenizer::TT[(0x66D1E8 - 0x006685A0) / 4] = 0x460001;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
int Tokenizer::GetTokens(std::vector<WXML::EXPRLib::Token> & a2, std::string &a3)
|
||||
{
|
||||
int v21 = 18899;
|
||||
WXML::EXPRLib::Tokenizer::InitTransitTable();
|
||||
int v24 = 1;
|
||||
int v29;
|
||||
for (int v28 = 0; v28 < this->offset_0.size();)
|
||||
{
|
||||
if (!--v21)
|
||||
{
|
||||
a3 = "something must be wrong";
|
||||
return -1;
|
||||
}
|
||||
std::string v25 = this->offset_0;
|
||||
int v3 = this->offset_0[v28];
|
||||
if (v28 == this->offset_0.size())
|
||||
{
|
||||
v3 = 0;
|
||||
}
|
||||
int t = WXML::EXPRLib::Tokenizer::TT[257 * v24 + v3];
|
||||
if (!t)
|
||||
{
|
||||
t = WXML::EXPRLib::Tokenizer::TT[257 * v24];
|
||||
if (!t)
|
||||
{
|
||||
std::stringstream v39;
|
||||
v39 << "no transition for " << v24 << " with input " << v3;
|
||||
a3 = v39.str();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
if (t == -1)
|
||||
{
|
||||
std::stringstream v39;
|
||||
v39 << "unexpected `" << v3 << "` at pos" << v28;
|
||||
a3 = v39.str();
|
||||
}
|
||||
if ((t & 0x30000) != 0)
|
||||
{
|
||||
int v8 = 1;
|
||||
int v27 = ((t & 0x20000) == 0) + v28 - 1;
|
||||
if (!bittest(&t, 0x13u))
|
||||
{
|
||||
v8 = 2;
|
||||
if (!bittest(&t, 0x14u))
|
||||
{
|
||||
v8 = ((t << 10) >> 31) & 3;
|
||||
}
|
||||
}
|
||||
if (v29 <= v27)
|
||||
{
|
||||
WXML::EXPRLib::Token v39;
|
||||
char* KEYWORDS[] = {};
|
||||
if (v8)
|
||||
{
|
||||
char **v31 = KEYWORDS;
|
||||
std::string v26 = this->offset_0.substr(v29, v27 + 1);
|
||||
while (*v31)
|
||||
{
|
||||
if (!strcmp(v26.data(), *v31++))
|
||||
{
|
||||
v39.offset_0 = 4;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
a2.push_back(v39);
|
||||
}
|
||||
v29 = v27 + 1;
|
||||
}
|
||||
}
|
||||
v28 += (t & 0x400000) == 0;
|
||||
if (t &0x800000 != 0)
|
||||
v29 = v28;
|
||||
}
|
||||
return 0;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
28
src/wxml/expr_lib/transit_table.cpp
Normal file
28
src/wxml/expr_lib/transit_table.cpp
Normal file
@ -0,0 +1,28 @@
|
||||
#include "../../include/wxml.h"
|
||||
|
||||
namespace WXML
|
||||
{
|
||||
|
||||
namespace EXPRLib
|
||||
{
|
||||
TransitTable::TransitTable(/* args */)
|
||||
{
|
||||
}
|
||||
|
||||
TransitTable::~TransitTable()
|
||||
{
|
||||
}
|
||||
int TransitTable::GetExprNTType(void)
|
||||
{
|
||||
return 14;
|
||||
}
|
||||
int TransitTable::GetAttrListNTType(void)
|
||||
{
|
||||
return 12;
|
||||
}
|
||||
void Init(void)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -24066,6 +24066,8 @@ int __cdecl WXML::DOMLib::WXMLDom::DealSingleTokenToOps(
|
||||
v86[0] = v109;
|
||||
if ( v109 )
|
||||
std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_add_ref_copy((int)v109);
|
||||
/*
|
||||
*/
|
||||
v70 = v85;
|
||||
std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count((volatile signed __int32 **)v86);
|
||||
std::string::basic_string((void **)&v85, (char *)&byte_5537CA);
|
||||
@ -28741,11 +28743,14 @@ int __thiscall WXML::EXPRLib::Parser::Parse(int this, char **a2, int a3, int a4,
|
||||
int *v84; // [esp+F4h] [ebp-24h] BYREF
|
||||
int v85[3]; // [esp+F8h] [ebp-20h] BYREF
|
||||
volatile signed __int32 *v86[4]; // [esp+104h] [ebp-14h] BYREF
|
||||
|
||||
// WXML::EXPRLib::Parser::Parse - 0
|
||||
// int this
|
||||
// 清空
|
||||
while ( *(_DWORD *)(this + 24) != *(_DWORD *)(this + 8) )
|
||||
std::deque<zcc::shared_ptr<WXML::EXPRLib::Base>>::pop_back((_DWORD *)this);
|
||||
while ( *(_DWORD *)(this + 64) != *(_DWORD *)(this + 48) )
|
||||
std::deque<zcc::shared_ptr<WXML::EXPRLib::ExprSyntaxTree>>::pop_back((_DWORD *)(this + 40));
|
||||
|
||||
if ( !(_BYTE)`guard variable for WXML::EXPRLib::TransitTable::GetInstance(void)::ret
|
||||
&& __cxa_guard_acquire(&`guard variable for WXML::EXPRLib::TransitTable::GetInstance(void)::ret) )
|
||||
{
|
||||
@ -28760,6 +28765,7 @@ int __thiscall WXML::EXPRLib::Parser::Parse(int this, char **a2, int a3, int a4,
|
||||
}
|
||||
WXML::EXPRLib::TransitTable::Init(v41);
|
||||
WXML::EXPRLib::Tokenizer::Tokenizer(v77, *a2, a3, a4, a5);
|
||||
// std::vector<WXML::EXPRLib::Token> v74;
|
||||
v74 = 0;
|
||||
v75 = 0;
|
||||
v76 = 0;
|
||||
@ -28767,12 +28773,14 @@ int __thiscall WXML::EXPRLib::Parser::Parse(int this, char **a2, int a3, int a4,
|
||||
v43 = v7;
|
||||
if ( Tokens )
|
||||
goto LABEL_78;
|
||||
// WXML::EXPRLib::Parser::Parse - 5
|
||||
if ( v74 == (char *)v75 )
|
||||
{
|
||||
// _DWORD *v8; WXML::EXPRLib::ExprSyntaxTree
|
||||
v8 = operator new(0x40u);
|
||||
memset(v8, 0, 0x40u);
|
||||
*v8 = v8 + 2;
|
||||
WXML::EXPRLib::Token::Token(v8 + 6);
|
||||
*v8 = v8 + 2; // std::string地址指向“向后偏移8位”的位置
|
||||
WXML::EXPRLib::Token::Token(v8 + 6); // v8.offset_24
|
||||
v8[13] = 0;
|
||||
v8[14] = 0;
|
||||
v8[15] = 0;
|
||||
@ -28780,8 +28788,10 @@ int __thiscall WXML::EXPRLib::Parser::Parse(int this, char **a2, int a3, int a4,
|
||||
*(_DWORD *)(this + 80) = v84;
|
||||
std::__shared_count<(__gnu_cxx::_Lock_policy)2>::operator=((volatile signed __int32 **)(this + 84), v85[0]);
|
||||
v9 = (volatile signed __int32 **)v85;
|
||||
goto LABEL_77;
|
||||
goto LABEL_77; // 销毁数据,返回
|
||||
}
|
||||
|
||||
// WXML::EXPRLib::Parser::Parse - 10
|
||||
WXML::EXPRLib::Token::Token(v82);
|
||||
v82[0] = 5;
|
||||
if ( v75 == v76 )
|
||||
@ -28797,22 +28807,31 @@ int __thiscall WXML::EXPRLib::Parser::Parse(int this, char **a2, int a3, int a4,
|
||||
WXML::EXPRLib::Token::Token((int *)v75, (WXML::EXPRLib::Token *)v82, v43);
|
||||
v75 += 28;
|
||||
}
|
||||
v11 = operator new(0x38u);
|
||||
*v11 = &off_55F220;
|
||||
v11[1] = v11 + 3;
|
||||
// WXML::EXPRLib::Parser::Parse - 15
|
||||
// _DWORD *v11
|
||||
v11 = operator new(0x38u); // 0x38 -> 56
|
||||
*v11 = &off_55F220; // 函数?
|
||||
v11[1] = v11 + 3; // std::string
|
||||
v11[2] = 0;
|
||||
// v11.offset_12
|
||||
*((_BYTE *)v11 + 12) = 0;
|
||||
// v11.offset_28
|
||||
WXML::EXPRLib::Token::Token(v11 + 7);
|
||||
zcc::shared_ptr<WXML::EXPRLib::Base>::shared_ptr(&v68, (int)v11);
|
||||
Blockh = v68;
|
||||
// Blockh - v68 - v11 WXML::EXPRLib::Base
|
||||
std::string::basic_string((void **)&v84, "$");
|
||||
// Blockh -> v11 -> v68
|
||||
std::string::_M_assign((int)Blockh + 4, (int)&v84);
|
||||
std::string::_M_dispose((void **)&v84);
|
||||
std::deque<zcc::shared_ptr<WXML::EXPRLib::Base>>::push_back(this, (int *)&v68);
|
||||
|
||||
// WXML::EXPRLib::Base
|
||||
v12 = operator new(8u);
|
||||
*v12 = &off_55F1E4;
|
||||
*v12 = &off_55F1E4; // 函数?
|
||||
v12[1] = 0;
|
||||
zcc::shared_ptr<WXML::EXPRLib::Base>::shared_ptr(&v70, (int)v12);
|
||||
// Block - v70 - v12
|
||||
Block = v70;
|
||||
if ( a7 )
|
||||
Block[1] = WXML::EXPRLib::TransitTable::GetAttrListNTType();
|
||||
@ -28822,19 +28841,25 @@ int __thiscall WXML::EXPRLib::Parser::Parse(int this, char **a2, int a3, int a4,
|
||||
v72 = 0;
|
||||
v73 = 0;
|
||||
v49 = 0;
|
||||
// WXML::EXPRLib::Parser::Parse - 20
|
||||
while ( 1 )
|
||||
{
|
||||
v13 = *(_DWORD *)(this + 24);
|
||||
if ( *(_DWORD *)(this + 8) == v13 )
|
||||
// int this
|
||||
v13 = *(_DWORD *)(this + 24); // this->offset_24
|
||||
if ( *(_DWORD *)(this + 8) == v13 ) // this->offset_8
|
||||
break;
|
||||
if ( v13 == *(_DWORD *)(this + 28) )
|
||||
if ( v13 == *(_DWORD *)(this + 28) ) // this->offset_28
|
||||
v13 = *(_DWORD *)(*(_DWORD *)(this + 36) - 4) + 512;
|
||||
v42 = *(_DWORD *)(v13 - 4);
|
||||
// int v13
|
||||
v42 = *(_DWORD *)(v13 - 4); // 00(v72) 00 00 00, 00(v42) 00 00 00(v13) shared_ptr
|
||||
v72 = *(_DWORD **)(v13 - 8);
|
||||
std::__shared_count<(__gnu_cxx::_Lock_policy)2>::operator=(&v73, v42);
|
||||
// v49在递增
|
||||
WXML::EXPRLib::Token::Token((int *)&v84, (WXML::EXPRLib::Token *)&v74[28 * v49], v44);
|
||||
// v72.offset_8
|
||||
v15 = (*(int (__thiscall **)(_DWORD *, int))(*v72 + 8))(v72, v14);
|
||||
Blocka = v72;
|
||||
// WXML::EXPRLib::Parser::Parse - 20-1
|
||||
if ( v15 == 1 )
|
||||
{
|
||||
TokenName = (char *)WXML::EXPRLib::Token::GetTokenName((const char **)&v84);
|
||||
@ -28852,9 +28877,9 @@ int __thiscall WXML::EXPRLib::Parser::Parse(int this, char **a2, int a3, int a4,
|
||||
Blocki[1] = 0;
|
||||
*((_BYTE *)Blocki + 8) = 0;
|
||||
WXML::EXPRLib::Token::Token(Blocki + 6);
|
||||
Blocki[13] = 0;
|
||||
Blocki[14] = 0;
|
||||
Blocki[15] = 0;
|
||||
Blocki[13] = 0; // offset_52
|
||||
Blocki[14] = 0; // offset_56
|
||||
Blocki[15] = 0; // offset_60
|
||||
zcc::shared_ptr<WXML::EXPRLib::ExprSyntaxTree>::shared_ptr(Blocki);
|
||||
Blockb = v80;
|
||||
v80[6] = v84;
|
||||
@ -28868,10 +28893,11 @@ int __thiscall WXML::EXPRLib::Parser::Parse(int this, char **a2, int a3, int a4,
|
||||
std::string::operator=((unsigned int *)v80, v18);
|
||||
std::deque<zcc::shared_ptr<WXML::EXPRLib::ExprSyntaxTree>>::push_back(this + 40, (int *)&v80);
|
||||
v19 = v81;
|
||||
LABEL_37:
|
||||
LABEL_37:
|
||||
std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count(v19);
|
||||
}
|
||||
}
|
||||
// WXML::EXPRLib::Parser::Parse - 20-2
|
||||
else
|
||||
{
|
||||
if ( (*(int (__fastcall **)(_DWORD *))(*v72 + 8))(v72) == 3 )
|
||||
@ -28889,9 +28915,10 @@ LABEL_37:
|
||||
std::string::operator+=(a6, (int)a2);
|
||||
std::string::operator+=(a6, "`");
|
||||
Tokens = 1001;
|
||||
goto LABEL_72;
|
||||
goto LABEL_72; // 销毁数据,return Tokens
|
||||
}
|
||||
v20 = (int *)std::deque<zcc::shared_ptr<WXML::EXPRLib::ExprSyntaxTree>>::back((_DWORD *)(this + 40));
|
||||
// v78 - v20
|
||||
std::__shared_ptr<WXML::EXPRLib::ExprSyntaxTree,(__gnu_cxx::_Lock_policy)2>::__shared_ptr((int *)&v78, v20);
|
||||
std::deque<zcc::shared_ptr<WXML::EXPRLib::ExprSyntaxTree>>::pop_back((_DWORD *)(this + 40));
|
||||
if ( *(_DWORD *)(this + 64) == *(_DWORD *)(this + 48) )
|
||||
@ -28903,13 +28930,14 @@ LABEL_37:
|
||||
std::string::operator+=(a6, "`");
|
||||
std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count(v79);
|
||||
Tokens = 1002;
|
||||
goto LABEL_72;
|
||||
goto LABEL_72; // 销毁数据,return Tokens
|
||||
}
|
||||
v21 = (int *)std::deque<zcc::shared_ptr<WXML::EXPRLib::ExprSyntaxTree>>::back((_DWORD *)(this + 40));
|
||||
std::__shared_ptr<WXML::EXPRLib::ExprSyntaxTree,(__gnu_cxx::_Lock_policy)2>::__shared_ptr((int *)&v80, v21);
|
||||
std::vector<zcc::shared_ptr<WXML::EXPRLib::ExprSyntaxTree>>::push_back(v80 + 13, (int *)&v78);
|
||||
std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count(v81);
|
||||
}
|
||||
//////////////////////
|
||||
else
|
||||
{
|
||||
v45 = v72[8];
|
||||
@ -28921,7 +28949,10 @@ LABEL_37:
|
||||
v22[14] = 0;
|
||||
v22[15] = 0;
|
||||
zcc::shared_ptr<WXML::EXPRLib::ExprSyntaxTree>::shared_ptr(v22);
|
||||
std::string::_M_assign((int)v78, (int)(v50 + 1));
|
||||
|
||||
// OP_PATH...
|
||||
std::string::_M_assign((int)v78, (int)(v50 + 1)); // v50 -> v72
|
||||
|
||||
for ( Blockc = 0; (int)Blockc < v45; ++Blockc )
|
||||
{
|
||||
if ( *(_DWORD *)(this + 64) == *(_DWORD *)(this + 48) )
|
||||
@ -28933,28 +28964,31 @@ LABEL_37:
|
||||
std::string::operator+=(a6, "`");
|
||||
std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count(v79);
|
||||
Tokens = 1003;
|
||||
goto LABEL_72;
|
||||
goto LABEL_72; // 销毁数据,return Tokens
|
||||
}
|
||||
v23 = (int *)std::deque<zcc::shared_ptr<WXML::EXPRLib::ExprSyntaxTree>>::back((_DWORD *)(this + 40));
|
||||
// v78.offset_52
|
||||
std::vector<zcc::shared_ptr<WXML::EXPRLib::ExprSyntaxTree>>::push_back(v78 + 13, v23);
|
||||
std::deque<zcc::shared_ptr<WXML::EXPRLib::ExprSyntaxTree>>::pop_back((_DWORD *)(this + 40));
|
||||
}
|
||||
if ( !v47 )
|
||||
{
|
||||
// v78->offset_56
|
||||
v24 = v78[14];
|
||||
if ( v78[13] != v24 )
|
||||
{
|
||||
v51 = v78[13];
|
||||
v51 = v78[13]; // WXML::EXPRLib::ExprSyntaxTree
|
||||
for ( Blockd = (volatile signed __int32 **)(v24 - 2); Blockd > (volatile signed __int32 **)v51; Blockd -= 2 )
|
||||
{
|
||||
std::__shared_ptr<WXML::EXPRLib::ExprSyntaxTree,(__gnu_cxx::_Lock_policy)2>::__shared_ptr(
|
||||
(int *)&v80,
|
||||
v51);
|
||||
*v51 = (int)*Blockd;
|
||||
*v51 = (int)*Blockd; // cur
|
||||
std::__shared_count<(__gnu_cxx::_Lock_policy)2>::operator=(
|
||||
(volatile signed __int32 **)v51 + 1,
|
||||
(int)Blockd[1]);
|
||||
*Blockd = (volatile signed __int32 *)v80;
|
||||
// v80 - v51
|
||||
std::__shared_count<(__gnu_cxx::_Lock_policy)2>::operator=(Blockd + 1, (int)v81[0]);
|
||||
std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count(v81);
|
||||
v51 += 2;
|
||||
@ -28966,6 +29000,7 @@ LABEL_37:
|
||||
v19 = v79;
|
||||
goto LABEL_37;
|
||||
}
|
||||
// WXML::EXPRLib::Parser::Parse - 20-3
|
||||
if ( (*(int (__fastcall **)(_DWORD *))(*v72 + 8))(v72) == 2 )
|
||||
{
|
||||
v67 = v72[1];
|
||||
@ -29020,14 +29055,14 @@ LABEL_37:
|
||||
if ( Blockf )
|
||||
{
|
||||
std::string::operator=(a6, "unexpected token `");
|
||||
LABEL_66:
|
||||
LABEL_66:
|
||||
Literal = (char *)WXML::EXPRLib::Token::GetLiteral(&v84);
|
||||
std::string::operator+=(a6, Literal);
|
||||
std::string::operator+=(a6, "`");
|
||||
Tokens = -1;
|
||||
LABEL_72:
|
||||
LABEL_72: // 销毁数据,return Tokens
|
||||
std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count(v86);
|
||||
goto LABEL_76;
|
||||
goto LABEL_76; // 销毁数据,return Tokens
|
||||
}
|
||||
std::deque<zcc::shared_ptr<WXML::EXPRLib::Base>>::pop_back((_DWORD *)this);
|
||||
v34 = (char *)WXML::EXPRLib::Token::GetTokenName((const char **)&v84);
|
||||
@ -29048,6 +29083,7 @@ LABEL_72:
|
||||
}
|
||||
std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count(v86);
|
||||
}
|
||||
// WXML::EXPRLib::Parser::Parse - 25
|
||||
if ( *(_DWORD *)(this + 64) == *(_DWORD *)(this + 48) )
|
||||
{
|
||||
std::string::operator=(a6, "interal error: ");
|
||||
@ -29065,6 +29101,7 @@ LABEL_72:
|
||||
*(_DWORD *)(this + 80) = v38;
|
||||
std::__shared_count<(__gnu_cxx::_Lock_policy)2>::operator=((volatile signed __int32 **)(this + 84), v39);
|
||||
}
|
||||
// WXML::EXPRLib::Parser::Parse - 30
|
||||
LABEL_76:
|
||||
std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count(&v73);
|
||||
std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count(&v71);
|
||||
@ -29237,6 +29274,7 @@ const char *__fastcall WXML::EXPRLib::Token::GetLiteral(_DWORD *a1)
|
||||
result = "$";
|
||||
if ( *a1 != 5 )
|
||||
{
|
||||
// a1->offset_12
|
||||
v2 = a1[3];
|
||||
result = (const char *)&unk_5545E0;
|
||||
if ( v2 )
|
||||
@ -29473,7 +29511,7 @@ unsigned int __thiscall WXML::EXPRLib::Tokenizer::Tokenizer(void **this, char *S
|
||||
size_t v6; // eax
|
||||
void **v8; // [esp+1Ch] [ebp-Ch]
|
||||
|
||||
*this = this + 2;
|
||||
*this = this + 2; // std::string缓冲区
|
||||
v5 = -1;
|
||||
if ( Str )
|
||||
{
|
||||
@ -29712,6 +29750,7 @@ int __thiscall WXML::EXPRLib::Tokenizer::GetTokens(int *this, _DWORD *a2, unsign
|
||||
std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count(&v42);
|
||||
}
|
||||
}
|
||||
// v19 临时存储,其它弟妹没用到
|
||||
v19 = v29;
|
||||
v28 += ((unsigned int)lpuexcpt & 0x400000) == 0;
|
||||
if ( ((unsigned int)lpuexcpt & 0x800000) != 0 )
|
||||
|
Loading…
x
Reference in New Issue
Block a user