-
Notifications
You must be signed in to change notification settings - Fork 0
/
irgenerator.py
45 lines (38 loc) · 1.89 KB
/
irgenerator.py
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
'''Classes and functions to support the generation an intermediate representation'''
import c_types, ircode
class IRGenerator(object):
def __init__(self, symbol_table, typedef_table):
self.symbol_table = symbol_table
self.typedef_table = typedef_table
self.tempcount = 0
def next_temporary(self, type=None):
name = 't%d' % self.tempcount
self.tempcount += 1
while self.symbol_table.in_table(name):
name = 't%d' % self.tempcount
self.tempcount += 1
identifier = c_types.Identifier(name, type=type)
self.symbol_table.create_symbol(identifier)
return identifier
def load_constant(self, const):
temp = self.next_temporary(const.type)
temp.value = const.value
statements = [ircode.Statement(ircode.CopyType, result=temp, operand=const)]
return temp, statements
def unary_operation(self, operator, operand):
if operand: temp = self.next_temporary(operand.type)
else: temp = self.next_temporary()
statements = [ircode.Statement(ircode.UnaryAssignmentType, result=temp, operator=operator,
operand=operand)]
return temp, statements
def binary_operation(self, operator, operand_1, operand_2):
print operator, operand_1, operand_2
assert operand_1.type == operand_2.type
temp = self.next_temporary(operand_1.type)
statements = [ircode.Statement(ircode.BinaryAssignmentType, result=temp, operator=operator,
operand_1=operand_1, operand_2=operand_2)]
return temp, statements
def copy(self, source, target):
assert source.type == target.type
statements = [ircode.Statement(ircode.CopyType, result=target, operand=source)]
return target, statements