4

それで、私は同様の質問を調べました、そして、私はまだ同じ問題を抱えていて、それを理解することができません。このプログラミングの割り当てでは、Cliteレキシコンの小さなサブセットの字句解析の簡略化されたバージョンを作成しています。入力ファイルからトークンを抽出し、分析結果を出力しています。辞書を使用して見つかった識別子のシンボルテーブルを作成しています。異なる行で同じ識別子を見つけた場合、それが見つかった行をシンボルテーブルに追加する必要があります。たとえば、2行目と7行目で識別子「number18」を見つけました。したがって、シンボルテーブルは{number18:2}から{number18:2,7}に移動する必要があります。

新しい行番号を現在の辞書エントリに追加しようとすると、問題が発生します。質問のタイトルに投稿したときにエラーが発生します。これがこれまでの私のコードです

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)
4

2 に答える 2

17

最初にdict値を次のように設定しintます。

    stable[x1]=y

しかし、後でそれをlist:

    stable[x1].append(y)

代わりにlist最初のものを含むa から始めます。int

    stable[x1]=[y]

そして.append()意志は働きます。

または、次を使用できますdefaultdict

stable = defaultdict(list)

次に、キーが既に存在するかどうかをテストする必要なく、自由に追加します。

    stable[x1].append(y)  # No need to do `if x1 in stable`.
于 2012-11-13T16:55:58.337 に答える
6
elif x1.isidentifier():
    s2=(y,"Identifier",x1)
    if x1 in stable.keys():
        stable[x1].append(y)
    else:
        stable[x1]=y

上記のelse部分では、integer初めて追加しています。appendそのため、次回使用すると、そのエラーが発生します。

辞書に初めて値を追加するときは、整数yを listでラップするのではなく[y]

    else:
        stable[x1]=[y]

まあ、@Martijnの答えから、ここではa を使用するdefaultdict方が良いオプションになることはすでにわかっています.ofをチェックする必要はありませcontainmentkey

しかし、それでもdictでキーをチェックする方法に関連しています:-

if x1 in stable.keys():

チェックインのみを行う をstable.keys()使用するだけで、を使用する必要はありません。stablekeys

if x1 in stable:
于 2012-11-13T16:56:03.533 に答える