Python 类型错误:Can';t转换为';节点';对象隐式地访问str
对于以下代码-Python 类型错误:Can';t转换为';节点';对象隐式地访问str,python,Python,对于以下代码- Reg_Stack = ['R5', 'R4', 'R3', 'R2', 'R1', 'R0'] Temp_Stack = ['T5', 'T4', 'T3', 'T2', 'T1', 'T0'] operator_precedence = {'(' : 0, ')' : 0, '+' : 1, '-' : 1, '*' : 2, '/' : 2} def gen_code(n): if(n.left == None and n.right == None):
Reg_Stack = ['R5', 'R4', 'R3', 'R2', 'R1', 'R0']
Temp_Stack = ['T5', 'T4', 'T3', 'T2', 'T1', 'T0']
operator_precedence = {'(' : 0, ')' : 0, '+' : 1, '-' : 1, '*' : 2, '/' : 2}
def gen_code(n):
if(n.left == None and n.right == None):
print("MOV " + n.value + "," + Reg_Stack[-1])
else:
if(n.right.label == 0):
gen_code(n.left)
print(operator(n.value) + " " + n.right.value + "," + Reg_Stack[-1])
elif((n.left.label < n.right.label) and (n.left.label < len(Reg_Stack))):
swap()
gen_code(n.left)
R = Reg_Stack.pop()
gen_code(n.left)
print(operator(n.value) + " " + n.left.value + "," + Reg_Stack[-1])
Reg_Stack.append(R)
swap()
elif((n.right.label < n.left.label) and (n.right.label < len(Reg_Stack))):
gen_code(n.left)
R = Reg_Stack.pop()
gen_code(n.right)
print(operator(n.value) + " " + n.right.value + "," + Reg_Stack[-1])
Reg_Stack.append(R)
else:
gen_code(n.right)
T = Temp_Stack.pop()
print("MOV " + Reg_Stack[-1] + "," + T)
gen_code(n.left)
Temp_Stack.append(T)
print(operator(n.value) + " " + T + "," + Reg_Stack[-1])
def operator(v):
if(v == "+"):
return "ADD"
if(v == "-"):
return "SUB"
if(v == "*"):
return "MUL"
def swap():
a1 = Reg_Stack.pop()
b1 = Temp_Stack.pop()
Reg_Stack.append(b)
Temp_Stack.append(a)
class node(object):
def __init__(self, value='', lvalue=0, node1 = None, node2 = None):
self.value = value
self.left = node1
self.right = node2
self.label = lvalue
a = node('a', 1)
b = node('b', 1)
c = node('c', 1)
d = node('d', 0)
q1 = node('*', 1, c, d)
q2 = node('-', 2, b, q1)
root = node('+', 0, a, q2)
gen_code(root)
Reg_Stack=['R5','R4','R3','R2','R1','R0']
温度堆栈=['T5','T4','T3','T2','T1','T0']
运算符_优先级={'(':0')':0'+':1'-':1'*':2'/':2}
def gen_代码(n):
如果(n.left==无,n.right==无):
打印(“MOV”+n.value+,“+Reg_堆栈[-1])
其他:
如果(n.right.label==0):
发电机代码(n.左)
打印(运算符(n.value)+“+n.right.value+”,“+Reg_堆栈[-1])
elif((n.left.label
我发现了错误-
C:\Python33>python main.py
Traceback (most recent call last):
File "main.py", line 67, in <module>
gen_code(root)
File "main.py", line 15, in gen_code
gen_code(n.left)
File "main.py", line 7, in gen_code
print("MOV " + n.value + "," + Reg_Stack[-1])
TypeError: Can't convert 'node' object to str implicitly
C:\Python33>python main.py
回溯(最近一次呼叫最后一次):
文件“main.py”,第67行,在
根代码(根代码)
gen_代码中第15行的文件“main.py”
发电机代码(n.左)
gen_代码中第7行的文件“main.py”
打印(“MOV”+n.value+,“+Reg_堆栈[-1])
TypeError:无法将“节点”对象隐式转换为str
gen\u code()
函数的输入是一个带标签的树。我试过使用不同的树,代码很有效。但只有在这种情况下,我得到了上述错误。我做错了什么?问题主要是由于您的swap()
函数引起的-
def swap():
a1 = Reg_Stack.pop()
b1 = Temp_Stack.pop()
Reg_Stack.append(b)
Temp_Stack.append(a)
您正在从Reg\u堆栈
和Temp\u堆栈
中删除字符串
,然后将节点
附加到它。所以在这之后当你-
Reg_Stack[-1]
您将从swap()
函数中获取追加的节点对象。这会导致您在尝试将其添加(连接)到str时看到的错误
您应该添加节点的值,而不是节点本身。示例-
def swap():
a1 = Reg_Stack.pop()
b1 = Temp_Stack.pop()
Reg_Stack.append(b.value)
Temp_Stack.append(a.value)
在这个改变之后,我得到的结果是-
MOV a,b
MOV a,R1
ADD a,R1
但不确定其他逻辑是否正确