Some refactorings for simplicity

This commit is contained in:
Dave Halter
2018-06-14 18:18:28 +02:00
parent 8c348aee6f
commit 1f02327cff

View File

@@ -38,6 +38,7 @@ class ParserGenerator(object):
i = 256 + len(grammar.symbol2number)
grammar.symbol2number[name] = i
grammar.number2symbol[i] = name
for name in names:
dfas = self._rule_to_dfas[name]
states = []
@@ -148,10 +149,11 @@ class ParserGenerator(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(next(iter(nfa_set)), NFAState)
assert isinstance(final, NFAState)
self.from_rule = from_rule
self.nfa_set = nfa_set
self.isfinal = final in nfa_set
self.arcs = {} # map from label to DFAState
@@ -225,7 +227,7 @@ def _make_dfas(start, finish):
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
arcs = {}
for nfa_state in state.nfa_set:
@@ -237,7 +239,7 @@ def _make_dfas(start, finish):
if st.nfa_set == nfa_set:
break
else:
st = DFAState(nfa_set, finish)
st = DFAState(start.from_rule, nfa_set, finish)
states.append(st)
state.add_arc(st, label_or_string)
return states # List of DFAState instances; first one is start
@@ -260,8 +262,8 @@ def _dump_nfa(start, finish):
print(" %s -> %d" % (label, j))
def _dump_dfas(name, dfas):
print("Dump of DFA for", name)
def _dump_dfas(dfas):
print("Dump of DFA for", dfas[0].from_rule)
for i, state in enumerate(dfas):
print(" State", i, state.isfinal and "(final)" or "")
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():
#_dump_nfa(a, z)
dfas = _make_dfas(nfa_a, nfa_z)
#_dump_dfas(nfa_a.from_rule, dfas)
#_dump_dfas(dfas)
# oldlen = len(dfas)
_simplify_dfas(dfas)
# newlen = len(dfas)