[antlr-interest] [C Target] How to skip a whole sub-tree (not just a token)

Mohamed Yousef harrrrpo at gmail.com
Sat Nov 14 19:50:10 PST 2009


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 <claude.moulin at hds.utc.fr>

>  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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.antlr.org/pipermail/antlr-interest/attachments/20091115/967f9f1b/attachment.html 


More information about the antlr-interest mailing list