def build_LR0_automaton(G: Grammar): assert len(G.startSymbol.productions) == 1, 'Grammar must be augmented' start_production = G.startSymbol.productions[0] start_item = Item(start_production, 0) automaton = State(start_item, True) pending = [start_item] visited = {start_item: automaton} while pending: current_item = pending.pop() if current_item.IsReduceItem: continue current_state = visited[current_item] next_symbol = current_item.NextSymbol next_item = current_item.NextItem() #- $(X --> a.cB) ---c---> (X --> ac.B) con c in V_T #- $(X --> a.YB) ---Y---> (X --> aY.B) con Y in V_N next_state = get_state(visited, pending, next_item) current_state.add_transition(next_symbol.Name, next_state) if next_symbol in G.nonTerminals: sym_productions = G.symbDict[next_symbol.Name].productions #- $(X --> a.YB) ---e---> (Y --> .Z) con Y in V_N for pr in [Item(x, 0) for x in sym_productions]: trans_state = get_state(visited, pending, pr) current_state.add_epsilon_transition(trans_state) return automaton.to_deterministic(lr0_formatter)
def _build_automaton(self): start = State('start') automatons = self.regexs for i in automatons: start.add_epsilon_transition(i) final = start.to_deterministic() return final
def _build_automaton(self): start = State('start') regexs = self.regexs for regex in regexs: start.add_epsilon_transition(regex) return start.to_deterministic()
def _build_automaton(self): start = State('start') for automaton in self.regexs: start.add_epsilon_transition(automaton) return start.to_deterministic()
def _build_automaton(self): start = State('start') # Your code here!!! for x in self.regexs: start.add_epsilon_transition(self.regexs[x]) return start.to_deterministic()