class grammarFSM: def fsm_setup(self): self.fsm = FSM('INIT', []) self.fsm.set_default_transition(lgFSM.Error, 'INIT') self.fsm.add_transition_any('INIT', None, 'INIT') self.fsm.add_transition('RW', 'INIT', lgFSM.Root) self.fsm.add_transition('Xp', 'INIT', lgFSM.Period) self.fsm.add_transition('Wd', 'INIT', lgFSM.Declarative, 'DECL') self.fsm.add_transition('Wd', 'DECL', lgFSM.Declarative, 'DECL') self.fsm.add_transition('Ss', 'DECL', lgFSM.Subject, 'INIT') self.fsm.add_transition('AF', 'DECL', lgFSM.Object, 'INIT') def fsm_run(self, input): debug(input) return self.fsm.process_list(input)
class grammarFSM: def fsm_setup(self): self.fsm = FSM('INIT', []) self.fsm.set_default_transition(lgFSM.Error, 'INIT') self.fsm.add_transition_any('INIT', None, 'INIT') self.fsm.add_transition('RW', 'INIT', lgFSM.Root) self.fsm.add_transition('Xp', 'INIT', lgFSM.Period) self.fsm.add_transition('Wd', 'INIT', lgFSM.Declarative, 'DECL') self.fsm.add_transition('Wd', 'DECL', lgFSM.Declarative, 'DECL') self.fsm.add_transition('Ss', 'DECL', lgFSM.Subject, 'INIT') self.fsm.add_transition('AF', 'DECL', lgFSM.Object, 'INIT') def fsm_run(self, input): debug(input) return self.fsm.process_list(input)
class NDPDA_FSM: """ So this is a non-deterministic FSM can be used as a push-down Automata (PDA) since a PDA is a FSM + memory.""" registers = None def __init__(self, initial_state, memory=[]): # Map (input_symbol, current_state) --> (action, next_state). self.state_transitions = {} # Map (current_state) --> (action, next_state). self.input_symbol = None self.initial_state = initial_state self.current_state = self.initial_state self.next_state = None self.action = None self.memory = memory self.registers = {} self.register_history = [] self.L_registers = {} self.R_registers = {} self.fsm = FSM('INIT') self.fsm.add_transition('front_left', 'INIT', None, 'FRONT_L') self.fsm.add_transition('front_right', 'INIT', None, 'FRONT_R') def reset (self): self.current_state = self.initial_state self.input_symbol = None def set_register_state(self, in_state): #debug(in_state) pass def match_register_state(self, in_state): #debug(in_state) pass def add_transition(self, input_symbol, state, action=None, next_state=None): #debug(state) if next_state is None: next_state = state #debug(state) #debug(input_symbol) self.state_transitions[input_symbol] = (state, action, next_state) def get_transition(self, input_symbol): for regex_transitions in self.state_transitions: re_to_match = re.compile(regex_transitions) re_search = re_to_match.search(input_symbol) if re_search: yield self.state_transitions[regex_transitions] def process(self, input_symbol): output = None self.input_symbol = input_symbol for transitions in self.get_transition(self.input_symbol): self.state, self.action, self.next_state = transitions #debug(self.registers) if self.match_register_state(self.state): self.set_register_state(self.next_state) if self.state: output = {self.action:{'state':self.state,'set_state':self.next_state}} else: output = {self.action:{'set_state':self.next_state}} break self.current_state = self.next_state self.next_state = None self.memory.pop(0) if output: return output def process_list (self, input_symbols): debug(input_symbols) output = [] current_item = 0 for s in input_symbols: #debug(s) runner = self.process(s) output.append((current_item, runner)) current_item += 1 return output