Firstly, try to use the macros like LT() rather than following the pointers 
directly.

Secondly, have you tried the MARK, SEEK and REWIND macros - this kind of thing 
is what they are designed for.

If your imaginary tokens do not have the start and stop token indexes set, then 
you are probably rewriting them like this:

 

รจ ^(GOOONEWITHINDICES X Y ^(THISWONTGETINDICES A B))

 

Move the inner rewrite into a sub rule and it will get indices.

 

Jim

 

 

From: [email protected] 
[mailto:[email protected]] On Behalf Of Mohamed Yousef
Sent: Saturday, November 14, 2009 9:36 AM
To: [email protected]
Subject: Re: [antlr-interest] [C Target] How to skip a whole sub-tree (not just 
a token)

 

i found a solution - more of a hack - to enable/make it easier to do control 
flow avoiding obscure act about token positions
before the real walk we make a small walk (not very expensive) to store those 
data

nodes    = antlr3CommonTreeNodeStreamNewTree(yatgAST.tree, ANTLR3_SIZE_HINT); 
pANTLR3_BASE_TREE p;
while(true)
{
            // this should/can be further optimized by adding data to certain 
nodes only
            p=nodes->tnstream->_LT(nodes->tnstream,1);
            
p->savedIndex=nodes->tnstream->istream->index(nodes->tnstream->istream);
            
if(p->getType(p)==nodes->EOF_NODE.token->getType(nodes->EOF_NODE.token))break;
            nodes->tnstream->istream->consume(nodes->tnstream->istream);
}

it enabled me to implement my IF statement in way i wanted

this is sure not the best way to do it , any ideas ?

Regards,
Mohammed Yousef

2009/11/13 Mohamed Yousef <[email protected]>

Sorry , it seems i jumped to a wrong result
indices are calculated correctly and UP&Down are taken into consideration
the real problem that i discovered now 
is that during tree parsing nodes have no info about the real start and end 
positions till respective childs are parsed , so here :



if_expr
    :
      ^(EIF ^(EIF_COND c =expr_g)  { // examine c and selectively jump to e }  )

EIF would think and respond as c is the end of the world , it has no knowledge 
of EIF_THEN

so we have either two solutions :
1) go parse it by hand : tedious , inefficient , probably won't be generic
2) another idea i have now is to store node indices (e.g. for COND , THEN, ELSE 
in EIF ) either during parsing or in a separate walk to "flow control" nodes

i will try both and see
any better ideas ?

2009/11/13 Mohamed Yousef <[email protected]>

 

Hello all,
i sent before regarding a bug in Control flow  in which a e=. won't define e , 
i was suggested by jim to walk tree my self using LT

now i have a problem , consider following 

if_expr
    :
      ^(EIF ^(EIF_COND c =expr_g) ^(EIF_THEN e=expr_g)  ) { // examine c and 
selectively jump to e }

must be changed to something like

if_expr
    :
      ^(EIF ^(EIF_COND c =expr_g)  { // examine c and selectively jump to e }  )

and we have a problem
how can we skip the whole EIF_THEN tree (when c is false ) ? , if we try to use 
the stopIndex of EIF to jump to it's end
we have the problem that all returned indices ,by all means , don't take UP & 
DOWN nodes into accout , where the SEEK macro
takes them into accout
any ideas ?

 

 



--

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