我們先了看下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 }
當left分析失敗時會將原先的input值重新賦值給input,但此時并沒有改變SymbolStack和StringStack,應此當第一次分析失敗時SymbolStack和StringStack中會包含一些重復的值.當然其他組合子同樣存在這個問題.
應此我為CParser_Input增加了兩個成員變量保存此時的SymbolStack和StringStack的Size,當SymbolStack和StringStack Push的時候同時增加input相應的值.
最后重載CParser_Input的operator=賦值操作符,在其中根據原先的SymbolStack和StringStack的Size來彈出相應數量的重復值
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 閱讀(1131)
評論(0) 編輯 收藏 引用 所屬分類:
QLanguage