let rec isallowed_binop op t1 t2 = match (op,t1,t2) with
(Ast.SynBinopAnd, TyBool, TyBool) -> true
| (Ast.SynBinopOr, TyBool, TyBool) -> true
| (Ast.SynBinopAdd, (TyInt | TyFloat), (TyInt | TyFloat)) -> true
| (Ast.SynBinopSub, (TyInt | TyFloat), (TyInt | TyFloat)) -> true
| (Ast.SynBinopMul, (TyInt | TyFloat), (TyInt | TyFloat)) -> true
| (Ast.SynBinopDiv, (TyInt | TyFloat), (TyInt | TyFloat)) -> true
| (Ast.SynBinopIDiv, TyInt, TyInt) -> true
| (Ast.SynBinopMod, TyInt, TyInt) -> true
| (Ast.SynBinopConcat, TyString, TyString) -> true
| (Ast.SynBinopConcat, TyList t_list1, TyList t_list2) -> (t_list1 = t_list2)
| (Ast.SynBinopCons, t_item, TyList t_list) -> (t_item = t_list)
| (Ast.SynCompLt, (TyInt | TyFloat), (TyInt | TyFloat)) -> true
| (Ast.SynCompGt, (TyInt | TyFloat), (TyInt | TyFloat)) -> true
| (Ast.SynCompLte, (TyInt | TyFloat), (TyInt | TyFloat)) -> true
| (Ast.SynCompGte, (TyInt | TyFloat), (TyInt | TyFloat)) -> true
| (Ast.SynCompEq, (TyInt | TyFloat), (TyInt | TyFloat)) -> true
| (Ast.SynCompNeq, (TyInt | TyFloat), (TyInt | TyFloat)) -> true
| (Ast.SynCompEq, x, y) when (x = y) -> true
| (Ast.SynCompNeq, x, y) when (x = y) -> true
| _ -> false