def from_regular_grammar(grammar) -> 'NFA':
""" Converts RegularGrammar to NFA """
initial_symbol = grammar.initial_symbol()
productions = grammar.productions()
states = set(productions.keys()) | {"X"}
alphabet = set() # type: Set[str]
transitions = {} # type: Dict[Tuple[str, str], Set[str]]
initial_state = initial_symbol
final_states = set("X") | \
({initial_symbol} if "&" in productions[initial_symbol] else set())
for non_terminal, prods in productions.items():
for production in prods:
if production == "&":
continue
new_transition = "X" if len(production) == 1 else production[1]
transitions.setdefault(
(non_terminal, production[0]), set()).add(new_transition)
alphabet.add(production[0])
return NFA(states, alphabet, transitions, initial_state, final_states)
评论列表
文章目录