[antlr-interest] Re: Semantic predicates that aren't & hoisting

Sebastian Kaliszewski sk at z.pl
Tue Mar 15 04:53:29 PST 2005

On Monday 14 March 2005 19:15, David Jung wrote:
> John,
>   Don't waste any more of your time.  You've failed to
> grasp the fundamental problem.  Your grammar, like Java/C++,
> breaks the orthogonality rule of language design; in that
> your statements/blocks are not primary.
> That's why it can't parse the input I provided in my last post:
> "{if ({a();}++ < 0) then {b; c(); {;}+1 dd();} e; f();}*2"
> (notice the "++", "+1" and "*2")
> That could be fixed by putting statementList in primaryExpr, but
> would introduce ambiguity.  Doing that would give something very
> similar to the solution I proposed in my original post in this
> thread.  However, my original question was if there was a better
> way; one that avoids the ambiguity.  Now I know the answer is no.

I thonk not. Try using syntactic predicate instead of semantic one. You 
wrote that it's impossible in your case, but IMHO it is. Just notice, that 
every closing brace is matched be an openig one -- so make ANTLR decide 
upon that.

So... In your original grammar instead of...

expressionList : '{' expr ( ';' expr )* '}' ;

Try using...

expressionList: '{' exprListBody '}'

  ('{')=> expressionList exprListBody
 | expr (';' exprListBody)?
 | (';')*

> Perhaps ANTLR 3 will support the hoisting I need.

Try the above proposal -- or something about the lines (I didn't check if 
it's 100% right, but I had to somewhat do similar stuff in my grammar (my 
case is more complex, as using separator is dictated not only by preceding 
construct but also the following one -- in your case it would be something 
like making semicolon optional not only directly after closing brace, but 
also directly before opening brace -- this is also possible to solve

Sebastian Kaliszewski

More information about the antlr-interest mailing list