现在的位置: 首页 > 综合 > 正文

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

2013年10月22日 ⁄ 综合 ⁄ 共 1646字 ⁄ 字号 评论关闭
 

当语法分析一个脚本完成时,那么就会把整个脚本的分析结果保存起来,在第二人生里把脚本的结果保存到那里呢?现在就来分析这个问题,先来看看语法分析的文件里,有如下的代码:

#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 

 

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

抱歉!评论已关闭.