[antlr-interest] gUnit freezing when choking on invalid input

Leon Su leon.antlr at mac.com
Fri Jun 27 11:39:15 PDT 2008


Hi Thomas,

I ran the same test with ANTLR 3.1b + gUnit 1.0.2, and it works well  
without freezing issue.
That could be a potential bug on the old version(1.0.1) of gUnit.  
I'll take a look on it later today.
Thanks for the report.

Leon

On Jun 27, 2008, at 2:55 AM, Thomas Vial wrote:

> Hi all,
>
>
> I am experiencing an annoying issue with gUnit freezing when parsing
> of test input fails. Here is my test case, with ANTLR v3.0 and gUnit
> 1.0.1.
>
> ----------[Expr.g]----------------------
> grammar Expr;
>
> options {
> 	output=AST;
> }
>
> tokens {
> 	PROG;
> }
>
> @header {
> package com.expr;
> }
>
> @lexer::header {
> package com.expr;
> }
>
> program:
> 	(expr ';')*							-> ^(PROG expr*)
> ;
>
> // The following rules are deliberately incorrect
> // Should be expr1 ('+' expr1)* and expr2 ('*' expr2)*
> // for a real expression parser :-)
> expr:
> 	expr1 '+' expr1						-> ^('+' expr1 expr1)
> ;
>
> expr1:
> 	expr2 '*' expr2						-> ^('*' expr2 expr2)
> ;
>
> expr2:
> 	INTEGER								-> INTEGER
> |	'(' expr ')'						-> expr
> ;
>
>
> INTEGER:
> 	('0'..'9')+
> ;
> -------------------------------------------
>
>
> ----------[Expr.testsuite]-----------
> gunit Expr;
>
> @header {
> package com.expr;
> }
>
> expr:
> 	"1+2"				-> (+ 1 2)
> -------------------------------------------
>
>
> With this input, gUnit freezes indefinitely. When feeding the parser
> directly, I get "line 0:-1 mismatched input '<EOF>' expecting '*'",
> which is correct wrt the badly written grammar (see comments above
> rules expr and expr1). However gUnit does not see the error and gets
> stuck. I have noticed, by looking at the JUnit code that gUnit
> generates with the -o option (the JUnit version of the test freezes,
> too), that it internally uses threads to pass input to the parser and
> retrieve its output. The issue might have something to do some thread
> starving on a reader.
>
> This is annoying when run from the command line: the whole test suite
> freezes, so you have to execute the parser against every test by hand
> to track the actual error. This also makes gUnit unusable in
> continuous integration scenarii.
>
> Another oddity is that gUnit behaves as expected, i.e. reporting the
> error, when the AST construction is done inline:
> -------------------------------------------
> expr:
> 	expr1 '+'^ expr1
> ;
>
> expr1:
> 	expr2 '*'^ expr2
> ;
> -------------------------------------------
>
> Shouldn't both construction methods be equivalent?
>
>
>
>
> Any insights on these issues?
>
> Thanks!
>
> Thomas



More information about the antlr-interest mailing list