我们先了看下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 阅读(1118)
评论(0) 编辑 收藏 引用 所属分类:
QLanguage