[antlr-interest] Reference neseted rewriting result?

John B. Brodie jbb at acm.org
Mon Jul 30 07:43:21 PDT 2012


On 07/30/2012 10:20 AM, Chan David wrote:
> Hi, I created a grammar, there’s a rule looks like below:
> Big_rule: p1=(e=expr -> ^(VR $e1))  p2(s=statement->^(VT $s))  -> ^(ROOT
> $p1 $p2)
> As you see, there are three AST rewritings. ‘p1’ and ‘p2’ are nested result
> of AST rewriting, and they will be referenced in the final rewriting. But
> after code emitted, I found I was wrong, it doesn’t work as my mind. How to
> reference nested rewriting result?

I do not think you can refer to nested rewrites individually.

Each (possibly partial) rewrite sets the tree for the entire rule.

So I can think of 3 possibilities:

1) skip the nested rewrites entirely, e.g.:

r : expr statement -> ^(ROOT ^(VR expr) ^(VT statement)) ;

2) use sub-rules for the nesting, e.g:

r : r1 r2 -> ^(ROOT r1 r2) ;
r1 : expr -> ^(VR expr) ;
r2 : statement -> ^(VT statement) ;

3) reference the outer rule when nesting (not sure this really will 
work), e.g.:

r: (expr -> ^(VR expr) (statement -> r ^(VT statement)) -> ^(ROOT r) ;

The above suggestions are just off the top of my head and untested.

Hope this helps!

More information about the antlr-interest mailing list