我們先了看下Alt組合子的分析代碼
1 virtual O Parser(I& input)
2 {
3 I temp = input;
4 if(O Result = left.Parser(input)) return Result;
5 input = temp;
6 if(O Result = right.Parser(input)) return Result;
7 input = temp;
8 O Result(GetMM());
9 return Result;
10 }
當(dāng)left分析失敗時(shí)會將原先的input值重新賦值給input,但此時(shí)并沒有改變SymbolStack和StringStack,應(yīng)此當(dāng)?shù)谝淮畏治鍪r(shí)SymbolStack和StringStack中會包含一些重復(fù)的值.當(dāng)然其他組合子同樣存在這個(gè)問題.
應(yīng)此我為CParser_Input增加了兩個(gè)成員變量保存此時(shí)的SymbolStack和StringStack的Size,當(dāng)SymbolStack和StringStack Push的時(shí)候同時(shí)增加input相應(yīng)的值.
最后重載CParser_Input的operator=賦值操作符,在其中根據(jù)原先的SymbolStack和StringStack的Size來彈出相應(yīng)數(shù)量的重復(fù)值
1 CParser_Input& operator=(CParser_Input& _value)
2 {
3 LexerTokenList = _value.LexerTokenList;
4 index = _value.index;
5
6 if(_value.symbolCount < symbolCount && _value.symbolCount)
7 {
8 int Count = symbolCount - _value.symbolCount;
9 for(int i=0;i<Count;i++) SymbolStack.Pop();
10 }
11
12 if(_value.stringCount < stringCount && _value.stringCount)
13 {
14 int Count = stringCount - _value.stringCount;
15 for(int i=0;i<Count;i++) StringStack.Pop();
16 }
17
18 symbolCount = SymbolStack.Size();
19 stringCount = StringStack.Size();
20 return *this;
21 }
以此來解決SymbolStack和StringStack的同步問題.
posted on 2011-07-10 22:13
lwch 閱讀(1145)
評論(0) 編輯 收藏 引用 所屬分類:
QLanguage