随笔-91  评论-137  文章-0  trackbacks-0
下面来分析一下NScript的部分数据结构
 1     class SyntaxNode
 2     {
 3     public:
 4         int Op1;
 5         int Op2;
 6         List<NAutoPtr<SyntaxNode>> Child;
 7 
 8         SyntaxNode(int O1,int O2) : Op1(O1),Op2(O2){}
 9     };
10 
11     class CharClass
12     {
13     public:
14         int Index;
15         NWString String;
16 
17         CharClass(NWString S) : String(S){}
18     };

每个语法树的节点有2个参数Op1,Op2分别表示当前节点的类型和附加参数
Child为当前节点的子节点

CharClass结构则比较简单分别为索引和字符

然后是部分SyntaxNode的Op1的枚举:
1     enum OpCode_Type
2     {
3         opNull,
4         opVar,
5         opConst,
6     };

以及VarType的枚举:
 1     enum Var_Type
 2     {
 3         vtNull,
 4         vtVoid,
 5         vtBool,
 6         vtInt,
 7         vtReal,
 8         vtString,
 9         vtSymbol,
10     };
和产生式索引的宏定义:
 1     #define INDEX_VARTYPE_VOID                1
 2     #define INDEX_VARTYPE_BOOL                2
 3     #define INDEX_VARTYPE_INT                3
 4     #define INDEX_VARTYPE_REAL                4
 5     #define INDEX_VARTYPE_STRING            5
 6     #define INDEX_VALUETYPE_STRING            6
 7     #define INDEX_VALUETYPE_SYMBOL            7
 8     #define INDEX_VALUETYPE_REAL            8
 9     #define INDEX_VALUETYPE_DIGIT            9
10     #define INDEX_VALUETYPE_TRUE            10
11     #define INDEX_VALUETYPE_FALSE            11

以上索引的定义取自NS.txt,随着以后文法的增加这里的索引定义也会增加
NS.h,NS.cpp,NS.ParserTable均是由NScriptMacro.exe运行NS.txt生成的

下面来看一下SyntaxAnalyze函数:
 1 BOOL NSyntax::SyntaxAnalyze(int i)
 2 {
 3     BOOL bResult = TRUE;
 4     // 根据产生式索引生成语法树
 5     switch(i)
 6     {
 7     case INDEX_VARTYPE_VOID:
 8     case INDEX_VARTYPE_BOOL:
 9     case INDEX_VARTYPE_INT:
10     case INDEX_VARTYPE_REAL:
11     case INDEX_VARTYPE_STRING:
12         bResult = VarType(i);
13         break;
14     case INDEX_VALUETYPE_STRING:
15     case INDEX_VALUETYPE_SYMBOL:
16     case INDEX_VALUETYPE_REAL:
17     case INDEX_VALUETYPE_DIGIT:
18     case INDEX_VALUETYPE_TRUE:
19     case INDEX_VALUETYPE_FALSE:
20         bResult = ValueType(i);
21         break;
22     }
23     return bResult;
24 }

这个函数根据传入参数(产生式索引)调用相关函数生成语法树,具体语法树的生成过程请看相关代码
posted on 2011-01-14 16:00 lwch 阅读(1455) 评论(0)  编辑 收藏 引用 所属分类: NScript

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理