-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtable.py
More file actions
69 lines (55 loc) · 2.18 KB
/
table.py
File metadata and controls
69 lines (55 loc) · 2.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
class NameProperty:
def __init__(self, type, value, signed=True):
# type : LLVM 的类型
# value: 程序中的地址
# signed: 是否有符号
self.type = type
self.value = value
self.signed = signed
def get_type(self):
return self.type
def set_type(self, type):
self.type = type
def get_value(self):
return self.value
def set_value(self, value):
self.value = value
def get_signed(self):
return self.signed
def set_signed(self, signed):
self.signed = signed
class NameTable:
def __init__(self):
self.table = [{}]
self.current_scope_level = 0
def enterScope(self):
self.current_scope_level += 1
self.table.append({})
def exitScope(self):
if self.current_scope_level == 0:
raise BaseException("exitScope error")
self.table.pop()
self.current_scope_level -= 1
def addGlobal(self, name: str, _property: NameProperty):
if self.table[0].get(name) is not None:
raise BaseException("global name already exist")
_property.level = 0
self.table[0].update({name: _property})
def addLocal(self, name: str, _property: NameProperty):
if self.table[self.current_scope_level].get(name) is not None:
raise BaseException("local name already exist")
_property.level = self.current_scope_level
self.table[self.current_scope_level].update({name: _property})
def getProperty(self, name: str) -> NameProperty:
for i in range(self.current_scope_level, -1, -1):
if self.table[i].get(name) is not None:
return self.table[i].get(name)
raise BaseException("name not exist")
def setProperty(self, name: str, value):
for i in range(self.current_scope_level, -1, -1):
if self.table[i].get(name) is not None:
_property = self.table[i].get(name)
_property.set_value(value)
self.table[i].update({name: _property})
return
raise BaseException("name not exist")