Some more refactorings for clarification

This commit is contained in:
Dave Halter
2018-06-13 01:44:08 +02:00
parent 95ddeb4012
commit 3818fb2b22
2 changed files with 23 additions and 14 deletions
+1 -1
View File
@@ -83,7 +83,7 @@ class Grammar(object):
self.start_symbol = start_symbol self.start_symbol = start_symbol
@property @property
def start_symbol(self): def start(self):
return self.symbol2number[self.start_symbol] return self.symbol2number[self.start_symbol]
def report(self): def report(self):
+22 -13
View File
@@ -167,21 +167,26 @@ class _GrammarParser():
while self.type != token.ENDMARKER: while self.type != token.ENDMARKER:
while self.type == token.NEWLINE: while self.type == token.NEWLINE:
self._gettoken() self._gettoken()
# rule: NAME ':' rhs NEWLINE # rule: NAME ':' rhs NEWLINE
name = self._expect(token.NAME) self._current_rule_name = self._expect(token.NAME)
self._expect(token.COLON) self._expect(token.COLON)
a, z = self._parse_rhs() a, z = self._parse_rhs()
self._expect(token.NEWLINE) self._expect(token.NEWLINE)
#self._dump_nfa(name, a, z)
#self._dump_nfa(a, z)
dfa = self._make_dfa(a, z) dfa = self._make_dfa(a, z)
#self._dump_dfa(name, dfa) #self._dump_dfa(self._current_rule_name, dfa)
# oldlen = len(dfa) # oldlen = len(dfa)
_simplify_dfa(dfa) _simplify_dfa(dfa)
# newlen = len(dfa) # newlen = len(dfa)
dfas[name] = dfa dfas[self._current_rule_name] = dfa
#print name, oldlen, newlen #print(self._current_rule_name, oldlen, newlen)
if start_symbol is None: if start_symbol is None:
start_symbol = name start_symbol = self._current_rule_name
return dfas, start_symbol return dfas, start_symbol
def _make_dfa(self, start, finish): def _make_dfa(self, start, finish):
@@ -223,8 +228,8 @@ class _GrammarParser():
state.add_arc(st, label) state.add_arc(st, label)
return states # List of DFAState instances; first one is start return states # List of DFAState instances; first one is start
def _dump_nfa(self, name, start, finish): def _dump_nfa(self, start, finish):
print("Dump of NFA for", name) print("Dump of NFA for", start.from_rule)
todo = [start] todo = [start]
for i, state in enumerate(todo): for i, state in enumerate(todo):
print(" State", i, state is finish and "(final)" or "") print(" State", i, state is finish and "(final)" or "")
@@ -252,8 +257,8 @@ class _GrammarParser():
if self.value != "|": if self.value != "|":
return a, z return a, z
else: else:
aa = NFAState() aa = NFAState(self._current_rule_name)
zz = NFAState() zz = NFAState(self._current_rule_name)
aa.add_arc(a) aa.add_arc(a)
z.add_arc(zz) z.add_arc(zz)
while self.value == "|": while self.value == "|":
@@ -301,8 +306,8 @@ class _GrammarParser():
self._expect(token.RPAR) self._expect(token.RPAR)
return a, z return a, z
elif self.type in (token.NAME, token.STRING): elif self.type in (token.NAME, token.STRING):
a = NFAState() a = NFAState(self._current_rule_name)
z = NFAState() z = NFAState(self._current_rule_name)
a.add_arc(z, self.value) a.add_arc(z, self.value)
self._gettoken() self._gettoken()
return a, z return a, z
@@ -336,7 +341,8 @@ class _GrammarParser():
class NFAState(object): class NFAState(object):
def __init__(self): def __init__(self, from_rule):
self.from_rule = from_rule
self.arcs = [] # list of (label, NFAState) pairs self.arcs = [] # list of (label, NFAState) pairs
def add_arc(self, next, label=None): def add_arc(self, next, label=None):
@@ -344,6 +350,9 @@ class NFAState(object):
assert isinstance(next, NFAState) assert isinstance(next, NFAState)
self.arcs.append((label, next)) self.arcs.append((label, next))
def __repr__(self):
return '<%s: from %s>' % (self.__class__.__name__, self.from_rule)
class DFAState(object): class DFAState(object):
def __init__(self, nfaset, final): def __init__(self, nfaset, final):