I think I have said more than a few times now that this will be fixed up for 3.2.1 - I thought I had fixed it for 3.2. Sorry it is really useless - sigh. For what it's worth, I think that you are going about this incorrectly, and that's why you are having problems beyond the '.' bug - probably your code is really useless - no offence though right?
Jim From: [email protected] [mailto:[email protected]] On Behalf Of Mohamed Yousef Sent: Saturday, November 14, 2009 7:50 PM To: Claude Moulin Cc: [email protected] Subject: Re: [antlr-interest] [C Target] How to skip a whole sub-tree (not just a token) Thanks Claude, if i understand your code correctly , it looks that the "." eats the whole "Then" tree ( tree executed when condition is true ) so u mark berfore it ( then case) and after it (else cases) , is that true ? well , if this is true and this is the standard implementation , then this is a bug in the C Target in the C Target the macro MATCHANYT() represents the "." , unfortunetly it matches only a signle token , not a sub-tree , making it really usless however , it's really easy to modify this in the c target , just confirm me this is the standard behavior ( a note i thinked of now , can anybody check to see if the java terget saves the indexes of nodes , and i mean indexes of them as they appear in the flattened parse tree , coz this is another cause of problems in C Target ) Thanks Regards, Mohammed Yousef 2009/11/14 Claude Moulin <[email protected]> Here is the solution I use in Java. The principle is also valid for loops. I suppose the CommonTreeNodeStream methods () I use have equivalent functions in C push, pop, and mark if_statement @init{ int mark_before_true = 0; int mark_before_false = 0; } : ^(IF e = expbool {mark_before_true = input.mark();} . ({mark_before_false = input.mark();} else_list = .)? ) { if ($e.b) { push(mark_before_true); list_instructions(); pop(); } else if (else_liste != null) { push(mark_before_false); list_instructions(); pop(); } } ; expbool is a rule returning a Boolean in its b field. list_instructions is a rule parsing a tree containing instructions in a list. input.mark() gives the index of the following node and in this case it is the index I want to store. And in the @members section I add two methods in order to simplify the code: public void push(int index) { ((CommonTreeNodeStream)input).push(index); } public void pop() { ((CommonTreeNodeStream)input).pop(); } I hope it is usefull. Claude 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]. For more options, visit this group at http://groups.google.com/group/il-antlr-interest?hl=.
List: http://www.antlr.org/mailman/listinfo/antlr-interest Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-email-address
