-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgramatica2.py
267 lines (257 loc) · 13.1 KB
/
gramatica2.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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
from gramatica import lista2
import os
NT=[]
nombre=""
Terminales=[]
inicialNT=[]
Producciones=[]
original=[]
banderaestado=False
banderamenu=False
auxiliar1=''
banderatransi=False
estadoA=[]
estadoB=[]
NOT=[]
cadenasvali=[]
cadenasinva=[]
ruta=[]
expandir=[]
inicio=''
evalcadenas=[]
def pedirnombre(nombr):
global NT,Terminales,inicialNT,Producciones,lista2,evalcadenas,NOT,estadoA,estadoB,nombre
nombre=nombr
if nombre !="" or nombre!="\t" :
guardar=nombre,NT,Terminales,inicialNT,Producciones,original
lista2.append(guardar)
guardar2=nombre,estadoA,NOT,estadoB,cadenasvali,cadenasinva,ruta,expandir
evalcadenas.append(guardar2)
dfagraph="digraph \""+nombre+"\" {\n"
dfagraph+="rankdir=LR;\nsize=\"42,42\" EMPTY [style=invis] EMPTY [shape=point] node [shape = doublecircle];\n"
#menuAFD()
#imprimir()
def estados(NT):
global nombre,lista2,banderaestado
estado=NT
banderaestado=True
bandera = False
if estado=="" or estado=="\t":
os.system("cls")
estados()
else:
for busca in lista2:
if busca[0] == nombre:
x=0
if not busca[1]:#verificamos si lista de estados esta vacia
busca[1].append(estado)
elif busca[1]:# de caso contrario no esta vacia
while x < int(len(busca[1])) and bandera ==False:# verificamos el tamaño de la lista estado
if busca[1][x] == estado:# verificamos si existe un estado repetido
print("este No Terminal ya existe")
bandera = True
x+=1
if bandera== False:#guardamos el estado si no se encuentra repetido
busca[1].append(estado)
def alfabetos(terminales):
global nombre,lista2
bandera1=False
bandera2=False
alfabeto=terminales
if alfabeto=="" or alfabeto=="\t":
os.system("cls")
alfabeto()
else:
for busca in lista2:
if busca[0]==nombre:
if not busca[2]: #lista de la columna 2 esta vacia
x=0
while x < int(len(busca[1])) and bandera1==False :
if busca[1][x]==alfabeto:
print("EL terminal "+alfabeto+" debe de ser diferente a los NO TERMINALES")
bandera1=True
x+=1
if bandera1== False:
busca[2].append(alfabeto)
elif busca[2]:
if bool(alfabeto in busca[2])==False:
y=0
while y<int(len(busca[1])) and bandera2==False:
if busca[1][y]==alfabeto:
bandera2=True
y+=1
if bandera2== False:
busca[2].append(alfabeto)
elif bandera2==True:
print("EL terminal "+alfabeto+" debe de ser diferente a los NO TERMINALES")
elif bool(alfabeto in busca[2])==True:
print("El terminal "+alfabeto+" ya existe en la Base de datos")
def inicialstate(inicial):
global lista2,nombre,auxiliar1
bandera =False
iniciales = inicial
if iniciales =="" or iniciales=="\t":
os.system("cls")
inicialstate()
else:
for buscar in lista2:
if buscar[0]==nombre:
if not buscar[3]:# verifica si esta vacia regresara un true o false
x=0
while x <int(len(buscar[1])) and bandera == False:
if buscar[1][x] == iniciales:
bandera = True
x+=1
if bandera == True:
buscar[3].append(iniciales)
if bandera == False:
print(iniciales+" no existe en los estados")
elif buscar[3]:
y=0
while y <int(len(buscar[1])) and bandera == False:
if buscar[1][y] == iniciales:
bandera = True
y+=1
if bandera == True and banderatransi==False:
#buscar[3].insert(0,iniciales)
buscar[3][0]=str(iniciales)
elif bandera == True and banderatransi==True: # aqui tenco que rebobinar para graphiz
auxiliar1='node [shape = circle];\n'
buscar[3][0]=str(iniciales)
auxiliar1+='EMPTY -> '+buscar[3][0]+' [ label = "" ];\n'
elif bandera == False:
print(iniciales+" no existe en los estados")
def producciones(prodi,obten):
global lista2,evalcadenas,nombre
separa=[]
verifica1=''
verifica2=''
verifica3=''
recur=''
banderafinal = False
banderaguardar = False
prod=prodi
nueva=prod.replace(" ", "")
print(nueva)
if prod=="" or prod=="\t":
os.system("cls")
producciones()
else:
dat=" "
if bool(dat in prod)==True:
for busca in lista2:
busca[5].append(obten)
if busca[0]== nombre:
#busca[5].append(prod)
for val in evalcadenas:
if val[0]==nombre:
dato=nueva.split(">")
#if not busca[4]:
if bool(dato[0] in busca[1])==True:
dato2=dato[1].split("|")
for i in range(len(dato2)):
for letra in dato2[i]:
if bool(letra in busca[1])==True:
verifica1=letra
elif bool(letra in busca[2])==True:
verifica2=letra
else:
verifica3+=letra
banderafinal=True
if verifica3=="epsilon" and banderafinal == True:
recur=dato[0]+' > '+verifica3+''
banderaguardar=True
elif verifica3 !="epsilon" and banderafinal==True:
verifica3=""
banderafinal=False
else:
recur=dato[0]+' > '+verifica2+''+verifica1
if not busca[4]:
if verifica3=="epsilon" and banderaguardar==True:
busca[4].append(recur)
val[1].append(dato[0])
val[2].append(verifica3)
val[3].append('')
banderafinal=False
banderafinal=False
#verifica3=""
else:
busca[4].append(recur)
val[1].append(dato[0])
val[2].append(verifica2)
val[3].append(verifica1)
verifica3=""
elif busca[4]:
if bool(recur in busca[4])==False:
if verifica3=="epsilon" and banderaguardar==True:
busca[4].append(recur)
val[1].append(dato[0])
val[2].append(verifica3)
val[3].append('')
banderaguardar=False
banderafinal=False
verifica3=""
else:
busca[4].append(recur)
val[1].append(dato[0])
val[2].append(verifica2)
val[3].append(verifica1)
verifica3=""
elif bool(dato[0] in busca[1])==False:
print("Error NT o el terminal no existe")
else:
for busca in lista2:
busca[5].append(prod)
if busca[0]== nombre:
#busca[5].append(prod)
for val in evalcadenas:
if val[0]==nombre:
dato=nueva.split(">")
#if not busca[4]:
if bool(dato[0] in busca[1])==True:
dato2=dato[1].split("|")
for i in range(len(dato2)):
for letra in dato2[i]:
if bool(letra in busca[1])==True:
verifica1=letra
elif bool(letra in busca[2])==True:
verifica2=letra
else:
verifica3+=letra
banderafinal=True
if verifica3=="epsilon" and banderafinal == True:
recur=dato[0]+' > '+verifica3+''
banderaguardar=True
elif verifica3 !="epsilon" and banderafinal==True:
verifica3=""
banderafinal=False
else:
recur=dato[0]+' > '+verifica2+''+verifica1
if not busca[4]:
if verifica3=="epsilon" and banderaguardar==True:
busca[4].append(recur)
val[1].append(dato[0])
val[2].append(verifica3)
val[3].append('')
#verifica3=""
else:
busca[4].append(recur)
val[1].append(dato[0])
val[2].append(verifica2)
val[3].append(verifica1)
verifica3=""
elif busca[4]:
if bool(recur in busca[4])==False:
if verifica3=="epsilon" and banderaguardar==True:
busca[4].append(recur)
val[1].append(dato[0])
val[2].append(verifica3)
val[3].append('')
banderaguardar==False
verifica3=""
else:
busca[4].append(recur)
val[1].append(dato[0])
val[2].append(verifica2)
val[3].append(verifica1)
verifica3=""