[antlr-interest] Parsing Lisp into C++
    Richard Lewis 
    Richard.Lewis at razor-risk.com
       
    Sun Sep 27 18:32:19 PDT 2009
    
    
  
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
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.antlr.org/pipermail/antlr-interest/attachments/20090928/b82d3e5a/attachment.html 
    
    
More information about the antlr-interest
mailing list