Skip to content

Commit f76822f

Browse files
committed
check
1 parent 8f54efc commit f76822f

File tree

11 files changed

+196
-0
lines changed

11 files changed

+196
-0
lines changed

tests/var/add.golden

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
42

tests/var/add.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+

tests/var/add.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
print(40 + 2)

tests/var/input.golden

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
42

tests/var/input.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
42

tests/var/input.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
print(input_int())

tests/var/zero.golden

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
0

tests/var/zero.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+

tests/var/zero.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
print(0)

type_check_Pvar.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
from ast import *
2+
3+
def check_type_equal(t1, t2, e):
4+
if t1 != t2:
5+
raise Exception('error: ' + repr(t1) + ' != ' + repr(t2) + ' in ' + repr(e))
6+
7+
class TypeCheckPvar:
8+
9+
def type_check_exp(self, e, env):
10+
match e:
11+
case BinOp(left, Add(), right):
12+
l = self.type_check_exp(left, env)
13+
check_type_equal(l, int, left)
14+
r = self.type_check_exp(right, env)
15+
check_type_equal(r, int, right)
16+
return int
17+
case UnaryOp(USub(), v):
18+
t = self.type_check_exp(v, env)
19+
check_type_equal(t, int, v)
20+
return int
21+
case Name(id):
22+
return env[id]
23+
case Constant(value) if isinstance(value, int):
24+
return int
25+
case Call(Name('input_int'), []):
26+
return int
27+
case _:
28+
raise Exception('error in TypeCheckPvar.type_check_exp, unhandled ' + repr(e))
29+
30+
def type_check_stmts(self, ss, env):
31+
if len(ss) == 0:
32+
return
33+
match ss[0]:
34+
case Assign([lhs], value):
35+
t = self.type_check_exp(value, env)
36+
if lhs.id in env:
37+
check_type_equal(env[lhs.id], t, value)
38+
else:
39+
env[lhs.id] = t
40+
return self.type_check_stmts(ss[1:], env)
41+
case Expr(Call(Name('print'), [arg])):
42+
t = self.type_check_exp(arg, env)
43+
check_type_equal(t, int, arg)
44+
return self.type_check_stmts(ss[1:], env)
45+
case Expr(value):
46+
self.type_check_exp(value, env)
47+
return self.type_check_stmts(ss[1:], env)
48+
case _:
49+
raise Exception('error in TypeCheckPvar.type_check_stmt, unhandled ' + repr(s))
50+
51+
def type_check_P(self, p):
52+
match p:
53+
case Module(body):
54+
self.type_check_stmts(body, {})

0 commit comments

Comments
 (0)