[antlr-interest] Rewrite bug?
    Surj Basan 
    s.basan at surge.it
       
    Sun Jul 15 23:24:45 PDT 2012
    
    
  
Hi All,
I have a Java grammar (taken from the openjdk, one linked off
the ANTLR site:
http://openjdk.java.net/projects/compiler-grammar/antlrworks/Java.g).
One of the rewrite rules produces Java code which does not have a var decl,
and so does not compile.
I took the rule straight out of Terrence Parr's page on rewrite rules and
added it to the grammar (
http://www.antlr.org/wiki/display/ANTLR3/Tree+construction, paragraph
beginning "Using a rewrite rule at a non-extreme-right-edge-of-production
location is ok..").
Can someone explain if this is a bug in ANTLR? Code is below, for ref.
Grammar rule:
statement
    :   [more rules here]
    |   'if' parExpression s1=statement ('else' s2=statement -> ^('if'
parExpression $s1 $s2)
                                        |                      -> ^('if'
parExpression $s1)
                                        )
    [more rules here]
    ;
Generated parser code:
    // $ANTLR start synpred139_AntlrJava
    public final void synpred139_AntlrJava_fragment() throws
RecognitionException {
        void  =null;
        // AntlrJava.g:926:42: ( 'else' s2= statement )
        // AntlrJava.g:926:42: 'else' s2= statement
        {
match(input,KEYWORD_ELSE,FOLLOW_KEYWORD_ELSE_in_synpred139_AntlrJava4927);
if (state.failed) return ;
        pushFollow(FOLLOW_statement_in_synpred139_AntlrJava4931);
        s2=statement();
        state._fsp--;
        if (state.failed) return ;
        }
    }
(For what it's worth, I find that various permutations of rewrite rules
exhibit the same behaviour: missing var decls in the generated parser.
Java.g is a pretty complex grammar. Would I have more luck if I split the
grammar into the lexer/parser and a separate tree building one, instead of
combining it all into a single file?)
Any help greatly appreciated.
Thanks,
Surj
    
    
More information about the antlr-interest
mailing list