[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