2012-11-13 4 views
2

비슷한 질문을 살펴 보았지만 여전히 동일한 문제가 발생하고 있습니다. 이 프로그래밍 할당을 위해 Clite 어휘집의 작은 하위 집합에 대한 간단한 어휘 분석 버전을 작성합니다. 입력 파일에서 토큰을 추출하여 분석 결과를 출력합니다. 사전을 사용하여 발견 된 식별자에 대한 심볼 테이블을 생성합니다. 다른 행에서 동일한 식별자를 찾으면 심볼 테이블에 발견 된 행을 추가해야합니다. 예를 들어, 2 행에서 7 행으로 식별자 "number18"을 찾습니다. 따라서 기호 테이블은 {number18 : 2}에서 {number18 : 2,7}로 이동해야합니다.Python 오류 : AttributeError : 'int'객체에 'append'속성이 없습니다.

문제는 다음과 같습니다. 현재의 사전 항목에 새 행 번호를 추가하십시오. 내가 질문 제목에 게시 할 때 오류가 발생합니다. 여기 내 코드는

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

향후 예외의 * 전체 * 추적을 포함시켜 문제의 원인이 무엇인지 추측 할 필요가 없습니다. –

+0

아마도 'defaultdict'를 사용해야 할 것입니다. –

답변

12

당신은 먼저 int로 당신의 dict 값을 설정 지금까지의 :

stable[x1]=y 

하지만 당신은 나중에에 그것이 list 인 것처럼 취급하려고 :

stable[x1].append(y) 

첫 번째 int이 포함 된 list으로 시작 :

stable[x1]=[y] 

.append()이 작동합니다.

stable = defaultdict(list) 

다음 키가 이미있는 경우 테스트 할 필요없이 마음대로 추가 :

또는, defaultdict를 사용할 수 위의 다른 부분에서

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을 사용하면 오류가 발생합니다. 당신이 당신의 DICT

else: 
     stable[x1]=[y] 

음에 값을 처음 추가 할 때

오히려 당신은 이미 defaultdict를 사용하는 것이 더 나은 선택이 될 것이라고 마티의 대답 @알고, 목록 [y]에 정수 y 포장 여기서는 containmentkey인지 확인할 필요가 없습니다. 아직도 당신이 딕셔너리의 키를 확인하는 방법에 관한

하지만, : -

if x1 in stable.keys(): 

keys 체크인 것이다, 단지 stable를 사용 stable.keys()을 사용하는 당신은 필요가 없습니다.

if x1 in stable: 
+0

고마워요! 빠른 응답 덕분에 효과적이었습니다. – user1821451

관련 문제