-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathThreeAdrCode.py
More file actions
148 lines (110 loc) · 3.92 KB
/
ThreeAdrCode.py
File metadata and controls
148 lines (110 loc) · 3.92 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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import CodeGenerator
class CodeNode(object):
def __init__(self, name, label, children, single = False):
self.name = name
self.label = label
self.single = single
self.children = children
def isFuncCall(self):
return isinstance(self, Call)
def isOnlyJump(self):
return isinstance(self, Return) or isinstance(self, Goto) or self.isFuncCall()
def getVar(self):
return self.children[0]
def getVarName(self):
return self.children[0].name
def __str__(self):
s = ''
if not self.label == '':
s += str(self.label) + ': '
if not self.name == 'assign':
s += self.name + ' '
for child in self.children:
s += str(child) + ' '
return s
class Push(CodeNode):
def __init__(self, label, children):
super(Push, self).__init__('push', label, children, True)
class Pop(CodeNode):
def __init__(self, label, number):
super(Pop, self).__init__('pop', label, [])
self.number = number
def __str__(self):
return 'pop ' + str(self.number)
def getNo(self):
return self.number
class Param(CodeNode):
def __init__(self, label, children, pos = 0):
super(Param, self).__init__('param', label, children)
self.pos = pos
def __str__(self):
return 'param ' + str(self.children[0]) + ' ' + str(self.pos)
def getPos(self):
return self.pos
class Goto(CodeNode):
def __init__(self, label, jump):
super(Goto, self).__init__('goto', label, [jump])
def getJump(self):
return self.children[0]
class Return(CodeNode):
def __init__(self, label, children):
super(Return, self).__init__('return', label, children, True)
class End(CodeNode):
def __init__(self, label, children):
super(End, self).__init__('end', label, children)
class Assign(CodeNode):
def __init__(self, label, children):
super(Assign, self).__init__('assign', label, children)
def getOperator(self):
if len(self.children) > 2 and isinstance(self.children[2], CodeGenerator.Operator):
return self.children[2]
elif len(self.children) > 3 and isinstance(self.children[3], CodeGenerator.Operator):
return self.children[3]
return None
def First(self):
if len(self.children) == 4:
return self.children[3]
return self.children[2]
def FirstName(self):
if len(self.children) == 4:
return self.children[3].name
return self.children[2].name
def Second(self):
if len(self.children) == 5:
return self.children[4]
return None
def SecondName(self):
if len(self.children) == 5:
return self.chilren[4].name
return ""
class Print(CodeNode):
def __init__(self, label, var):
super(Print, self).__init__('print', label, [var], True)
class Read(CodeNode):
def __init__(self, label, var):
super(Read, self).__init__('read', label, [var])
class Call(CodeNode):
def __init__(self, label, name):
super(Call, self).__init__('call', label, [name])
def getJump(self):
return self.children[0]
class Decl(CodeNode):
def __init__(self, label, children):
super(Decl, self).__init__('decl', label, children)
class If(CodeNode):
def __init__(self, label, children):
super(If, self).__init__('if', label, children, True)
def First(self):
return self.children[0]
def Second(self):
return self.children[2]
def getOperator(self):
return self.children[1]
def getJump(self):
return self.children[4]
class Void(CodeNode):
def __init__(self, name, label, children):
super(Void, self).__init__(name, label, children)
class Func(CodeNode):
def __init__(self, name, label, children):
super(Func, self).__init__(name, label, children)