Validador_JSON / app.py
thallyscostalat's picture
Update app.py
b7791d5 verified
import streamlit as st
class Estado:
def __init__(self, nome):
self.nome = nome
self.transicoes = {}
def adicionar_transicao(self, simbolo, proximo_estado, empilhar=None, desempilhar=None):
self.transicoes[simbolo] = (proximo_estado, empilhar, desempilhar)
class AutomatoPilha:
def __init__(self):
self.estados = {}
self.estado_atual = None
self.pilha = []
def adicionar_estado(self, estado):
self.estados[estado.nome] = estado
def definir_estado_inicial(self, estado_inicial):
self.estado_atual = estado_inicial
def processar_entrada(self, entrada):
self.pilha = ['$']
print(f"Pilha inicial: {self.pilha}")
for simbolo in entrada:
if simbolo in self.estado_atual.transicoes:
proximo_estado, empilhar, desempilhar = self.estado_atual.transicoes[simbolo]
if desempilhar:
if self.pilha[-1] == desempilhar:
self.pilha.pop()
else:
print("Erro: Desempilhamento inválido")
return False
if empilhar:
self.pilha.append(empilhar)
self.estado_atual = self.estados[proximo_estado]
print(f"Símbolo: {simbolo}, Estado: {self.estado_atual.nome}, Pilha: {self.pilha}")
elif self.estado_atual.nome == 'q2' and simbolo != '"': # Qualquer char em q2
self.estado_atual = self.estados['q2']
print(f"Símbolo: {simbolo}, Estado: {self.estado_atual.nome}, Pilha: {self.pilha}")
elif self.estado_atual.nome == 'q3' and ('0' <= simbolo <= '9' or simbolo == '-' or simbolo == ' ' or simbolo == 'e' or simbolo == 'E'):
self.estado_atual = self.estados['q3']
print(f"Símbolo: {simbolo}, Estado: {self.estado_atual.nome}, Pilha: {self.pilha}")
elif self.estado_atual.nome == 'q1' and simbolo == ' ': # Ignora espaços em q1
print(f"Símbolo: {simbolo}, Estado: {self.estado_atual.nome}, Pilha: {self.pilha}")
elif self.estado_atual.nome == 'q3' and simbolo == '[': # novo array
self.estado_atual = self.estados['q1']
self.pilha.append('[')
print(f"Símbolo: {simbolo}, Estado: {self.estado_atual.nome}, Pilha: {self.pilha}")
elif self.estado_atual.nome == 'q1' and simbolo == ']': # fecha array
self.estado_atual = self.estados['q3']
if(self.pilha[-1] == "["):
self.pilha.pop()
print(f"Símbolo: {simbolo}, Estado: {self.estado_atual.nome}, Pilha: {self.pilha}")
elif self.estado_atual.nome == 'q3' and simbolo == ',':
self.estado_atual = self.estados['q1']
print(f"Símbolo: {simbolo}, Estado: {self.estado_atual.nome}, Pilha: {self.pilha}")
elif self.estado_atual.nome == "q1" and ('0' <= simbolo <= '9' or simbolo == '-' or simbolo == '.' or simbolo == 'e' or simbolo == 'E'):
self.estado_atual = self.estados["q3"]
print(f"Símbolo: {simbolo}, Estado: {self.estado_atual.nome}, Pilha: {self.pilha}")
elif self.estado_atual.nome == "q1" and simbolo == "[":
self.estado_atual = self.estados["q1"]
self.pilha.append("[")
print(f"Símbolo: {simbolo}, Estado: {self.estado_atual.nome}, Pilha: {self.pilha}")
elif self.estado_atual.nome == "q1" and simbolo == "{":
self.estado_atual = self.estados["q1"]
self.pilha.append("{")
print(f"Símbolo: {simbolo}, Estado: {self.estado_atual.nome}, Pilha: {self.pilha}")
elif self.estado_atual.nome == "q1" and simbolo == "}":
self.estado_atual = self.estados["q3"]
if(self.pilha[-1] == "{"):
self.pilha.pop()
print(f"Símbolo: {simbolo}, Estado: {self.estado_atual.nome}, Pilha: {self.pilha}")
elif self.estado_atual.nome == "q5" and simbolo == ",":
self.estado_atual = self.estados["q1"]
print(f"Símbolo: {simbolo}, Estado: {self.estado_atual.nome}, Pilha: {self.pilha}")
elif self.estado_atual.nome == "q5" and simbolo == "]":
self.estado_atual = self.estados["q3"]
if(self.pilha[-1] == "["):
self.pilha.pop()
print(f"Símbolo: {simbolo}, Estado: {self.estado_atual.nome}, Pilha: {self.pilha}")
elif self.estado_atual.nome == "q1" and simbolo == ",":
self.estado_atual = self.estados["q5"]
print(f"Símbolo: {simbolo}, Estado: {self.estado_atual.nome}, Pilha: {self.pilha}")
elif self.estado_atual.nome == "q4" and simbolo == ']': # fecha array em q4
self.estado_atual = self.estados['q3']
if(self.pilha[-1] == "["):
self.pilha.pop()
print(f"Símbolo: {simbolo}, Estado: {self.estado_atual.nome}, Pilha: {self.pilha}")
elif self.estado_atual.nome == 'q4' and simbolo == '}': # Nova transição adicionada!
self.estado_atual = self.estados['q4'] # Permanece em q4 (ou pode ir para outro estado final)
if self.pilha[-1] == '{':
self.pilha.pop()
print(f"Símbolo: {simbolo}, Estado: {self.estado_atual.nome}, Pilha: {self.pilha}")
else:
print(f"Erro: Transição inválida para o símbolo '{simbolo}' no estado '{self.estado_atual.nome}'")
return False
if self.estado_atual.nome == 'q4' and self.pilha == ['$']:
return True
else:
return False
q0 = Estado('q0')
q1 = Estado('q1')
q2 = Estado('q2')
q3 = Estado('q3')
q4 = Estado('q4')
q5 = Estado('q5')
q0.adicionar_transicao('{', 'q1', empilhar='{')
q1.adicionar_transicao('"', 'q2', empilhar='"')
q2.adicionar_transicao('"', 'q3', desempilhar='"')
q3.adicionar_transicao(':', 'q3')
q3.adicionar_transicao('{', 'q1', empilhar='{')
q3.adicionar_transicao('"', 'q2', empilhar='"')
q3.adicionar_transicao('}', 'q4', desempilhar='{')
q3.adicionar_transicao(']', 'q4', desempilhar='[') # Transição adicionada na resposta anterior (CORRETA)
q3.adicionar_transicao(',', 'q1')
q1.adicionar_transicao(']', 'q3', desempilhar='[')
q3.adicionar_transicao('[', 'q1', empilhar='[')
q1.adicionar_transicao(',', 'q5')
q5.adicionar_transicao(',', 'q1')
q5.adicionar_transicao(']', 'q3', desempilhar='[')
q4.adicionar_transicao(']', 'q3', desempilhar='[')
q4.adicionar_transicao('}', 'q4', desempilhar='{') # Nova transição adicionada agora!
json_input = st.text_input('Insira seu JSON:')
if st.button("Send"):
automato = AutomatoPilha()
automato = AutomatoPilha()
automato.adicionar_estado(q0)
automato.adicionar_estado(q1)
automato.adicionar_estado(q2)
automato.adicionar_estado(q3)
automato.adicionar_estado(q4)
automato.adicionar_estado(q5)
automato.definir_estado_inicial(q0)
if automato.processar_entrada(json_input):
st.write("JSON válido!")
else:
st.write("JSON inválido!")