-
Notifications
You must be signed in to change notification settings - Fork 0
/
reconhece_automato_finito.py
136 lines (110 loc) · 4.4 KB
/
reconhece_automato_finito.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#**************************************************************************
# *
# Leonardo Ribeiro *
# *
#**************************************************************************
import sys
# Função recursiva que percorre a cadeia de símbolos
# até chegar a um estado finaldo autômato, se não chegar
# a nenhum estado final, retorna False.
def validaCadeiaSimbolos(cadeia,estado):
global conj_estados_aceitacao,conj_transicoes
# No final da cadeia de símbolos analisada, verifica
# se o último estado encontrado está entre os estados
# de aceitação. Se sim retorna True
if(cadeia == ''):
for estado_aceitacao in conj_estados_aceitacao:
if(estado_aceitacao == estado):
return True
return False
simbolo = cadeia[0]
for transicao in conj_transicoes:
if((transicao[0] == estado) and (transicao[1] == simbolo)):
return validaCadeiaSimbolos(cadeia[1:],transicao[2])
return False
# Função que verifica uma cadeia, testando ela através
# de todos os estados iniciais do autômato
def testaCadeia(cadeia):
global num_estados_iniciais
# Testa a cadeia para todos os estados iniciais
for i in range(0,num_estados_iniciais):
if(validaCadeiaSimbolos(cadeia,i)):
return True
# Se através de todos os estados iniciais
# a cadeia não for reconhecida, retorna False
return False
# Programa principal
if __name__ == "__main__":
if len(sys.argv) != 3:
print "Número de argumentos inválido, tente novamente."
print "Você deve passar o arquivo de entrada e de saída por parâmetros:"
print "python trablfa.py arquivoentrada.txt arquivosaida.txt"
sys.exit(0)
print "Seja bem vindo ao simulador de automatos 1.0 :)"
# Recebe o nome do arquivo que será lido via parâmetro
arquivo = sys.argv[1];
# Tenta abrir o arquivo
try:
arquivo = file(arquivo,"r");
except(IOError), ex:
print "Erro do tipo: ", ex
sys.exit(0)
# Recebe o nome do arquivo que será escrito via parâmetro
arquivo_saida = sys.argv[2];
# Tenta criar o arquivo
try:
arquivo_saida = file(arquivo_saida,"w");
except(IOError), ex:
print "Erro do tipo: ", ex
sys.exit(0)
# Número de estados do autômato
num_estados = arquivo.readline()
# Conjunto de símbolos terminais
conj_simb_terminais = arquivo.readline()
# Cria uma lista de símbolos terminais
conj_simb_terminais = conj_simb_terminais.split()
qtd_simb_terminais = int(conj_simb_terminais[0])
del conj_simb_terminais[0]
# Número de estados iniciais do autômato
num_estados_iniciais = int(arquivo.readline())
# Conjunto de estados de aceitação
conj_estados_aceitacao = arquivo.readline()
# Cria uma lista de estados de aceitação
conj_estados_aceitacao = conj_estados_aceitacao.split()
qtd_estados_aceitacao = int(conj_estados_aceitacao[0])
del conj_estados_aceitacao[0]
#convertendo valores da lista para inteiro
conj_estados_aceitacao = map(int, conj_estados_aceitacao)
# Número de transições
num_transicoes = int(arquivo.readline())
conj_transicoes = []
# Laço para tratamento das transições
for i in range(0,num_transicoes):
transicao = arquivo.readline()
# Cria uma lista onde:
# - o primeiro valor é o estado de origem
# - o segundo valor é o símbolo
# - o terceiro valor é o estado de destino
transicao = transicao.split()
# convertendo os estados para inteiros,
# provavelmente não é uma forma pythonica
transicao[0] = int(transicao[0])
transicao[2] = int(transicao[2])
# Armazena a transição dentro da lista conj_transicoes
conj_transicoes.append(transicao)
# Número de cadeias de entrada
num_cadeias_entradas = int(arquivo.readline())
# Laço para tratamento de cadeias de entrada
for i in range(0,num_cadeias_entradas):
cadeia_atual = arquivo.readline().strip()
if(testaCadeia(cadeia_atual)):
print cadeia_atual+" - Aceita"
arquivo_saida.write("Aceita\n")
else:
print cadeia_atual+" - Rejeita"
arquivo_saida.write("Rejeita\n")
# Libera o arquivo lido
arquivo.close()
arquivo_saida.close()