[antlr-interest] Re: Bug in ASTFactory class

Prashant Deva prashant.deva at gmail.com
Wed Jul 20 15:57:17 PDT 2005


I have clarified with Terrence , and he says that the above
functionality is by design.

So this is not a bug.

PRASHANT

On 7/21/05, Prashant Deva <prashant.deva at gmail.com> wrote:
> There is a bug in the ASTFactory.addASTChild() method.
> It is described below--
> 
>  public void addASTChild(ASTPair currentAST, AST child) {
>         if (child != null) {
>             if (currentAST.root == null) {
>                 // Make new child the current root
>                 currentAST.root = child;
>             }
>             else {
>                 if (currentAST.child == null) {
>                     // Add new child to current root
>                     currentAST.root.setFirstChild(child); //<--THIS
> LINE CANT BE REACHED
>                 }
>                 else {
>                     currentAST.child.setNextSibling(child);
>                 }
>             }
>             // Make new child the current child
>             currentAST.child = child;              //  --|    THESE
> LINES SHOULD BE IN THE
>             currentAST.advanceChildToEnd(); //  --| ABOVE BRACE
>         }
>     }
> 
> 
> The last 2 lines make the child *always* not null, so the root can
> never set the first child.
> They should be in the scope of the else statement.
> 
> Due to this bug, currently if you have a rule, with no tree symbols
> (like ^), it will generate only 1 tree element, which is the root.
> 
> The correct code i belive should be-
> 
>  public void addASTChild(ASTPair currentAST, AST child) {
>         if (child != null) {
>             if (currentAST.root == null) {
>                 // Make new child the current root
>                 currentAST.root = child;
>             }
>             else {
>                 if (currentAST.child == null) {
>                     // Add new child to current root
>                     currentAST.root.setFirstChild(child);
>                 }
>                 else {
>                     currentAST.child.setNextSibling(child);
>                 }
> 
>             // Make new child the current child
>             currentAST.child = child;
>             currentAST.advanceChildToEnd();
>           }
>         }
>     }
> 
> Thus by moving the last 2 lines in the 'else' scope , the
> setFirstChild line can be reached.
> 
> PRASHANT
>


More information about the antlr-interest mailing list