[antlr-interest] Tree construction - Adding subtrees

Stephen Tuttlebee themightystephen at googlemail.com
Wed Mar 9 15:21:55 PST 2011


I just realised that the (big) rule in that last message didn't come out 
too well on the archives so I'll try again with less indenting to stop 
wrapping at the ends of lines as much:
componentDefinition
         :  ^(COMPONENT_DEF IDENTIFIER ^(BOUNDARY_DECLS 
boundaryDeclaration*) ^(FIELD_DECLS fieldDeclaration*) 
runMethodDeclaration* ^(HANDLER_DECLS handlerDeclaration*) 
^(METHOD_DECLS methodDeclaration*))
         { ... some actions here you can ignore... }
          -> ^(COMPONENT_DEF IDENTIFIER ^(BOUNDARY_DECLS 
boundaryDeclaration*) ^(FIELD_DECLS fieldDeclaration*) 
runMethodDeclaration*
                     ^(HANDLER_DECLS handlerDeclaration*
                         {
                         for(String boundaryName : 
boundariesWithNoHandler) {
                             // .... calculate/get values to put in 
subtree ...

                             /* I want to be able to use ANTLR's 
friendly tree construction syntax here somehow whilst in the middle of 
this action.
                                 Every iteration of the for loop creates 
a new subtree --- if I can't do it this way, what is the tree 
construction code I would need here? */
                             ^(HANDLER_DECL {$boundaryName} ^(IDENT 
{$b.getType}) {$b.getDirectionString()} ^(BLOCK BLOCK_STATEMENT))
                          } // end for
                          }
                      )
                      ^(METHOD_DECLS methodDeclaration*))
         ;

(I also forgot the semi-colon at the end)

Hope it looks good this time. :)

Stephen


On 09/03/2011 23:17, Stephen Tuttlebee wrote:
> Hi
>
> I have a tree grammar that takes an AST and I want to rewrite/modify 
> the AST slightly.
>
> Here is the rule we're concerned with (with some unrelated actions 
> removed):
> componentDefinition
>         :  ^(COMPONENT_DEF IDENTIFIER ^(BOUNDARY_DECLS 
> boundaryDeclaration*) ^(FIELD_DECLS fieldDeclaration*) 
> runMethodDeclaration* ^(HANDLER_DECLS handlerDeclaration*) 
> ^(METHOD_DECLS methodDeclaration*))
>         ;
>
> Now, under the ^(HANDLER_DECLS ...) subtree in the rule above I want 
> to add extra 'handlerDeclaration' subtrees in the rewrite rule, each 
> of which have the following form (you can ignore the details of the 
> other rules referenced in it):
>     ^(HANDLER_DECL IDENTIFIER type boundaryDirection IDENTIFIER 
> handlerBlock)
>
> I would like be able to have a tree rewrite rule like this for the 
> componentDefinition rule. I know it's not valid ANTLR syntax but it 
> hopefully gives the idea of what I want to achieve (it's broken up 
> into many lines and indented appropriately for clarity) (also read the 
> comments in the code):
>
> componentDefinition
>         :  ^(COMPONENT_DEF IDENTIFIER ^(BOUNDARY_DECLS 
> boundaryDeclaration*) ^(FIELD_DECLS fieldDeclaration*) 
> runMethodDeclaration* ^(HANDLER_DECLS handlerDeclaration*) 
> ^(METHOD_DECLS methodDeclaration*))
>         { ... some actions here you can ignore... }
>          -> ^(COMPONENT_DEF IDENTIFIER ^(BOUNDARY_DECLS 
> boundaryDeclaration*) ^(FIELD_DECLS fieldDeclaration*) 
> runMethodDeclaration*
>                                                           
> ^(HANDLER_DECLS handlerDeclaration*
>                                                               {
>                                                               
> for(String boundaryName : boundariesWithNoHandler) {
>                                                                 // 
> .... calculate/get values to put in subtree ...
>
>                                                                 /* I 
> want to be able to use ANTLR's friendly tree construction syntax here 
> somehow whilst in the middle of this action.
>                                                                      
> Every iteration of the for loop creates a new subtree --- if I can't 
> do it this way, what is the tree construction code I would need here? */
>                                                                 
> ^(HANDLER_DECL {$boundaryName} ^(IDENT {$b.getType}) 
> {$b.getDirectionString()} ^(BLOCK BLOCK_STATEMENT))
>                                                               } // end 
> for
>                                                               }
>                                                            )
>                                                           
> ^(METHOD_DECLS methodDeclaration*))
>
>
> So in the above tree rewrite, the tree is untouched except the 
> ^(HANDLER_DECLS ...) subtree which will have new ^(HANDLER_DECL ...) 
> subtrees being added to it as children. I want to be able to use 
> ANTLR's friendly tree construction syntax in the middle of the loop. 
> Is there any way I can do this or another approach that might work?
>
> Thanks for your time and effort,
> Stephen



More information about the antlr-interest mailing list