[antlr-interest] Tree transformation

Arnar Birgisson arnarb at oddi.is
Sun Nov 16 11:51:55 PST 2003


Hello again..

I solved this problem by rewriting the transformation so that it worked
without the !. However, I keep hitting this wall in other places, and
now I'm completely stuck. Consider those (simplified) constructs in my
language

f -> procedure()
var x
body
  expression1,
  block
    x := \incr x,
    \print [1,2,3]
  endblock,
  x := \incr ,
  \print [1,2,3]
endbody

Now.. the expressions "\incr x" and "[1,2,3]" have such trees:

#([OPERATOR,"incr"] x)
#([LIST,"["] #([EXPR_LIST] 1 2 3) )

and I have rules in my tree transformer that changes them to the
equivalent of the expressions "incr(x)" (function call) and
"mk_pair(1,mk_pair(2,mk_pair(3,[])))". This transformation works very
well for the second pair of those expressions.

Now I want to make a transformation for turning

BLOCK
 | 
EXPR_LIST
 |
expr1 - expr2 - ... - exprN

to

expr1 - expr2 - ... - exprN.

For this I have the rule alternative

|! #(BLOCK list:expr_list)
	{
		## = list->getFirstChild();
	}

This seems to work except that the transformations inside this instance
of expr_list don't get executed. Therefore, the transformation of the
code above is applied only to the second pair of afformentioned
expressions.

I'm using exactly the same rule (expr_list) to traverse the list of
expressions whether they are inside the procedure body, or inside a
block. I'm stumped!

If I remove the ! I get two copies of the subtree, one where
transformations have been applied, and one where they havent...

Am I doing something terribly wrong or is this unexpected behaviour?

Arnar


> -----Original Message-----
> From: mzukowski at yci.com [mailto:mzukowski at yci.com] 
> Sent: 14. nóvember 2003 18:39
> To: antlr-interest at yahoogroups.com
> Subject: RE: [antlr-interest] Tree transformation
> 
> 
> Hard to tell.  I recommend using -traceParser and following 
> through the code
> to see what's happening.
> 
> Monty
> 
> -----Original Message-----
> From: Arnar Birgisson [mailto:arnarb at oddi.is] 
> Sent: Friday, November 14, 2003 7:24 AM
> To: antlr-interest at yahoogroups.com
> Subject: [antlr-interest] Tree transformation
> 
> Hello..
> 
> I'm having some trouble I can't figure out, possibly because I'm doing
> something stupid.
> 
> I have this rule in a tree parser for transforming loops:
> 
> loop_stmt
> 	: #(L_LOOP stmt_list)
> 	| #(L_WHILE expr stmt_list)
> 	|! #(L_FOR init:stmt_list test:expr incr:stmt_list
> body:stmt_list)
> 		{
> 			/* this changes "for" loops to "while" loops */
> 			antlr::RefAST newbody;
> 			antlr::RefAST lastBodyStmt =
> body->getFirstChild();
> 			if (antlr::nullAST == lastBodyStmt) {
> 				newbody = incr;
> 			} else {
> 				while (antlr::nullAST !=
> lastBodyStmt->getNextSibling())
> 					lastBodyStmt =
> lastBodyStmt->getNextSibling();
> 	
> lastBodyStmt->setNextSibling(incr->getFirstChild());
> 				newbody = body;
> 			}
> 			antlr::RefAST l = #([L_WHILE,"while"], test,
> newbody);
> 			antlr::RefAST lastInitStmt =
> init->getFirstChild();
> 			if (antlr::nullAST == lastInitStmt) {
> 				## = l;
> 			} else {
> 				while (antlr::nullAST !=
> lastInitStmt->getNextSibling())
> 					lastInitStmt =
> lastInitStmt->getNextSibling();
> 				lastInitStmt->setNextSibling(l);
> 				## = init->getFirstChild();
> 			}
> 		}
> 	;
> 
> Now, stmt_list is a simple rule
> 
> stmt_list
> 	: #(STMT_LIST (stmt)*)
> 	;
> 
> and the stmt rule is a big rule, with one alternative being this
> (note that in my language there is no difference between 
> statements and
> expressions):
> 
> 	|! #(OPERATOR s1:expr s2:expr)
> 		{
> 			/* this changes "x <op> b" to the function call
> "<op>(x,y)"
> 			#OPERATOR->setType(ID);
> 			## = #([OPEN_PAR,"("], ADGERD,
> #([stmt_list,"params"], s1, s2));
> 		}
> 
> Now, this alternative successfully transforms operator statements to
> function alls when they are top level statements in functions 
> (accessed
> throught stmt_list), but when they're in a for-loop body 
> (named "body")
> in the above rule, no transformation takes place, i.e. #(OPERATOR expr
> expr) is left as is.
> 
> I've tried removing the ! in the for-loop rule but that doesn't help..
> the transformation doesn't take place.
> 
> Any ideas?
> 
> Arnar
> 
> 
>  
> 
> Your use of Yahoo! Groups is subject to 
> http://docs.yahoo.com/info/terms/ 
> 
> 
>  
> 
> Your use of Yahoo! 
> Groups is subject to http://docs.yahoo.com/info/terms/ 
> 
> 


 

Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/ 




More information about the antlr-interest mailing list