[antlr-interest] philosophy about translation

Terence Parr parrt at cs.usfca.edu
Fri Oct 6 11:27:41 PDT 2006


On Oct 6, 2006, at 2:04 AM, Paul Johnson wrote:

> I'm not knocking the single-tree approach; I'm sure it has its  
> uses. However, my own opinion is that multiple in-situ tree  
> transformations are extremely useful, if not indispensable. Some  
> quick examples, off the top of my head, in addition to Andy's:
>
> 1 - constant reduction. You've got a subtree of, say, a dozen or  
> more nodes which represent something like ((CONSTA << 16) & CONSTB)  
> | (CONSTC >> 2)). There's no point whatever keeping this in the  
> tree and redundantly parsing and re-evaluating it on every AST  
> pass. Why not just evaluate it once in a constant reduction pass,  
> snip off the branch, and replace it with a single CONST node?

Hi Paul,

   Yes as long as the language (i.e., structure) is the same, in-line  
transformation is good.

> 2 - if your language has compound assignments (ie. something like  
> 'a += b') then it's pointless and confusing to keep this in the  
> tree, and it complicates code generation. Why do not just replace  
> the branch with another branch that unrolls the assignment? What if  
> your language is even worse than this - 'x = a += b, a + c'? I  
> expect you all know what language that is.

   Again the language is the same.  No problem.

> 3 - Similarly, if your language has incr/decr operators, these are  
> easily handled by modifying the AST to unroll them.

   Same language.

   Same answer to all of the below...

Ter
> 4 - What if your operators have side-effects, which you can't  
> handle till the next sequence point? Doing this in a single static  
> tree is very difficult. It's simple if you construct a new  
> expression and insert it into the tree at some later point.
>
> 5 - what if your language has multiple ways to do the same thing?  
> Indirection and array access, for example? It makes little sense to  
> code this redundancy into the AST. You can instead have a pass  
> which, for example, eliminates indirections and replaces them with  
> array accesses.
>
> And so on. Bottom line - the AST should represent the programmer's  
> intent, which is never obvious from the bare syntax of whatever  
> language they attempted to code that intent in. Sometimes, it can  
> take you many passes to find out what that intent actually was. Why  
> tie one arm behind your back by sticking with your first AST till  
> the bitter end?
>
> Paul



More information about the antlr-interest mailing list