2016-05-03 3 views
2

Я создаю программу python для конечного автомата без объектно-ориентированного программирования. Однако моя фаза обработки отключена. Кажется, что он не работает через созданный мной цикл triple for, который я проверил, пытаясь распечатать 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

Я не знаю. Я просто получил его, чтобы бежать. Вам придется отлаживать это отсюда. –

Смежные вопросы