[antlr-interest] Rewrite action causing error in parser?

Jim Idle jimi at temporal-wave.com
Sat Oct 15 14:34:13 PDT 2011


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: antlr-interest-bounces at antlr.org [mailto:antlr-interest-
> bounces at antlr.org] On Behalf Of Ross Bamford
> Sent: Saturday, October 15, 2011 5:40 AM
> To: antlr-interest at antlr.org
> 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


More information about the antlr-interest mailing list