Skip to content

Instantly share code, notes, and snippets.

@mikebsg01
Last active November 25, 2023 02:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mikebsg01/4e20817074291c7e1ee669c654e6c60a to your computer and use it in GitHub Desktop.
Save mikebsg01/4e20817074291c7e1ee669c654e6c60a to your computer and use it in GitHub Desktop.
First Automaton in Python - Deterministic Finite Automaton (DFA)
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