mirror of
https://github.com/davidhalter/parso.git
synced 2026-05-24 17:28:53 +08:00
Some more refactorings for clarification
This commit is contained in:
@@ -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
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user