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
--
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