0

述べたように、これは単純な間違いであると確信していますが、明示的に文字列 'F1' に設定されている場合、変数 newState が次の else 条件をトリガーしない理由を理解するのに苦労しています: if newState == 'F1'...

それほど多くのコードを移植する必要はなかったと思います。申し訳ありません。

 (EOL, LETTER, DIGIT, PERIOD, ILLEGAL_CHAR, LEGAL_CHAR) = range(0, 6)


STT = [ ['error', 1, 2, 0, 'error', 0], ['F1', 1, 1, 'F1', 'error', 'F1' ], 
['F2', 'F2', 2, 3, 'error', 'F2'], ['error', 'error', 4, 'error', 'error', 'error'],
['F3', 'F3', 4, 'F3', 'error', 'F3']  ]

for line in open("Sample.txt","r"):
    x1 = ''
    currState = 0
    newState = 'F1'
    for char in line:
        if newState != 'F1' or newState != 'F2' or newState != 'F3' or newState != 'error':
            currState = newState
            #If eol
            if char == '\n':
                response = EOL
                newState = STT[currState][response]
                break
            #if letter
            elif char.isalpha():
                x1 = x1 + char
                response = LETTER
                newState = STT[currState][response]
               # break
            #if Digit
            elif char.isdigit():
                x1 = x1 + char
                response = DIGIT
                newState = STT[currState][response]
            #if Period
            elif char == '.':
                x1 = x1 + char
                response = PERIOD
                newState = STT[currState][response]                       
            #If illegal char set
            elif (char == '~' or char == '?' or char == ':' or char == '_' or char == '\\' ):
                response = ILLEGAL_CHAR
                newState = STT[currState][response]
                break
                                           # elif x1 != '':  
                                                #response = 5
                                               # newState = STT[currState][response]
                                               # break
            #if any other legal char
            else:
                response = LEGAL_CHAR
                newState = STT[currState][response]        
        #We have a token
        else:
            getToken(newState, x1)
4

1 に答える 1

3

newstateF1 の場合は、else がトリガーされるため、else はトリガーされませんnewState != 'F2'

最初のifでは、作ってみてください

if (not(newState == 'F1' or newState == 'F2' or newState == 'F3' or newState == 'error')):

問題は

if !A or !B or ...

と同じではありません

if !(A or B or...)

に等しい

if (!A and !B and ...)

ドモルガンの法則による。

于 2013-11-04T02:12:22.940 に答える