And incidentally I have tried to make this change using a snapshot of
sources obtained from Fisheye, but it appears the code has changed in such a
way that the lexer and parser produced by compiling with the Antlr 3.2
toolset is no longer compatible (for instance, IIntToken.Index is now a
property, not a method.)

On Mon, Mar 29, 2010 at 8:19 PM, Cliff Hudson <[email protected]>wrote:

> I have been trying to work through an issue with an infinite loop caused
> when no tokens can be matched because a predicate has failed its test.  The
> problem appears to be in the Lexer.NextToken() (looking at CSharp2 sources)
> method, which I have copied here for reference:
>
>               /// <summary>
>               /// Return a token from this source; i.e., Match a token on the 
> char stream.
>               /// </summary>
>               public virtual IToken NextToken()
>               {
>                       while (true)
>                       {
>                               state.token = null;
>                               state.channel = Token.DEFAULT_CHANNEL;
>                               state.tokenStartCharIndex = input.Index;
>                               state.tokenStartCharPositionInLine = 
> input.CharPositionInLine;
>                               state.tokenStartLine = input.Line;
>                               state.text = null;
>                               if (input.LA(1) == (int)CharStreamConstants.EOF)
>                               {
>                                       return Token.EOF_TOKEN;
>                               }
>                               try
>                               {
>                                       mTokens();
>                                       if (state.token == null)
>                                       {
>                                               Emit();
>                                       }
>                                       else if (state.token == 
> Token.SKIP_TOKEN)
>                                       {
>                                               continue;
>                                       }
>                                       return state.token;
>                               }
>                               catch (NoViableAltException nva) {
>                                       ReportError(nva);
>                                       Recover(nva); // throw out current char 
> and try again
>                               }
>                               catch (RecognitionException re) {
>                                       ReportError(re);
>                                       // Match() routine has already called 
> Recover()
>                               }
>                       }
>               }
>
> Note the RecognitionException clause.  This is the clause which will catch 
> the FailedPredicateException().  Unfortunately, because the 
> FailedPredicateException gets thrown just before Match() occurs in the rule, 
> Recover will *not* have been called by the rule or its callees, and therefore 
> the DFA will continue to try processing the same token.  It would appear that 
> there should instead be a specific FailedPredicateException clause which does 
> the same thing as the NoViableAltException clause.
>
> I have seen two other people ask questions about this error, and in neither 
> case was a suitable response given.  Has this bug been fixed in non-released 
> builds?  Can someone give me an up-or-down on whether this is a correct and 
> appropriate fix?
>
> Thanks.
>
> - Cliff
>
>

List: http://www.antlr.org/mailman/listinfo/antlr-interest
Unsubscribe: 
http://www.antlr.org/mailman/options/antlr-interest/your-email-address

-- 
You received this message because you are subscribed to the Google Groups 
"il-antlr-interest" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/il-antlr-interest?hl=en.

Reply via email to