validator
javascriptで書いてた2分木のバリデータをScalaでタプルで書いてある2分木に対応させて見ました。
object valid extends Application { def valid(data:Any) { statement(data) } def statement(data:Any) { data match { case (l, "if", r) => exp(l); else_(r) case (l, "C", r) => valid(l); valid(r) case _ => exp(data) } } def else_(data:Any) { data match { case (l,"else",r) => exp(l); exp(r) case _ => exp(data) } } def id(data:Any) { data match { case data:Int => case data:Double => case data:String => case _ => throw new Error("error exprected id but found "+data) } } def assignLeft(data:Any) { data match { case (_,"[]",_) => arr(data) case _ => id(data) } } def arr(data:Any) { data match { case (l,"[]",r) => assignLeft(l); exp(r) case _ => throw new Error("error") } } def exp(data:Any) { data match { case (l,"=",r) => assignLeft(l); exp(r) case (l,"+",r) => exp(l); exp(r) case (l,"*",r) => exp(l); exp(r) case _ => id(data) } } def test(data:Any) { try { valid(data) } catch { case e => println(e+" "+data) } } test((1,"+", (2, "*", 3))); test((1,"*", (2, "+", 3))); test((1,"if", (2, "else", 3))); test((1,"if", (2, "els", 3))); test((1,"if", (2, "else", (3,"else",4) ))); test((1,"if", 3)); test((1,"C",(1,"if", 3))); test((1,"else",2)); test(("a","=",2)); test((("a","=","b"),"=",2)); test(("a","=",("b","=",2))); test((("a","[]",2),"=",2)); test((("a","[]",("a","=","b")),"=",2)); }