随笔-91  评论-137  文章-0  trackbacks-0
我们先了看下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 阅读(1109) 评论(0)  编辑 收藏 引用 所属分类: QLanguage

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