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!")