當語法分析一個腳本完成時,那么就會把整個腳本的分析結果保存起來,在第二人生里把腳本的結果保存到那里呢?現在就來分析這個問題,先來看看語法分析的文件里,有如下的代碼:
#001
???
case 3:
#002
?
#line 277 "indra.y"
#003
?????
{
#004
?
??????
(yyval.script) = new LLScriptScript(NULL, (yyvsp[(1) - (1)].state));
#005
?
??????
gAllocationManager->addAllocation((yyval.script));
#006
?
??????
gScriptp = (yyval.script);
#007
?
??
}
#008
?????
break;
第
4
行里就創建一個
LLScriptScript
腳本程序保存對象,這個對象保存在全局變量
gScriptp
里。并且創建時就保存腳本的開始狀態
(yyvsp[(1) - (1)].state)
,比如腳本里關鍵字
default
的開始,就會創建一個開始狀態
LLScriptState
對象。
下面就來分析類
LLScriptScript
是怎么樣保存腳本和分析腳本的,它的聲明如下:
#001
?
class LLScriptScript : public LLScriptFilePosition
#002
?
{
#003
?
public:
構造函數保存全局儲存對象,保存腳本的開始狀態。
#004
?
??
LLScriptScript(LLScritpGlobalStorage *globals,
#005
?
??????????????
???
LLScriptState *states);
#006
?
析構函數刪除全局對象。
#007
?
??
~LLScriptScript()
#008
?
??
{
#009
?
??????
delete mGlobalScope;
#010
?
??
}
#011
?
遞歸遍歷處理語法分析、輸出匯編代碼、輸出字節碼等等。
#012
?
??
void recurse(FILE *fp, S32 tabs, S32 tabsize, LSCRIPTCompilePass pass, LSCRIPTPruneType ptype, BOOL &prunearg, LLScriptScope *scope, LSCRIPTType &type,
#013
?
LSCRIPTType basetype, U64 &count, LLScriptByteCodeChunk *chunk, LLScriptByteCodeChunk *heap, S32 stacksize, LLScriptScopeEntry *entry, S32 entrycount, LLScriptLibData **ldata);
獲取生成代碼的大小,這里設置返回
0
。
#014
?
??
S32 getSize();
#015
?
設置腳本目標生成文件。
#016
?
??
void setBytecodeDest(const char* dst_filename);
#017
?
腳本程序開始狀態保存成員。
#018
?
??
LLScriptState
??????????
*mStates;
腳本程序的全局作用域。
#019
?
??
LLScriptScope
??????????
*mGlobalScope;
腳本程序的全局變量。
#020
?
??
LLScriptGlobalVariable
?
*mGlobals;
腳本程序的全局函數。
#021
?
??
LLScriptGlobalFunctions
*mGlobalFunctions;
保存函數屬性是否代理能執行。
#022
?
??
BOOL
???????????????????
mGodLike;
#023
?
#024
?
private:
保存生成字節碼的目標文件。
#025
?
??
char mBytecodeDest[MAX_STRING];
????
/*Flawfinder: ignore*/
#026
?
};
#027
?
通過上面分析,了解了腳本保存的結構,下一次再仔細地分析它是怎么進行腳本處理。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
