[antlr-interest] help with error recovery
joestelmach at gmail.com
joestelmach at gmail.com
Wed Feb 17 11:21:46 PST 2010
Thank you Jim - I hadn't thought about the problem in that way.
- Joe
On Wed, Feb 17, 2010 at 11:44 AM "Jim Idle" <jimi at temporal-wave.com> wrote:
>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: antlr-interest-bounces at antlr.org [mailto:antlr-interest-
> > bounces at antlr.org] On Behalf Of Joe stelmach
> > Sent: Wednesday, February 17, 2010 7:59 AM
> > To: antlr-interest at antlr.org
> > 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
More information about the antlr-interest
mailing list