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());} ;
しゅうりょう。