Your problem does not look to be the rewrite rule, but the fact that you are referencing a local variable in a predicate, or have tried to assign from a token in a predicate.
Look for something like this ((id=IDENTIFIER)=> id=IDENTIFIER)? .... But regardless, this is the rewrite rule that is the problem as far as I can see. Try commenting it out for instance. Jim > -----Original Message----- > From: [email protected] [mailto:antlr-interest- > [email protected]] On Behalf Of Ross Bamford > Sent: Saturday, October 15, 2011 5:40 AM > To: [email protected] > Subject: [antlr-interest] Rewrite action causing error in parser? > > Hi all, > > I have a grammar I'm currently working on (posted in another thread the > other day), which has the following rule: > > meth_call_expr > : (id = IDENTIFIER DOT)? func_call_expr -> ^(METHOD_CALL { > ($id==null) ? > adaptor.create(SELF, "SELF") : adaptor.create(IDENTIFIER, > $id.getText()) } > func_call_expr) > ; > > As you can see, I'm using an action in the rewrite rule to insert > either the > (optional) IDENTIFIER, or an imaginary SELF node if IDENTIFIER is not > specified. The problem I'm having is that this generates a parser that > won't compile. Specifically, it generates the following bit of code > (edited by hand for brevity and to highlight the error): > > /* **** [ CODE ] **** */ > // $ANTLR start synpred6_BasicLang > public final void synpred6_BasicLang_fragment() throws > RecognitionException { > > Token =null; // <-- ERROR HERE > > /* ... later on ... */ > > switch (alt23) { > case 1 : > // > C:\\Users\\chantelle\\workspace\\basiclang\\src\\com\\roscopeco\\basicl > ang\\parser\\BasicLang.g:99:8: > id= IDENTIFIER DOT > { > > id=(Token)match(input,IDENTIFIER,FOLLOW_IDENTIFIER_in_synpred6_BasicLan > g232); > if (state.failed) return ; // <-- AND HERE > > match(input,DOT,FOLLOW_DOT_in_synpred6_BasicLang234); > if > (state.failed) return ; > > } > break; > > } > /* **** [ END ] **** */ > > Obviously the problem is the "Token =null" line, which should be "Token > id = null". Changing it by hand fixes the errors and makes the parser > work as expected. > > So I have two questions - is this the right way to go about inserting > an imaginary token if an optional token isn't in the input, and if so, > what am I doing wrong to cause the error above? > > Thanks in advance, > Ross > > List: http://www.antlr.org/mailman/listinfo/antlr-interest > Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your- > email-address List: http://www.antlr.org/mailman/listinfo/antlr-interest Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-email-address -- You received this message because you are subscribed to the Google Groups "il-antlr-interest" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/il-antlr-interest?hl=en.
