第二人生的源码分析(111)脚本的综合分析(1)

当语法分析一个脚本完成时,那么就会把整个脚本的分析结果保存起来,在第二人生里把脚本的结果保存到那里呢?现在就来分析这个问题,先来看看语法分析的文件里,有如下的代码:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

#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

通过上面分析,了解了脚本保存的结构,下一次再仔细地分析它是怎么进行脚本处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值