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));
}