當(dāng)語(yǔ)法分析一個(gè)腳本完成時(shí),那么就會(huì)把整個(gè)腳本的分析結(jié)果保存起來(lái),在第二人生里把腳本的結(jié)果保存到那里呢?現(xiàn)在就來(lái)分析這個(gè)問(wèn)題,先來(lái)看看語(yǔ)法分析的文件里,有如下的代碼:
#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
行里就創(chuàng)建一個(gè)
LLScriptScript
腳本程序保存對(duì)象,這個(gè)對(duì)象保存在全局變量
gScriptp
里。并且創(chuàng)建時(shí)就保存腳本的開(kāi)始狀態(tài)
(yyvsp[(1) - (1)].state)
,比如腳本里關(guān)鍵字
default
的開(kāi)始,就會(huì)創(chuàng)建一個(gè)開(kāi)始狀態(tài)
LLScriptState
對(duì)象。
下面就來(lái)分析類
LLScriptScript
是怎么樣保存腳本和分析腳本的,它的聲明如下:
#001
?
class LLScriptScript : public LLScriptFilePosition
#002
?
{
#003
?
public:
構(gòu)造函數(shù)保存全局儲(chǔ)存對(duì)象,保存腳本的開(kāi)始狀態(tài)。
#004
?
??
LLScriptScript(LLScritpGlobalStorage *globals,
#005
?
??????????????
???
LLScriptState *states);
#006
?
析構(gòu)函數(shù)刪除全局對(duì)象。
#007
?
??
~LLScriptScript()
#008
?
??
{
#009
?
??????
delete mGlobalScope;
#010
?
??
}
#011
?
遞歸遍歷處理語(yǔ)法分析、輸出匯編代碼、輸出字節(jié)碼等等。
#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);
獲取生成代碼的大小,這里設(shè)置返回
0
。
#014
?
??
S32 getSize();
#015
?
設(shè)置腳本目標(biāo)生成文件。
#016
?
??
void setBytecodeDest(const char* dst_filename);
#017
?
腳本程序開(kāi)始狀態(tài)保存成員。
#018
?
??
LLScriptState
??????????
*mStates;
腳本程序的全局作用域。
#019
?
??
LLScriptScope
??????????
*mGlobalScope;
腳本程序的全局變量。
#020
?
??
LLScriptGlobalVariable
?
*mGlobals;
腳本程序的全局函數(shù)。
#021
?
??
LLScriptGlobalFunctions
*mGlobalFunctions;
保存函數(shù)屬性是否代理能執(zhí)行。
#022
?
??
BOOL
???????????????????
mGodLike;
#023
?
#024
?
private:
保存生成字節(jié)碼的目標(biāo)文件。
#025
?
??
char mBytecodeDest[MAX_STRING];
????
/*Flawfinder: ignore*/
#026
?
};
#027
?
通過(guò)上面分析,了解了腳本保存的結(jié)構(gòu),下一次再仔細(xì)地分析它是怎么進(jìn)行腳本處理。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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