AST2ST
抽象構文木から構文木への変換プログラムです。
手抜きはありますが、いちお、変換出来マッス。
object st2ast { def main(argv:Array[String]) { val st = ( ("main","=",("fun","(","void",")",( ("a","=",("add","(",((1,",",2),",",3),")")), "@", ("printInt","(","a",")") ))), "@", ("add","=",("fun","(",(("a",",","b"),",","c"),")",( "return","(",("a","+",("b","+","c")),")" ))) ) val ast = st2ast(st) println("ast="+ast) } def apply(st:Any):Any = { st match { case (a,"@",b) => ls(a):::ls(b) case (a,"=",("fun","(",p,")",b)) => (a,prms(p),ls(b)) case (a,"=",b) => ("mov", st2ast(b), st2ast(a)) case (a,"+",b) => ("add", st2ast(a), st2ast(b)) case ("return", "(", a, ")") => ("ret", st2ast(a)) case (a,"(",b,")") => ("call",a,prms(b)) case a:Int => a case a:String => a } } def ls(st:Any):List[Any] = { st match { case (a,"@",b) => ls(a):::ls(b) case "void" => List() case a => List(st2ast(a)) } } def prms(st:Any):List[Any] = { st match { case (a,",",b) => prms(a):::prms(b) case "void" => List() case a => List(st2ast(a)) } } /* val = List( ("main",List(),List( ("mov",("call","add",List(1,2,3)),"a"), ("call", "printInt", List("a")) )), ("add",List("a","b","c"),List( ("return", ("add","a",("add","b","c"))) )) ) */ }