第二人生的源码分析(103)脚本的词法分析(1)

系统 1548 0
从前面的脚本可以看到它的代码,也理解它的意思了,但是它是怎么样执行的呢?又是怎么样变成可执行的脚本呢?下面就来分析这部份相关的代码。要了解脚本执行,就得把脚本中的每一个单词识别出来,如下:
default {  state_entry()  {   llSay(0, “Hello, Avatar!”);  }
 touch_start(integer total_number)  {   llSay(0, “Touched.”);  } }
 
把上面的脚本识别为下面的字符串流: default {    state_entry() 等等。这样识别单词的过程,就叫做词法分析。在编译原理里有详细的介绍,在第二人生里并不是手工地构造词法分析器,而是通过flex程序来生成词法分析程序。
 
flex是一个将包含了正则表达式的文本文件作为其输入的程序,还包括每一个表达式被匹配时所采用的动作。 flex其实是The Fast Lexical Analyzer的缩写。
 
flex输入文件的格式如下:
{定义 }
%%
{规则 }
%%
{辅助代码 }
 
下面就来仔细地分析第二人生的脚本 flex文件,它的定部份如下:
#001 
#002 N           [0-9]
#003 L           [a-zA-Z_]
#004 H           [a-fA-F0-9]
#005 E           [Ee][+-]?{N}+
#006 FS          (f|F)
#007 %e 10000
#008 %n 4000
#009 %p 5000
#010 
#011 %{
#012 #include "linden_common.h"
#013 // Deal with the fact that lex/yacc generates unreachable code
#014 #ifdef LL_WINDOWS
#015 #pragma warning (disable : 4702) // warning C4702: unreachable code
#016 #endif // LL_WINDOWS
#017 #include "llmath.h"
#018 #include "lscript_tree.h"
#019 #include "lscript_typecheck.h"
#020 #include "lscript_resource.h"
#021 #if LL_WINDOWS
#022 #include "ytab.h"
#023 #else
#024 #include "indra.y.h"
#025 #endif
#026 #include "lltimer.h"
#027 #include "indra_constants.h"
#028 #include "llagentconstants.h"
#029 #include "lllslconstants.h"
#030 #include "lluuid.h"
#031 #include "llassetstorage.h"
#032 #include "llpartdata.h"
#033 #include "llvehicleparams.h"
#034 #include "llpermissionsflags.h"
#035 #include "llfollowcamparams.h"
#036 #include "llparcelflags.h"
#037 #include "llregionflags.h"
#038 #include "lscript_http.h"
#039 #include "llclickaction.h"
#040 
#041 void count();
#042 void comment();
#043 void parse_string();
#044 
#045 #define YYLMAX 16384
#046 #define YY_NEVER_INTERACTIVE 1 /* stops flex from calling isatty() */
#047   
#048 #ifdef ECHO
#049 #undef ECHO
#050 #endif
#051 
#052 #define ECHO do { } while (0)
#053 
#054 #if defined(__cplusplus)
#055 extern "C" { int yylex( void ); }
#056 extern "C" { int yyparse( void ); }
#057 extern "C" { int yyerror(const char *fmt, ...); }
#058 #endif
#059 
#060 %}
 
1行到第10行是定义一些正则表达式匹配的字符。
11行到第第60行是声明flex的定义部份。
 
这一次就介绍到这里,下一次再来分析它的下一部份内容:规则定义部份。
 

第二人生的源码分析(103)脚本的词法分析(1)


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论