let rec isallowed_binop op t1 t2 = match (op,t1,t2) with
    (Ast.SynBinopAndTyBoolTyBool-> true
  | (Ast.SynBinopOrTyBoolTyBool-> 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.SynBinopIDivTyIntTyInt-> true
  | (Ast.SynBinopModTyIntTyInt-> true
  | (Ast.SynBinopConcatTyStringTyString-> true
  | (Ast.SynBinopConcatTyList 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