ANTLRの練習としてS式構築機を

まずデータ構造を定義してだな(割愛)、あとはパーサを改造して、

sexpr
  returns [SExpr result=null]
  :  result=atom
  |  result=list
  |  result=quote
  |  result=nil
  ;
quote
  returns [SExpr result=null]
  {SExpr val;}
  :  QUOTE val=sexpr {result=new Cons(new Symbol("'"),val);}
  ;
list
  returns [SExpr result=null]
  {
    Stack stack=new Stack();
    SExpr head;
    SExpr val;
    SExpr tail=Null.Instance;
  }
  :  OPAREN
       head=sexpr
       (val=serialSexpr{stack.Push(val);})* 
       (WS DOT tail=sexpr)?
       (WS)?
     CPAREN
     {
       for(;stack.Count>0;tail=new Cons(stack.Pop(),tail)) ;
       result=new Cons(head,tail);
     }
   ;
serialSexpr
  returns [SExpr result=null]
  : (WS result=sexpr) ;
nil
  returns [SExpr result=Null.Instance]
  :  OPAREN CPAREN ;
atom
  returns [SExpr result=null]
  :  i:INT {result=new Integer(int.Parse(i.getText()));}
  |  s:SYMBOL {result=new Symbol(s.getText());}
  ;

しゅうりょう。