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

Reply via email to