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")))
    ))
)
*/

}