下面來(lái)分析一下
NScript的部分?jǐn)?shù)據(jù)結(jié)構(gòu)
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 };
每個(gè)語(yǔ)法樹(shù)的節(jié)點(diǎn)有2個(gè)參數(shù)Op1,Op2分別表示當(dāng)前節(jié)點(diǎn)的類(lèi)型和附加參數(shù)
Child為當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)
CharClass結(jié)構(gòu)則比較簡(jiǎn)單分別為索引和字符
然后是部分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 };
和產(chǎn)生式索引的宏定義:
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,隨著以后文法的增加這里的索引定義也會(huì)增加
NS.h,NS.cpp,NS.ParserTable均是由NScriptMacro.exe運(yùn)行NS.txt生成的
下面來(lái)看一下SyntaxAnalyze函數(shù):
1 BOOL NSyntax::SyntaxAnalyze(int i)
2 {
3 BOOL bResult = TRUE;
4 // 根據(jù)產(chǎn)生式索引生成語(yǔ)法樹(shù)
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 }
這個(gè)函數(shù)根據(jù)傳入?yún)?shù)(產(chǎn)生式索引)調(diào)用相關(guān)函數(shù)生成語(yǔ)法樹(shù),具體語(yǔ)法樹(shù)的生成過(guò)程請(qǐng)看
相關(guān)代碼
posted on 2011-01-14 16:00
lwch 閱讀(1475)
評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi):
NScript