mirror of
https://github.com/msojocs/wx-compiler.git
synced 2025-07-19 00:00:04 +08:00
perf: 补全Parser::DOM
This commit is contained in:
parent
8ed2005d62
commit
0bd30975f3
@ -65,8 +65,6 @@ namespace WXML
|
|||||||
private:
|
private:
|
||||||
/* data */
|
/* data */
|
||||||
std::string offset_0; // content
|
std::string offset_0; // content
|
||||||
int offset_16 = 0; // pos
|
|
||||||
int offset_20 = 0; // size
|
|
||||||
bool offset_28; // hasCache toString
|
bool offset_28; // hasCache toString
|
||||||
std::string offset_32; // chcheData toString
|
std::string offset_32; // chcheData toString
|
||||||
bool offset_84; // hasCache attrContent
|
bool offset_84; // hasCache attrContent
|
||||||
@ -74,6 +72,9 @@ namespace WXML
|
|||||||
public:
|
public:
|
||||||
int offset_8 = 0; // ???
|
int offset_8 = 0; // ???
|
||||||
int offset_12 = 0; // ???
|
int offset_12 = 0; // ???
|
||||||
|
int offset_16 = 0; // pos
|
||||||
|
int offset_20 = 0; // size
|
||||||
|
int offset_24 = 0; // ???
|
||||||
int offset_40 = 0; // AttrsCompartor用到,怎么来不知道
|
int offset_40 = 0; // AttrsCompartor用到,怎么来不知道
|
||||||
int offset_56 = 0; // ??? -3, -1
|
int offset_56 = 0; // ??? -3, -1
|
||||||
std::string offset_60; // ???
|
std::string offset_60; // ???
|
||||||
@ -220,7 +221,6 @@ namespace WXML
|
|||||||
bool offset_28;
|
bool offset_28;
|
||||||
std::map<std::string, WXML::DOMLib::Token> offset_48;
|
std::map<std::string, WXML::DOMLib::Token> offset_48;
|
||||||
// std::string offset_52;
|
// std::string offset_52;
|
||||||
WXML::DOMLib::Token offset_84; // token
|
|
||||||
int offset_92; // pos1
|
int offset_92; // pos1
|
||||||
int offset_96; // pos2
|
int offset_96; // pos2
|
||||||
int offset_104; // len
|
int offset_104; // len
|
||||||
@ -231,8 +231,10 @@ namespace WXML
|
|||||||
public:
|
public:
|
||||||
std::string offset_0; // type
|
std::string offset_0; // type
|
||||||
std::map<std::string, WXML::DOMLib::Token> offset_12;
|
std::map<std::string, WXML::DOMLib::Token> offset_12;
|
||||||
int offset_24; // ???
|
std::string offset_24; // ???
|
||||||
|
std::vector<std::shared_ptr<WXML::DOMLib::WXMLDom>> offset_72; //
|
||||||
int offset_256; // ???
|
int offset_256; // ???
|
||||||
|
WXML::DOMLib::Token offset_84; // token
|
||||||
WXMLDom(/* args */);
|
WXMLDom(/* args */);
|
||||||
~WXMLDom();
|
~WXMLDom();
|
||||||
std::string Error(
|
std::string Error(
|
||||||
@ -312,15 +314,18 @@ namespace WXML
|
|||||||
private:
|
private:
|
||||||
/* data */
|
/* data */
|
||||||
std::shared_ptr<WXML::DOMLib::WXMLDom> dom;
|
std::shared_ptr<WXML::DOMLib::WXMLDom> dom;
|
||||||
std::deque<std::string> dequeStr;
|
|
||||||
std::vector<WXML::DOMLib::Token> tokenList;
|
std::vector<WXML::DOMLib::Token> tokenList;
|
||||||
int peekIndex = 0; // _DWORD * a1[25], *((_DWORD *)a1 + 25)
|
|
||||||
int offset_4;
|
int offset_4;
|
||||||
int offset_8; // _DWORD * a1[8]
|
std::deque<std::string> dequeStr;// offset_8
|
||||||
|
int offset_16;
|
||||||
|
int offset_32; // _DWORD * a1[8]
|
||||||
|
int offset_36; //
|
||||||
|
int offset_40;
|
||||||
|
int offset_44;
|
||||||
|
std::deque<std::shared_ptr<WXML::DOMLib::WXMLDom>> dequeDom; // offset_48 int a1 + 48, _DWORD * a1 + 12
|
||||||
|
int peekIndex = 0; // offset_100
|
||||||
int offset_128;
|
int offset_128;
|
||||||
std::string filePath;
|
std::string filePath;
|
||||||
std::deque<std::shared_ptr<WXML::DOMLib::WXMLDom>> dequeDom; // int a1 + 48, _DWORD * a1 + 12
|
|
||||||
int v8;
|
|
||||||
public:
|
public:
|
||||||
Parser(/* args */);
|
Parser(/* args */);
|
||||||
~Parser();
|
~Parser();
|
||||||
|
@ -110,10 +110,9 @@ namespace WXML
|
|||||||
void Parser::DOM()
|
void Parser::DOM()
|
||||||
{
|
{
|
||||||
auto token = this->Peek();
|
auto token = this->Peek();
|
||||||
int v44;
|
if (token.offset_24)
|
||||||
if (v44)
|
|
||||||
{
|
{
|
||||||
if (v44 == 4)
|
if (token.offset_24 == 4)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -130,15 +129,109 @@ namespace WXML
|
|||||||
throw this->Error("unexpected tag", 0);
|
throw this->Error("unexpected tag", 0);
|
||||||
}
|
}
|
||||||
this->peekIndex++;
|
this->peekIndex++;
|
||||||
// if (this->offset_8 == )
|
if (this->offset_32 == this->offset_40 - 24)
|
||||||
|
{
|
||||||
|
this->dequeStr.push_back(tag);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this->offset_32 += 24;
|
||||||
|
}
|
||||||
std::shared_ptr<WXML::DOMLib::WXMLDom> domPtr;
|
std::shared_ptr<WXML::DOMLib::WXMLDom> domPtr;
|
||||||
|
domPtr->offset_0.assign(tag);
|
||||||
|
domPtr->offset_24.assign(domPtr->offset_0);
|
||||||
|
domPtr->offset_84 = token;
|
||||||
auto v8 = this->dequeDom.back();
|
auto v8 = this->dequeDom.back();
|
||||||
// push_back
|
// push_back
|
||||||
|
v8->offset_72.push_back(domPtr);
|
||||||
// push_back
|
// push_back
|
||||||
|
this->dequeDom.push_back(domPtr);
|
||||||
this->ATTR_LIST();
|
this->ATTR_LIST();
|
||||||
auto v9 = this->Peek();
|
auto v43 = this->Peek();
|
||||||
|
if(!token.offset_24)
|
||||||
|
{
|
||||||
|
if (v43.IsMatch(">"))
|
||||||
|
{
|
||||||
|
this->peekIndex++;
|
||||||
|
this->DOMS();
|
||||||
|
auto v11 = this->Peek();
|
||||||
|
if (/*v48[5] || */!v11.IsMatch("</"))
|
||||||
|
{
|
||||||
|
auto err = this->Error("unexpected token", &token);
|
||||||
|
throw "ParseException";
|
||||||
|
}
|
||||||
|
this->peekIndex++;
|
||||||
|
auto v47 = this->Peek();
|
||||||
|
auto v13 = this->offset_32;
|
||||||
|
std::string v40 = "";
|
||||||
|
if (this->offset_16 == v13)
|
||||||
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// if (v13 == this->offset_36)
|
||||||
|
// v13 = this->offset_44
|
||||||
|
v40 = "";
|
||||||
|
}
|
||||||
|
if (!v47.IsMatch(&v40[0]))
|
||||||
|
{
|
||||||
|
std::string msg = "expect end-tag `" + v40;
|
||||||
|
msg += v40 + "`.";
|
||||||
|
auto err = this->Error(&msg[0], 0);
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
this->peekIndex++;
|
||||||
|
this->dequeStr.pop_back();
|
||||||
|
this->dequeDom.pop_back();
|
||||||
|
auto v47 = this->Peek();
|
||||||
|
if (!v47.IsMatch(">"))
|
||||||
|
{
|
||||||
|
throw this->Error("unexpected token", 0);
|
||||||
|
}
|
||||||
|
this->peekIndex++;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (v43.IsMatch("/>"))
|
||||||
|
{
|
||||||
|
this->peekIndex++;
|
||||||
|
this->dequeDom.pop_back();
|
||||||
|
this->dequeStr.pop_back();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw this->Error("unexpected token", 0);
|
||||||
|
}
|
||||||
|
if (token.IsMatch("</"))
|
||||||
|
{
|
||||||
|
if (this->offset_32 == this->offset_16)
|
||||||
|
{
|
||||||
|
throw this->Error("get tag end without start", 0);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto v16 = token.GetContent();
|
||||||
|
this->peekIndex++;
|
||||||
|
if (v16.length() > 0)
|
||||||
|
{
|
||||||
|
int v17 = 0;
|
||||||
|
// TODO v18 = *v16 + v43[4];
|
||||||
|
char* v18 = &v16[0] + token.offset_16;
|
||||||
|
while(token.offset_20 > v17)
|
||||||
|
{
|
||||||
|
int v19 = *(uint8_t *)(v18 + v17) - 9;
|
||||||
|
if (v19 > 0x17u || ((0x800013u >> v19) & 1) == 0)
|
||||||
|
{
|
||||||
|
auto v45 = this->dequeDom.back();
|
||||||
|
std::shared_ptr<WXML::DOMLib::WXMLDom> dom;
|
||||||
|
dom->offset_0 = "TEXTNODE";
|
||||||
|
dom->offset_84 = token;
|
||||||
|
v45->offset_72.push_back(dom);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
++v17;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -157,11 +250,11 @@ namespace WXML
|
|||||||
{
|
{
|
||||||
this->DOM();
|
this->DOM();
|
||||||
WXML::DOMLib::Token token = this->Peek();
|
WXML::DOMLib::Token token = this->Peek();
|
||||||
if (this->v8 == 4)
|
if (token.offset_24 == 4)
|
||||||
break;
|
break;
|
||||||
if (token.IsMatch("</"))
|
if (token.IsMatch("</"))
|
||||||
{
|
{
|
||||||
if (this->offset_4 == this->offset_8)
|
if (this->offset_4 == this->offset_32)
|
||||||
{
|
{
|
||||||
throw WXML::DOMLib::Parser::Error("get tag end without start", nullptr);
|
throw WXML::DOMLib::Parser::Error("get tag end without start", nullptr);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user