#!/usr/bin/python3 import sys import re class automata: # class variables init def __init__(self): # dictionary of connections between nodes self.storage = {} # list of accepting states self.accepting_states = [] # list of current states self.state = ['0'] # print for debug purposes def __repr__(self): return('%s\n\n%s\n\n%s\n\n' % (self.storage, self.accepting_states, self.state)) # add node in open fst format def add_node(self, line): node = line.replace('\n', '').split(' ') if len(node) == 3: if node[0] in self.storage: # add value to existing node self.storage[node[0]].append({node[2]: node[1]}) else: # create new node self.storage[node[0]] = [{node[2]: node[1]}] elif len(node) == 1: # add accepting state self.accepting_states.append(node[0]) # check if string is accepted by automate def test_string(self, text): self.state = ['0'] text = text.replace('\n', '') for i in text: for q in self.state: self.state = self.get_node_transition(q, i) if not self.state: return False return self.check_if_accepted() def check_if_accepted(self): return not set(self.state).isdisjoint(self.accepting_states) def get_node_transition(self, query): for i in self.storage: if i[0] == query: return i[1] return [] def sort(self): self.storage = sorted(self.storage, key = lambda x: (x[0][0], x[0][1])) auto = automata() for line in sys.stdin: auto.add_node(line) f = open(sys.argv[1], 'r') for line in f: print(auto.test_string(line))