前面分析詞法分析的代碼生成,并且生成可編譯的
C
++文件,那么它是怎么調(diào)用這個(gè)詞法分析文件的呢?下面就來了解它的調(diào)用過程。
當(dāng)你在第二人生里創(chuàng)建物體后,就可以編輯腳本了,當(dāng)完成腳本編寫之后就需要保存起來,這時(shí)就會(huì)觸發(fā)腳本編譯。它就如下調(diào)用:
#001
?
void LLLiveLSLEditor::uploadAssetLegacy(const std::string& filename,
#002
?
??????????????????????????????????????
LLViewerObject*
#003
?
object,
#004
?
??????????????????????????????????????
const
#005
?
LLTransactionID& tid,
#006
?
??????????????????????????????????????
BOOL
#007
?
is_running)
#008
?
{
創(chuàng)建一個(gè)對象來保存腳本數(shù)據(jù)。
#009
?
??
LLLiveLSLSaveData* data = new LLLiveLSLSaveData(mObjectID,
#010
?
??????????????????????????????????????????
#011
?
??????
mItem,
#012
?
??????????????????????????????????????????
#013
?
??????
is_running);
保存腳本到磁盤文件。
#014
?
??
gAssetStorage->storeAssetData(filename.c_str(), tid,
#015
?
??????????????????????????????
??
LLAssetType::AT_LSL_TEXT,
#016
?
??????????????????????????????
??
&onSaveTextComplete,
#017
?
??????????????????????????????
??
(void*)data,
#018
?
??????????????????????????????
??
FALSE);
#019
?
#020
?
??
LLAssetID asset_id = tid.makeAssetID(gAgent.getSecureSessionID());
#021
?
??
std::string filepath = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,asset_id.asString());
下面開始創(chuàng)建兩個(gè)輸出的文件名稱。
#022
?
??
std::string dst_filename = llformat("%s.lso", filepath.c_str());
#023
?
??
std::string err_filename = llformat("%s.out", filepath.c_str());
#024
?
#025
?
??
FILE *fp;
下面調(diào)用函數(shù)
lscript_compile
來進(jìn)行腳本編譯。
#026
?
??
if(!lscript_compile(filename.c_str(),
#027
?
??????????????????????
dst_filename.c_str(),
#028
?
??????????????????????
err_filename.c_str(),
#029
?
??????????????????????
gAgent.isGodlike()))
#030
?
??
{
#031
?
??????
// load the error file into the error scrolllist
#032
?
??????
llinfos << "Compile failed!" << llendl;
#033
?
??????
if(NULL != (fp = LLFile::fopen(err_filename.c_str(), "r")))
#034
?
??????
{
#035
?
??????????
char buffer[MAX_STRING];
???????
/*Flawfinder: ignore*/
#036
?
??????????
LLString line;
#037
?
??????????
while(!feof(fp))
而函數(shù)
lscript_compile
在
flex
腳本文件里已經(jīng)定義了,那么這里就是調(diào)用它。如果不了解就要查看前面的文章。
下面再來看看下面一段代碼:
#001
?
BOOL lscript_compile(const char* src_filename, const char* dst_filename,
#002
?
??????????????????
?
const char* err_filename, BOOL is_god_like)
#003
?
{
......
打開腳本文件輸入。
#018
?
??
yyin = LLFile::fopen(src_filename, "r");
#019
?
??
if (yyin)
#020
?
??
{
打開出錯(cuò)文件輸出。
#021
?
??????
yyout = LLFile::fopen(err_filename, "w");
#022
?
#023
?
??????
// Reset the lexer's internal buffering.
#024
?
詞法分析輸入復(fù)位。
#025
?
??
????
yyrestart(yyin);
#026
?
這里進(jìn)行語法分析。
#027
?
??????
b_parse_ok = !yyparse();
#028
?
#029
?
??????
if (b_parse_ok)
#030
?
??????
{
下一次,我們就需要去分析怎么樣判斷腳本是合法的了,它就是在函數(shù)
yyparse
實(shí)現(xiàn)的。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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