[antlr-interest] Re: rooting a parser rule rather than a token
Eric Mahurin
eric_mahurin at yahoo.com
Thu Aug 12 07:40:53 PDT 2004
I also changed antlr.g and other necessary files for being able to
root rules directly. Everthing is in a tar file in the file section.
I only completed the Java stuff. Maybe someone might want to put
these in the next 2.x ANTLR release :) Are these changes acceptable,
Terrance?
--- In antlr-interest at yahoogroups.com, "Eric Mahurin"
<eric_mahurin at y...> wrote:
> I'm not sure why, but antlr doesn't currently allow you to make a call
> to a rule from another rule an AST root. So, you can't do something
> like this:
>
> binary_expression : primary (binary_operator^ primary)* ;
>
> I haven't yet dove into the antlr code generation to completely fix
> this issue, but you can get around this issue with these changes:
>
>
> 1. Instead of using "^" to root the rule, discard it using "!" and
> then put in this action: {astFactory.makeASTRoot(currentAST,
> returnAST);}. For example, the above rule would become:
>
> binary_expression : primary (
> binary_operator! {astFactory.makeASTRoot(currentAST, returnAST);}
> primary
> )* ;
>
>
> 2. If your rule you want to root contains more than one token and it
> can be at the beginning of the rule calling it, there is a bug in the
> routine makeASTRoot in ASTFactory.java. Change "currentAST.child =
> currentAST.root;" to "currentAST.child = root.getFirstChild();" to fix
> the problem. I did this in a copy of ASTFactory.java in my local
> antlr directory instead of changing the source.
>
>
> 3. This simple fix doesn't handle the case where the the rule you want
> to root is a list of 2 or more tokens (i.e. has 2 or more tokens and
> is unrooted). I can't think of a case where you'd want to root such a
> rule, but if you did want to do this, make these changes in
> ASTFactory.java:
>
> a. In addASTChild, change "currentAST.root.setFirstChild(child);" to:
> currentAST.child = currentAST.root;
> currentAST.advanceChildToEnd();
> currentAST.child.setFirstChild(child);
>
> b. In makeASTRoot, change "currentAST.child = currentAST.root;" to:
> currentAST.child = root;
> currentAST.advanceChildToEnd();
> currentAST.child = currentAST.child.getFirstChild();
>
> These changes *should* be backwards compatible. It also allows you to
> make AST's that have separate left and right/normal children pointers
> to preserve token order.
>
> Anybody want to figure out how to antlr code generation do the right
> thing for using "^" with a rule instead of a token? It's probably
> trivial.
>
> I have more AST suggestions, so expect another message...
>
> Eric
Yahoo! Groups Links
<*> To visit your group on the web, go to:
http://groups.yahoo.com/group/antlr-interest/
<*> To unsubscribe from this group, send an email to:
antlr-interest-unsubscribe at yahoogroups.com
<*> Your use of Yahoo! Groups is subject to:
http://docs.yahoo.com/info/terms/
More information about the antlr-interest
mailing list