From 1b995ef08fbf612693811610b8819b93d58f35ad Mon Sep 17 00:00:00 2001 From: msojocs Date: Sun, 9 Jul 2023 22:44:49 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 3 + src/include/wxml.h | 123 +++++++++----- src/wxml/dom_lib/wxml_dom.cpp | 2 + src/wxml/expr_lib/base.cpp | 17 ++ src/wxml/expr_lib/parser.cpp | 166 ++++++++++++++++++ src/wxml/expr_lib/token.cpp | 7 +- src/wxml/expr_lib/tokenizer.cpp | 250 +++++++++++++++++++++++++++- src/wxml/expr_lib/transit_table.cpp | 28 ++++ test/wcc.disassembly.cpp | 91 +++++++--- 9 files changed, 619 insertions(+), 68 deletions(-) create mode 100644 src/wxml/expr_lib/base.cpp create mode 100644 src/wxml/expr_lib/transit_table.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 604990f..05f19f9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 diff --git a/src/include/wxml.h b/src/include/wxml.h index 6cddafb..7ea6d0a 100644 --- a/src/include/wxml.h +++ b/src/include/wxml.h @@ -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 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> 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> offset_0; + std::deque> offset_40; + std::shared_ptr 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 &,std::string &); }; + enum OPShort { AOP = 2, diff --git a/src/wxml/dom_lib/wxml_dom.cpp b/src/wxml/dom_lib/wxml_dom.cpp index 6daf066..6bfbf0c 100644 --- a/src/wxml/dom_lib/wxml_dom.cpp +++ b/src/wxml/dom_lib/wxml_dom.cpp @@ -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 diff --git a/src/wxml/expr_lib/base.cpp b/src/wxml/expr_lib/base.cpp new file mode 100644 index 0000000..2f8694a --- /dev/null +++ b/src/wxml/expr_lib/base.cpp @@ -0,0 +1,17 @@ +#include "../../include/wxml.h" + +namespace WXML +{ + + namespace EXPRLib + { + + Base::Base(/* args */) + { + } + + Base::~Base() + { + } + } +} \ No newline at end of file diff --git a/src/wxml/expr_lib/parser.cpp b/src/wxml/expr_lib/parser.cpp index 5f0e3de..3bf5353 100644 --- a/src/wxml/expr_lib/parser.cpp +++ b/src/wxml/expr_lib/parser.cpp @@ -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 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 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 v68(new WXML::EXPRLib::Base()); + v68->offset_4 = "$"; + this->offset_0.push_back(v68); + std::shared_ptr 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 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 v22(new WXML::EXPRLib::ExprSyntaxTree()); + std::shared_ptr 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; } } diff --git a/src/wxml/expr_lib/token.cpp b/src/wxml/expr_lib/token.cpp index 275a3bb..254f141 100644 --- a/src/wxml/expr_lib/token.cpp +++ b/src/wxml/expr_lib/token.cpp @@ -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; } } } diff --git a/src/wxml/expr_lib/tokenizer.cpp b/src/wxml/expr_lib/tokenizer.cpp index e306d6b..f43a76e 100644 --- a/src/wxml/expr_lib/tokenizer.cpp +++ b/src/wxml/expr_lib/tokenizer.cpp @@ -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(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 & 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; + + } } } \ No newline at end of file diff --git a/src/wxml/expr_lib/transit_table.cpp b/src/wxml/expr_lib/transit_table.cpp new file mode 100644 index 0000000..f23801a --- /dev/null +++ b/src/wxml/expr_lib/transit_table.cpp @@ -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) + { + + } + } +} \ No newline at end of file diff --git a/test/wcc.disassembly.cpp b/test/wcc.disassembly.cpp index 71ef55d..93d03ae 100644 --- a/test/wcc.disassembly.cpp +++ b/test/wcc.disassembly.cpp @@ -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>::pop_back((_DWORD *)this); while ( *(_DWORD *)(this + 64) != *(_DWORD *)(this + 48) ) std::deque>::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 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::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>::push_back(this, (int *)&v68); + + // WXML::EXPRLib::Base v12 = operator new(8u); - *v12 = &off_55F1E4; + *v12 = &off_55F1E4; // 函数? v12[1] = 0; zcc::shared_ptr::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::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>::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>::back((_DWORD *)(this + 40)); + // v78 - v20 std::__shared_ptr::__shared_ptr((int *)&v78, v20); std::deque>::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>::back((_DWORD *)(this + 40)); std::__shared_ptr::__shared_ptr((int *)&v80, v21); std::vector>::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::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>::back((_DWORD *)(this + 40)); + // v78.offset_52 std::vector>::push_back(v78 + 13, v23); std::deque>::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::__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>::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 )