2012-11-13 39 views
2

所以我查看了類似的問題,我仍然遇到同樣的問題,無法弄清楚。對於此編程任務,我正在爲Clite詞典的一小部分創建詞法分析的簡化版本。我從輸入文件中提取令牌,輸出我的分析結果。我正在爲使用字典創建的標識符創建一個符號表。當我在不同的行上找到相同的標識符時,我需要在符號表中追加找到的行。例如,我在第2行找到標識符「number18」,並再次在第7行。所以符號表需要從{number18:2}到{number18:2,7}Python錯誤:AttributeError:'int'對象沒有屬性'追加'

問題出現在我嘗試追加新的行號到當前字典條目。我在問題標題中發佈錯誤。這裏是我的代碼迄今

y = 0 
s2 =() 
stable = dict() 

for line in open("Sample.txt","r"): 
    x1 = '' 
    for char in line: 
    if char.isalpha(): 
     x1 = x1 + char 
    elif char.isdigit(): 
     x1 = x1 + char 
    elif char == '.': 
     x1 = x1 + char 
    elif x1 != '': 
     break 

    #print (x1)  
    if (x1 == "for" or x1 == "bool" or x1 == "char" or x1 == "else" or x1 == "false" or x1 == "float" or x1 == "if" or x1 == "int" or x1 == "main" or x1 == "true" or x1 == "while"): 
     s2=(y,"Keyword",x1) 
    elif x1.isidentifier(): 
     s2=(y,"Identifier",x1) 
    if x1 in stable.keys(): 
     stable[x1].append(y) 
    else: 
     stable[x1]=y 


    elif x1.isdigit(): 
     s2=(y,"Int",x1) 
    else: 
     s2=(y,"Float",x1) 
    print (s2) 
    y=y+1 

print (stable) 
+2

未來,請包括您得到的異常的* full *追蹤,所以我們不必猜測哪條線路導致您的問題。 –

+0

可能你需要在這裏使用'defaultdict'。 –

回答

12

你先設置你的dict值是一個int

stable[x1]=y 

但你以後你嘗試把它當作如果它是一個list

stable[x1].append(y) 

從包含您的第一個intlist開始,而不是:

stable[x1]=[y] 

.append()將工作。

或者,你可以使用一個defaultdict

stable = defaultdict(list) 

,然後隨意添加,無需測試,如果關鍵是已經存在:

stable[x1].append(y) # No need to do `if x1 in stable`. 
+0

非常感謝你,這個伎倆!感謝您的快速響應。 – user1821451

4
elif x1.isidentifier(): 
    s2=(y,"Identifier",x1) 
    if x1 in stable.keys(): 
     stable[x1].append(y) 
    else: 
     stable[x1]=y 

在你的其他部分上方,您第一次加入integer。所以當你下次使用append時,你會得到這個錯誤。

而是包住整y在列表[y],當你自己的價值第一次添加到您的字典

else: 
     stable[x1]=[y] 

好,我們已經從知道@馬亭的回答,使用一個defaultdict將是更好的選擇在這裏,因爲您不需要檢查keycontainment

但是,仍然與你檢查在字典中鍵的方式: -

if x1 in stable.keys(): 

你並不需要使用stable.keys(),只需使用stable,將在僅keys檢查。

if x1 in stable: 
+0

非常感謝!這工作,感謝您的快速回應 – user1821451

相關問題