feat: 添加一些方法

This commit is contained in:
msojocs 2023-07-09 22:44:49 +08:00
parent fc4f2347f2
commit 1b995ef08f
9 changed files with 619 additions and 68 deletions

View File

@ -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

View File

@ -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... 0tokenName
* /////
* 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... 0tokenName
*/
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,

View File

@ -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

View File

@ -0,0 +1,17 @@
#include "../../include/wxml.h"
namespace WXML
{
namespace EXPRLib
{
Base::Base(/* args */)
{
}
Base::~Base()
{
}
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View 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)
{
}
}
}

View File

@ -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 )