Last active
November 25, 2023 02:55
-
-
Save mikebsg01/4e20817074291c7e1ee669c654e6c60a to your computer and use it in GitHub Desktop.
First Automaton in Python - Deterministic Finite Automaton (DFA)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
mergeDict = lambda a, b: {**a, **b} | |
listaDeLetras = [chr(x) for x in range(97, 123)] | |
listaDeNumeros = [str(x) for x in range(0, 10)] | |
listaDeOperadores = ['=', '+', '-', '*', '/'] | |
listaDeSeparadores = [';'] | |
evalLetraDeclaracion = {x: 'Declaracion' for x in listaDeLetras} | |
evalNumeroDeclaracion = {n: 'Declaracion' for n in listaDeNumeros} | |
evalNumero = {n: 'Numero' for n in listaDeNumeros} | |
evalAsignacion = {'=': 'Asignacion'} | |
evalLetraDeVariableDefinida = {x: 'VariableDefinida' for x in listaDeLetras} | |
evalNumeroDeVariableDefinida = {n: 'VariableDefinida' for n in listaDeNumeros} | |
evalOperadorAritmetico = {'+': 'Asignacion', '-': 'Asignacion', '*': 'Asignacion', '/': 'Asignacion'} | |
evalOperador = {x: 'Asignacion' for x in listaDeOperadores} | |
evalFin = {x : 'Fin' for x in listaDeSeparadores} | |
class FunctionLanguageAutomaton: | |
def __init__(self): | |
self.states = {'Inicio', 'Declaracion', 'Asignacion', 'Numero', 'VariableDefinida', 'Fin'} | |
self.alphabet = set(listaDeLetras + listaDeNumeros + listaDeOperadores + listaDeSeparadores) | |
self.transitions = { | |
'Inicio': {**evalLetraDeclaracion}, | |
'Declaracion': {**evalLetraDeclaracion, **evalNumeroDeclaracion, **evalAsignacion, **evalFin}, | |
'Asignacion': {**evalLetraDeVariableDefinida, **evalNumero}, | |
'Numero': {**evalNumero, **evalOperador, **evalFin}, | |
'VariableDefinida': {**evalLetraDeVariableDefinida, **evalNumeroDeVariableDefinida, **evalOperador, **evalFin}, | |
'Fin': {**evalFin, **evalLetraDeclaracion} | |
} | |
self.initial_state = 'Inicio' | |
self.accepting_states = {'Fin'} | |
def process_input(self, input_string): | |
current_state = self.initial_state | |
for symbol in input_string: | |
if symbol not in self.alphabet: | |
print("Carácter no reconocido: '{}'".format(symbol)) | |
return False # El símbolo no está en el alfabeto | |
if current_state not in self.states: | |
print('Estado no válido') | |
return False # El estado no es válido | |
print(current_state, symbol, self.transitions[current_state].get(symbol, None)) | |
print() | |
current_state = self.transitions[current_state].get(symbol, None) | |
if current_state is None: | |
print('Siguiente estado inexistente') | |
return False # No hay transición para el símbolo | |
return current_state in self.accepting_states | |
# Ejemplo de uso | |
automaton = FunctionLanguageAutomaton() | |
input_string = 'x=2*x1+3*y1*y1;' | |
result = automaton.process_input(input_string) | |
print(f'La sentencia "{input_string}" es válida: {result}') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment