I've started looking into translating a large amount of legacy Lisp code
into C++ using Antlr. I put together a simple grammar that generates an
AST. My question is: Where is the best place to attach semantic
information? It seems to me that I should have a 2 pass parser, starting
with the AST as shown below and then making  an additional pass to
generate another AST that contains semantics. Unfortunately I'm not that
familiar with Lisp but it seems to be difficult to parse in a single
pass without resorting to an ugly grammar definition since everything in
Lisp seems to be an expression of some sort.  This is ironic since Lisp
already seems to be "parsed". 

 

Input:

 

(defun foo (x y) (progn (+ x 1) (+ y 1)))

 

Grammar:

 

program: (sexpr)* -> ^(PROGRAM sexpr*);

sexpr: QT?(list|atom) ;

list:      '(' ')'   | '(' members ')'  -> ^(LIST members);

members: (sexpr)+;

atom: OPERATOR | ID | num | STRING ;

num       : (n=INT|n=FLOAT) -> ^(NUM $n);

 

AST Output:

 

PROGRAM

     LIST

           defun

           foo

           LIST

                x

                y

           LIST

                progn

                LIST

                     +

                     x

                     1

                LIST

                     +

                     y

                     1

 

Desired Output:

 

PROGRAM

     FUNCTION

           foo

           ARGS

                x

                y

           BLOCK

                +

                     x

                     1

                + 

                     y

                     1

 


--~--~---------~--~----~------------~-------~--~----~
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]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/il-antlr-interest?hl=en
-~----------~----~----~----~------~----~------~--~---

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