Do this:

1) Move those to real lexer tokens (though I understand this may just be an 
example)
2) Use predicates for real things
3) Eat and discard the rest

So:

foo
  : ( (bar)=>bar | .)+ ->bar+
  ;

Here I show the whole rule bar as the predicate, which can be expensive if the 
rule is complicated, so construct a rule that has the minimum token set to 
correctly predict bar, rather than the complete rule, if you have a complicated 
rule.

If you find that you must do this via error recovery and resync the input to 
something manually, then you want:

http://www.antlr.org/wiki/display/ANTLR3/Custom+Syntax+Error+Recovery

Jim



> -----Original Message-----
> From: [email protected] [mailto:antlr-interest-
> [email protected]] On Behalf Of Joe stelmach
> Sent: Wednesday, February 17, 2010 7:59 AM
> To: [email protected]
> Subject: [antlr-interest] help with error recovery
> 
> I'm looking for some help implementing a custom error recovery
> strategy.
> 
> Consider the following grammar which accepts strings of the form
> "ab--ab--cd--"..., and generates flat AST's of the form: GROUP["ab"]
> GROUP["ab"] GROUP["cd"]...
> 
> grammar Test;
> 
> options {
>   output=AST;
> }
> 
> tokens {
>   GROUP;
> }
> 
> foo
>   : (bar '--')+ -> bar+
>   ;
> 
> bar
>   : (('a' 'b') | ('c' 'd')) -> GROUP[$bar.text]
>   ;
> 
> Now suppose we feed the parser the input string "ab--ac--cd--".  I
> would like the resulting AST to look like: GROUP["ab"] GROUP["cd"]
> corresponding to the first "ab" and the last "cd" of the input string.
>  In other words, when the parser starts to match a bar rule but fails
> (as it will when it encounters the first 'c' token in our example
> input,) I'd like to scan past all tokens until the next '--' token,
> and then tell the parser to back up to the state it was in just after
> encountering the first 'b' token.
> 
> I'm able to over-ride what I think to be the appropriate methods of
> BaseRecognizer, and I understand how to scan past and consume the
> tokens I don't care about, but I'm unsure of how to direct the parser
> back to the previous state (or if it's even possible.)
> 
> Any help would be appreciated.
> 
>  - Joe
> 
> List: http://www.antlr.org/mailman/listinfo/antlr-interest
> Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-
> email-address




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