[antlr-interest] [Antlr][Java] Possible bug: Incorrect codegen when rewriting w/ code blocks attached.

Austin Hastings Austin_Hastings at Yahoo.com
Mon Sep 8 22:00:47 PDT 2008


I'm parsing a C-like language in Java, and stumbled across this ANTLR 
source:

decl_prefix
    : '*' tql=type_qualifier_list                              -> ^('*' 
$tql)
          {
              $declarator::type = 
typeFactory.getPointerToType($declarator::type, $tql.list);
          }
    ;

which generated the incorrect Java below. It is trying to use a java 
statement (terminated with ';') as a parameter to addChild. I'm not 
clear why - the code block should probably just be left alone, no?

I have found that relocating the code block to before the rewrite rule 
seems to generate correct output. I didn't notice any kind of diagnostic 
being emitted, though it may have been consumed by Eclipse.

=Austin



    public static class decl_prefix_return extends ParserRuleReturnScope {
        CommonTree tree;
        public Object getTree() { return tree; }
    };

    // $ANTLR start "decl_prefix"
    // D:\\My Documents\\My Eclipse 
Workspace\\hlasm\\src\\main\\antlr\\parrot\\hlasm\\Hlasm.g3:400:1: 
decl_prefix : '*' tql= type_qualifier_list -> ^( '*' $tql) ;
    public final HlasmParser.decl_prefix_return decl_prefix() throws 
RecognitionException {
        HlasmParser.decl_prefix_return retval = new 
HlasmParser.decl_prefix_return();
        retval.start = input.LT(1);

        CommonTree root_0 = null;

        Token char_literal36=null;
        HlasmParser.type_qualifier_list_return tql = null;


        CommonTree char_literal36_tree=null;
        RewriteRuleTokenStream stream_67=new 
RewriteRuleTokenStream(adaptor,"token 67");
        RewriteRuleSubtreeStream stream_type_qualifier_list=new 
RewriteRuleSubtreeStream(adaptor,"rule type_qualifier_list");
        try {
            // D:\\My Documents\\My Eclipse 
Workspace\\hlasm\\src\\main\\antlr\\parrot\\hlasm\\Hlasm.g3:401:2: ( '*' 
tql= type_qualifier_list -> ^( '*' $tql) )
            // D:\\My Documents\\My Eclipse 
Workspace\\hlasm\\src\\main\\antlr\\parrot\\hlasm\\Hlasm.g3:401:4: '*' 
tql= type_qualifier_list
            {
            
char_literal36=(Token)match(input,67,FOLLOW_67_in_decl_prefix992); if 
(state.failed) return retval;
            if ( state.backtracking==0 ) stream_67.add(char_literal36);

            pushFollow(FOLLOW_type_qualifier_list_in_decl_prefix996);
            tql=type_qualifier_list();

            state._fsp--;
            if (state.failed) return retval;
            if ( state.backtracking==0 ) 
stream_type_qualifier_list.add(tql.getTree());


            // AST REWRITE
            // elements: tql, 67
            // token labels:
            // rule labels: retval, tql
            // token list labels:
            // rule list labels:
            if ( state.backtracking==0 ) {
            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new 
RewriteRuleSubtreeStream(adaptor,"token 
retval",retval!=null?retval.tree:null);
            RewriteRuleSubtreeStream stream_tql=new 
RewriteRuleSubtreeStream(adaptor,"token tql",tql!=null?tql.tree:null);

            root_0 = (CommonTree)adaptor.nil();
            // 401:36: -> ^( '*' $tql)
            {
                // D:\\My Documents\\My Eclipse 
Workspace\\hlasm\\src\\main\\antlr\\parrot\\hlasm\\Hlasm.g3:401:39: ^( 
'*' $tql)
                {
                CommonTree root_1 = (CommonTree)adaptor.nil();
                root_1 = 
(CommonTree)adaptor.becomeRoot(stream_67.nextNode(), root_1);

                adaptor.addChild(root_1, stream_tql.nextTree());

                adaptor.addChild(root_0, root_1);
                }
                adaptor.addChild(root_0,
                              
((declarator_scope)declarator_stack.peek()).type = 
typeFactory.getPointerToType(((declarator_scope)declarator_stack.peek()).type, 
(tql!=null?tql.list:null));
                          );
////// ************************************
///// BAD CODE ABOVE: See ';' at end of line inside 
adaptor.addChild(root_0, ...);
////// ************************************

            }

            retval.tree = root_0;}
            }

            retval.stop = input.LT(-1);

            if ( state.backtracking==0 ) {

            retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, 
retval.stop);
            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, 
input.LT(-1), re);

        }
        finally {
        }
        return retval;
    }
    // $ANTLR end "decl_prefix"



More information about the antlr-interest mailing list