从前面的脚本可以看到它的代码,也理解它的意思了,但是它是怎么样执行的呢?又是怎么样变成可执行的脚本呢?下面就来分析这部份相关的代码。要了解脚本执行,就得把脚本中的每一个单词识别出来,如下:
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的定义部份。
这一次就介绍到这里,下一次再来分析它的下一部份内容:规则定义部份。