[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