2016-05-03 11 views
2

私はオブジェクト指向ではない有限状態機械のためのPythonプログラムを作成しています。しかし、私の処理段階はオフです。それは私が作成したトリプルループを実行しているようにも見えない、私はCurrentStateを印刷しようとしてチェックした。どんな助けもありがとう。ここでPython有限状態マシンの問題(処理をスキップしますか?)

import sys 

try: 
    Sfile = open("states.txt","r") 
except IOError: 
    print "Could not open file", states.txt 
    os.kill() 
States = [] 

ReadLine = Sfile.readline() 
while ReadLine != "": 
    SN, SS, AS = ReadLine.split(",") 
    States.append((SN, bool(int(SS)), bool(int(AS)))) 
    ReadLine = Sfile.readline() 

print States, "\n" 
Sfile.close() 


try: 
    Tfile = open("transistions.txt","r") 
except IOError: 
    print "Could not open file", transitions.txt 
    os.kill() 
Transitions = [] 


ReadLine = Tfile.readline() 
while ReadLine != "": 
    ReadLine = ReadLine.rstrip() 
    CS, IN, NS = ReadLine.split(",") 
    Transitions.append((CS, IN, NS)) 
    ReadLine = Tfile.readline() 

print Transitions 
Tfile.close() 

try: 
    Strfile = open("strings2.txt","r") 
except IOError: 
    print "Could not open file", strings2.txt 
    os.kill() 
Strings = [] 

ReadLine = Strfile.readline() 
while ReadLine != "": 
    Readline = ReadLine.rstrip() 
    Strings.append(Readline) 
    ReadLine = Strfile.readline() 

print Strings, '\n' 
Strfile.close() 

CurrentState = '' 
Start = '' 
RejectState= '' 
AcceptState= '' 

for S in Strings: 
    if S != '': 
      for C in S: 
       for (CS, IN, NS) in Transitions:     
        if CS == CurrentState and IN == C: 
          CurrentState =NS 
          break 
       for (SN, SS, AS) in States: 
        if SN == CurrentState and SS ==C: 
         CurrentState = NS 


    if NS == AS: 
      NS = AcceptState 
      print "String", AcceptState, "is accepted" 
      break 
    else: 
      NS = RejectState 
      print "String", RejectState, "is rejected" 
      break 

私の別のテキストファイルは、以下のとおりです。 strings2.txt

01010 
1001 
010 

transitions.txt

Start,0,State1 
State1,1,State2 
State2,0,State3 

states.txt

State1,1,0 
State2,0,1 
State3,1,0 
+0

あなたのファイル名、「transistions.txt」はスペルミスれます。 –

+0

また、 'os.kill()'は良くありません。 'sys.exit'を試してみてください。 –

+0

それは、一定量のクリーンアップの後、私はあなたが望んだと思う出力を得たと言った。すべての文字列を処理したいので、ファイルの終わり近くで 'break'ステートメントを削除する必要があります。 –

答えて

0

私はあなたのコードをコピーして、データ、そして、python2.7を使用した作業(少しあなたから変更された)このコードを取得することができました。ここで

import sys 
import os 

try: 
    Sfile = open("states.txt","r") 
except IOError: 
    print "Could not open file", "states.txt" 
    sys.exit() 
States = [] 

ReadLine = Sfile.readline() 
while ReadLine != "": 
    SN, SS, AS = ReadLine.split(",") 
    States.append((SN, bool(int(SS)), bool(int(AS)))) 
    ReadLine = Sfile.readline() 

print "States:\n", States, "\n" 
Sfile.close() 


try: 
    Tfile = open("transitions.txt","r") 
except IOError: 
    print "Could not open file", "transitions.txt" 
    sys.exit() 
Transitions = [] 


ReadLine = Tfile.readline() 
while ReadLine != "": 
    ReadLine = ReadLine.rstrip() 
    CS, IN, NS = ReadLine.split(",") 
    Transitions.append((CS, IN, NS)) 
    ReadLine = Tfile.readline() 

print "Transitions:\n", Transitions, "\n" 
Tfile.close() 

try: 
    Strfile = open("strings2.txt","r") 
except IOError: 
    print "Could not open file", strings2.txt 
    sys.exit() 
Strings = [] 

ReadLine = Strfile.readline() 
while ReadLine != "": 
    Readline = ReadLine.rstrip() 
    Strings.append(Readline) 
    ReadLine = Strfile.readline() 

print "Strings:\n", '\n'.join(Strings), '\n' 
Strfile.close() 

CurrentState = '' 
Start = '' 
RejectState= '' 
AcceptState= '' 

for S in Strings: 
    if S != '': 
      print "String:", S 
      for C in S: 
       print "Char:", C 
       for (CS, IN, NS) in Transitions: 
        if CS == CurrentState and IN == C: 
          CurrentState =NS 
          break 
       for (SN, SS, AS) in States: 
        if SN == CurrentState and SS ==C: 
         CurrentState = NS 


    if NS == AS: 
      NS = AcceptState 
      print "String", AcceptState, "is accepted" 
    else: 
      NS = RejectState 
      print "String", RejectState, "is rejected" 

は、私が得た出力は次のようになります。

$ python2.7 test.py 
States: 
[('State1', True, False), ('State2', False, True), ('State3', True, False)] 

Transitions: 
[('Start', '0', 'State1'), ('State1', '1', 'State2'), ('State2', '0', 'State3')] 

Strings: 
01010 
1001 
010 

String: 01010 
Char: 0 
Char: 1 
Char: 0 
Char: 1 
Char: 0 
String is rejected 
String: 1001 
Char: 1 
Char: 0 
Char: 0 
Char: 1 
String is rejected 
String: 010 
Char: 0 
Char: 1 
Char: 0 
String is rejected 
+0

ありがとうございました!しかし、私は混乱しています。それは最初と最後の文字列を受け入れるべきか? AcceptStateは "010" –

+0

私は分かりません。私はちょうどそれを走らせた。ここからデバッグする必要があります。 –

関連する問題