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
但不确定其他逻辑是否正确