[antlr-interest] How to force error recovery?

Junkman j at junkwallah.org
Mon Oct 4 16:24:34 PDT 2010


Greetings,

I ran into the same issue, and you probably noticed that, when the
lookahead doesn't match a statement, it breaks out of * loop and tries
to match EOF.

I resorted to calling statement() in a loop to force continuation of
parsing regardless of error, instead of calling compilationUnit().
Seems to work well enough.

It would be good to know if there is a better to handle this, though.

Best,

J


On 10/4/2010 3:27 PM, Edson Tirelli wrote:
>    Hi all,
> 
>    Look at this simple grammar:
> 
> grammar testGrammar;
> options {
> 	output=AST;
> }
> 
> compilationUnit
> 	: statement* EOF
> 	;
> 	
> statement
> 	:	A^
> 	|	B^ C
> 	;	
> 
> A   :   'a';
> 
> B   :	'b';	
> 
> C   :   'c';	
> 
> WS  :   ( ' '
>         | '\t'
>         | '\r'
>         | '\n'
>         ) {$channel=HIDDEN;}
>     ;
> 
> 
>     Using the above grammar, it will successfully parse an input like:
> 
> a b c a
> 
>     Now, if the input is:
> 
> a c a
> 
>     The generated parser will parse "a", and will fail at "c", as it
> is not a valid statement. Reading the error recovery chapter on the
> ANTLR book, I would imagine ANTLR would delete/skip the "c" token and
> try to recover, successfully parsing the second "a", as that is a
> valid statement again. But it is not working like this. It is aborting
> the parsing with an error at "c".
> 
>     Question: how do I force it to recover from the error and continue parsing?
> 
>     The actual scenario is that the parser I am working on is used by
> an IDE environment (eclipse), so we need it to continue parsing and
> presenting the users with all the errors found in the file, not just
> the first one. The error recovery seems to work on some rules, but not
> on the top rule (compilationUnit).
> 
>     Thanks,
>        Edson
> 



More information about the antlr-interest mailing list