Works like a charm! Thanks Jim :)
On Tue, Oct 18, 2011 at 12:27 AM, Jim Idle <[email protected]> wrote: > x > @init {Boolean isPresent = false;} > : > (A { isPresent = true; })? B > > -> {isPresent}? ^(A B) > -> ^(IMAGINE B) > ; > > Jim > > > -----Original Message----- > > From: [email protected] [mailto:antlr-interest- > > [email protected]] On Behalf Of Ross Bamford > > Sent: Sunday, October 16, 2011 4:41 PM > > To: Maximilien Colange > > Cc: [email protected] > > Subject: Re: [antlr-interest] Rewrite action causing error in parser? > > > > Further investigation confirms that this does seem to crop up quite a > > bit, which suggests I'm definitely doing something wrong. I'm just > > hoping that someone might be able to suggest a different way to do what > > I need to do (i.e. insert an imaginary token in place of the optional > > one if it's not specified)? > > > > Thanks, > > Ross > > > > > > On Sun, Oct 16, 2011 at 11:53 PM, Maximilien Colange > > <[email protected]>wrote: > > > > > It appears that this "bug" is frequently reported. > > > It would be nice if ANTLR raised an error (or a warning) when a token > > > is given a reference in a syntactic predicate. > > > > > > However, I do not know whether it is easy to detect. I already > > > encountered this problem, and it occured in a "hidden" ANTLR- > > generated > > > syntactic predicate. I am afraid the error is difficult to detect in > > > such cases. > > > > > > And just for curiosity, why is not it possible to reference local > > > variables or to assign from token in a syntactic predicate ? > > > > > > -- > > > Maximilien > > > > > > Le 10/15/11 11:34 PM, Jim Idle a écrit : > > > > 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\\ba > > > >> sicl > > > >> ang\\parser\\BasicLang.g:99:8: > > > >> id= IDENTIFIER DOT > > > >> { > > > >> > > > >> > > id=(Token)match(input,IDENTIFIER,FOLLOW_IDENTIFIER_in_synpred6_Basi > > > >> cLan > > > >> 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 > > > > > > > > > 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 > > 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.
