[antlr-interest] CommonTree & Tree grammar versus DIY

Johannes Luber jaluber at gmx.de
Fri Aug 15 12:29:00 PDT 2008


Terence Parr schrieb:
> 
> On Aug 15, 2008, at 10:13 AM, Andy Tripp wrote:
>> There are an awful lot of parser/lexer tools out there besides ANTLR.
>> I would guess that of all the people doing AST manipulation, few of them
>> use ANTLR treewalkers to do it.
> 
> I don't recommend rewriting asts unless you stay in same tree structure.
> 
>>>> The "manipulating an AST" work of building a translator is quite a 
>>>> different
>>>> job than the "build a lexer/parser" part of it.
>>> Yep.  i'm mostly a fan of walking not rewriting ASts by the 
>>> way...that gets WAY too hard.
>>
>> Maybe I'm misunderstanding you, but walking vs. rewriting is like
>> apples vs. oranges (or "the drive to and from work" vs. "going to
>> work all day"). Walking is what you do when there's (almost) nothing
>> to do.
> 
> Except the entire work of the semantic analyzer of a compiler etc... ;)  
> Compute symb tables, flow analysis, well, just about everything right? ;)
> 
>> Further, Andy has a nice approach of rewriting.
>>> Expect ANTLRMorph, by Leon Su, this Fall!
>>
>> To pick an AST manipulation rule at random...consider that when 
>> translating
>> C to Java, you can assign a zero value to any C struct. The C struct 
>> will become
>> a Java class, and the zero needs to change to "null". Where in the AST
>> do we need to check? Here are a few ways to "assign 0" in C:
>>
>> * simple assignment:   a = NULL;    (where we have #define NULL 0 
>> somewhere)
>> * function call arg:   f(0);        (where f's first arg is some 
>> struct type)
>> * ternary operator:    a = b ? 0 : 0; * function return:     a = 
>> f();     (where f() returns struct type)
> 
> You mean pointer to struct not struct right?
> 
>> So if we have a checkForZeroAssignment() method, calls to it will have 
>> to be inserted
>> in at least four distinct places in our Ctree.g file. And 
>> checkForZero() will
>> have to "know" where it's being called from anyway (for example, in the
>> simple assignment case, it may have to search deep into nested curly 
>> braces
>> for array assignment).
>>
>> So which way is best to slice the problem? We can have a
>> ZeroAssignmentRule class (along with a couple hundred others to do 
>> other things)
>> that searches the AST for these four cases. Or
>> we can have a Ctree.g that, at the ASSIGN node calls 
>> checkForZeroAssignment()
>> and a bunch (20? 50?) of other checks to do other things.
>>
>> I'll be pretty impressed if ANTLRMorph makes this kind of work any 
>> easier,
>> as none of the other AST-rewrite systems seem to.
> 
> We don't do AST rewrite.  We go text-to-text.  You would list those 
> rules above as you've specified.
> 
> assignment:
>     "x = NULL;" -> "<x> = null"
> 
> expr:
>     "f(0)" -> "<f>(null)"
> 
> the ternary could be handled a few ways...but it's worse, right?  You 
> have a type conflict from int to ptr.  You have to decide what to do in 
> that case in general.
> 
> ANTLRMorph rocks!
> 
> Ter

Can ANTLRmorph translate from Java to C# or any other language without 
requiring an analysis depending on an AST?

Johannes


More information about the antlr-interest mailing list