Some refactorings for simplicity

This commit is contained in:
Dave Halter
2018-06-14 18:18:28 +02:00
parent 8c348aee6f
commit 1f02327cff
+8 -6
View File
@@ -38,6 +38,7 @@ class ParserGenerator(object):
i = 256 + len(grammar.symbol2number) i = 256 + len(grammar.symbol2number)
grammar.symbol2number[name] = i grammar.symbol2number[name] = i
grammar.number2symbol[i] = name grammar.number2symbol[i] = name
for name in names: for name in names:
dfas = self._rule_to_dfas[name] dfas = self._rule_to_dfas[name]
states = [] states = []
@@ -148,10 +149,11 @@ class ParserGenerator(object):
class DFAState(object): class DFAState(object):
def __init__(self, nfa_set, final): def __init__(self, from_rule, nfa_set, final):
assert isinstance(nfa_set, dict) assert isinstance(nfa_set, dict)
assert isinstance(next(iter(nfa_set)), NFAState) assert isinstance(next(iter(nfa_set)), NFAState)
assert isinstance(final, NFAState) assert isinstance(final, NFAState)
self.from_rule = from_rule
self.nfa_set = nfa_set self.nfa_set = nfa_set
self.isfinal = final in nfa_set self.isfinal = final in nfa_set
self.arcs = {} # map from label to DFAState self.arcs = {} # map from label to DFAState
@@ -225,7 +227,7 @@ def _make_dfas(start, finish):
base = {} base = {}
addclosure(start, base) addclosure(start, base)
states = [DFAState(base, finish)] states = [DFAState(start.from_rule, base, finish)]
for state in states: # NB states grows while we're iterating for state in states: # NB states grows while we're iterating
arcs = {} arcs = {}
for nfa_state in state.nfa_set: for nfa_state in state.nfa_set:
@@ -237,7 +239,7 @@ def _make_dfas(start, finish):
if st.nfa_set == nfa_set: if st.nfa_set == nfa_set:
break break
else: else:
st = DFAState(nfa_set, finish) st = DFAState(start.from_rule, nfa_set, finish)
states.append(st) states.append(st)
state.add_arc(st, label_or_string) state.add_arc(st, label_or_string)
return states # List of DFAState instances; first one is start return states # List of DFAState instances; first one is start
@@ -260,8 +262,8 @@ def _dump_nfa(start, finish):
print(" %s -> %d" % (label, j)) print(" %s -> %d" % (label, j))
def _dump_dfas(name, dfas): def _dump_dfas(dfas):
print("Dump of DFA for", name) print("Dump of DFA for", dfas[0].from_rule)
for i, state in enumerate(dfas): for i, state in enumerate(dfas):
print(" State", i, state.isfinal and "(final)" or "") print(" State", i, state.isfinal and "(final)" or "")
for label, next in state.arcs.items(): for label, next in state.arcs.items():
@@ -282,7 +284,7 @@ def generate_grammar(bnf_grammar, token_namespace):
for nfa_a, nfa_z in GrammarParser(bnf_grammar).parse(): for nfa_a, nfa_z in GrammarParser(bnf_grammar).parse():
#_dump_nfa(a, z) #_dump_nfa(a, z)
dfas = _make_dfas(nfa_a, nfa_z) dfas = _make_dfas(nfa_a, nfa_z)
#_dump_dfas(nfa_a.from_rule, dfas) #_dump_dfas(dfas)
# oldlen = len(dfas) # oldlen = len(dfas)
_simplify_dfas(dfas) _simplify_dfas(dfas)
# newlen = len(dfas) # newlen = len(dfas)