jfz-2023-s473564/TaskC04/run.py

49 lines
1.5 KiB
Python

import sys
def load_data(file_path):
dfa = {}
with open(file_path, 'r') as file:
for line in file:
split_data = line.strip().split('\t')
if len(split_data) == 3:
state, next_state, symbol = split_data
key = (int(state), symbol)
dfa[key] = int(next_state)
return dfa
def is_accepted(dfa, input_str, current_state, accepting_states):
for i, symbol in enumerate(input_str):
key = (current_state, symbol)
if key in dfa:
current_state = dfa[key]
elif (current_state, '<eps>') in dfa: # Check for <eps> transition
current_state = dfa[(current_state, '<eps>')]
else:
# If there is no transition for the current symbol or <eps>, reject the string
return False
# If it's the last symbol and the current state is not accepting, check for <eps> transition
if i == len(input_str) - 1 and current_state not in accepting_states:
if (current_state, '<eps>') in dfa:
current_state = dfa[(current_state, '<eps>')]
if current_state in accepting_states:
return True
return current_state in accepting_states
# Set of accepting states
accepting_states = {2,5}
dfa_file = sys.argv[1]
dfa = load_data(dfa_file)
for line in sys.stdin:
input_str = line.strip()
start_state = 0
if is_accepted(dfa, input_str, start_state, accepting_states):
print("YES", input_str)
else:
print("NO", input_str)