55
66class TypeCheckCfun (TypeCheckCtup ):
77
8- def parse_type_annot (self , annot ):
9- match annot :
10- case Name (id ):
11- if id == 'int' :
12- return int
13- elif id == 'bool' :
14- return bool
15- else :
16- raise Exception ('parse_type_annot: unexpected ' + repr (annot ))
17- case TupleType (ts ):
18- return TupleType ([self .parse_type_annot (t ) for t in ts ])
19- case FunctionType (ps , rt ):
20- return FunctionType ([self .parse_type_annot (t ) for t in ps ],
21- self .parse_type_annot (rt ))
22- case Subscript (Name ('Callable' ), Tuple ([ps , rt ])):
23- return FunctionType ([self .parse_type_annot (t ) for t in ps .elts ],
24- self .parse_type_annot (rt ))
25- case Subscript (Name ('tuple' ), Tuple (ts )):
26- return TupleType ([self .parse_type_annot (t ) for t in ts ])
27- case _:
28- raise Exception ('parse_type_annot: unexpected ' + repr (annot ))
8+ # def parse_type_annot(self, annot):
9+ # match annot:
10+ # case Name(id):
11+ # if id == 'int':
12+ # return int
13+ # elif id == 'bool':
14+ # return bool
15+ # else:
16+ # raise Exception('parse_type_annot: unexpected ' + repr(annot))
17+ # case TupleType(ts):
18+ # return TupleType([self.parse_type_annot(t) for t in ts])
19+ # case FunctionType(ps, rt):
20+ # return FunctionType([self.parse_type_annot(t) for t in ps],
21+ # self.parse_type_annot(rt))
22+ # case Subscript(Name('Callable'), Tuple([ps, rt])):
23+ # return FunctionType([self.parse_type_annot(t) for t in ps.elts],
24+ # self.parse_type_annot(rt))
25+ # case Subscript(Name('tuple'), Tuple(ts)):
26+ # return TupleType([self.parse_type_annot(t) for t in ts])
27+ # case _:
28+ # raise Exception('parse_type_annot: unexpected ' + repr(annot))
2929
3030 def type_check_exp (self , e , env ):
3131 match e :
@@ -53,8 +53,8 @@ def type_check_def(self, d, env):
5353 match d :
5454 case FunctionDef (name , params , blocks , dl , returns , comment ):
5555 new_env = {x : t for (x ,t ) in env .items ()}
56- for p in params . args :
57- new_env [p . arg ] = self . parse_type_annot ( p . annotation )
56+ for ( x , t ) in params :
57+ new_env [x ] = t
5858 while True :
5959 old_env = copy .deepcopy (new_env )
6060 for (l ,ss ) in blocks .items ():
@@ -66,7 +66,7 @@ def type_check_def(self, d, env):
6666 # trace('type_check_Cfun var_types for ' + name)
6767 # trace(d.var_types)
6868 case _:
69- raise Exception ('type_check_def: unexpected ' + repr (ss [ 0 ] ))
69+ raise Exception ('type_check_def: unexpected ' + repr (d ))
7070
7171 def type_check_stmts (self , ss , env ):
7272 if len (ss ) == 0 :
@@ -84,10 +84,8 @@ def type_check(self, p):
8484 for d in defs :
8585 match d :
8686 case FunctionDef (name , params , bod , dl , returns , comment ):
87- params_t = [self . parse_type_annot (p .annotation ) \
88- for p in params .args ]
89- env [name ] = FunctionType (params_t ,
90- self .parse_type_annot (returns ))
87+ params_t = [t for (x ,t ) in params ]
88+ env [name ] = FunctionType (params_t , returns )
9189 for d in defs :
9290 self .type_check_def (d , env )
9391 case _:
0 commit comments