[antlr-interest] Tree construction rewrite rule error

Stephen Tuttlebee themightystephen at googlemail.com
Sun Mar 6 04:17:46 PST 2011


Thanks Jim, putting the brackets around it worked. I also had another 
error in that code with the 'selector' parameter being passed to it in 
the rewrite rule rather than in the parser invocation of the rule. 
Here's the working version:

unaryExpressionNotPlusMinus
     :   TILDE unaryExpression -> ^(BITWISE_COMPLEMENT unaryExpression)
     |   BANG unaryExpression -> ^(LOGICAL_COMPLEMENT unaryExpression)
     |   castExpression
     |   {inHandlerDeclaration||inRunMethodDeclaration}?=> 
inSynchronizationExpression // only allowed within handler declarations 
(which in turn are inside component definitions)
     |   (primary -> primary) // FIX HERE
         (selector[$unaryExpressionNotPlusMinus.tree] -> selector)* // 
AND HERE
         (   PLUSPLUS -> ^(POSTINC $unaryExpressionNotPlusMinus)
         |   SUBSUB -> ^(POSTDEC $unaryExpressionNotPlusMinus)
         )?
     ;

Thanks again.
Stephen

On 06/03/2011 00:08, Stephen Tuttlebee wrote:
> Hi there,
>
> I'm currently using the Java.g parser grammar (by Yang Jiang) from 
> http://openjdk.java.net/projects/compiler-grammar/ and am trying to 
> add tree construction rewrite rules and operators to build an AST. 
> That's quite a job in itself (I'm trying roughly to base it on one I 
> found in the mercurial repository on that site that contained actions 
> that created a javac-style AST).
>
> Anyway, my specific question relates to the LAST ALTERNATIVE in the 
> following rule (from the "expression hierarchy"):
>
> unaryExpressionNotPlusMinus
>     :   TILDE unaryExpression -> ^(BITWISE_COMPLEMENT unaryExpression)
>     |   BANG unaryExpression -> ^(LOGICAL_COMPLEMENT unaryExpression)
>     |   castExpression
>     |   {inHandlerDeclaration||inRunMethodDeclaration}?=> 
> inSynchronizationExpression // only allowed within handler 
> declarations (which in turn are inside component definitions)
>     |   primary -> primary
>         (selector -> selector[$unaryExpressionNotPlusMinus.tree])*
>         (   PLUSPLUS -> ^(POSTINC $unaryExpressionNotPlusMinus)
>         |   SUBSUB -> ^(POSTDEC $unaryExpressionNotPlusMinus)
>         )?
>     ;
>
> The last alternative does look a little complicated but it is 
> basically creating a single tree from the 'primary' in case nothing 
> else is matched (due to the * and ? that mean we could not match 
> anything), while the subsequent rewrite rules (->) within the 
> alternative are successively building up the tree by making the tree 
> constructed thus far a child of a newly created tree (this is done by 
> referencing the rule itself -- referencing 
> $unaryExpressionNotPlusMinus in the context of a rewrite rule means 
> "take the current value of the tree of unaryExpressionNotPlusMinus").
>
> However, when I run the grammar through ANTLR (3.3) I get the 
> following errors:
>
> error(100): /JavaBTranslator/src/JavaBPhase1SynSem1.g:1026:19: syntax 
> error: antlr: expecting RPAREN, found '->'
>  |---> (selector -> selector[$unaryExpressionNotPlusMinus.tree])*
>
> error(100): /JavaBTranslator/src/JavaBPhase1SynSem1.g:1027:22: syntax 
> error: antlr: expecting RPAREN, found '->'
>  |---> (   PLUSPLUS -> ^(POSTINC $unaryExpressionNotPlusMinus)
>
> error(10):  internal error: /JavaBTranslator/src/JavaBPhase1SynSem1.g 
> : java.lang.NullPointerException
> 3 errors
>
>
> It seems that ANTLR does not like the -> that appear in the middle of 
> the alternative for some reason. The problem could be a simple ANTLR 
> syntax thing which I'm not clear about.
>
> Anyone have any ideas about why I'm getting these errors.
>
> Thanks,
> Stephen
>
> PS. also, it seems that coming up with the tree grammar rules to 
> recognise the tree might be a little harder than constructing the tree 
> in the parser, at least for the more complicated tree rewrite rules 
> like this. But I'll have to cross that bridge when I come to it.



More information about the antlr-interest mailing list