summaryrefslogtreecommitdiff
path: root/Parser/pgen/automata.py
diff options
context:
space:
mode:
Diffstat (limited to 'Parser/pgen/automata.py')
-rw-r--r--Parser/pgen/automata.py29
1 files changed, 29 insertions, 0 deletions
diff --git a/Parser/pgen/automata.py b/Parser/pgen/automata.py
index 545a7370f7..d04ca7c6e8 100644
--- a/Parser/pgen/automata.py
+++ b/Parser/pgen/automata.py
@@ -48,6 +48,26 @@ class NFA:
else:
writer(" %s -> %d" % (label, j))
+ def dump_graph(self, writer):
+ """Dump a DOT representation of the NFA"""
+ writer('digraph %s_nfa {\n' % self.name)
+ todo = [self.start]
+ for i, state in enumerate(todo):
+ writer(' %d [label="State %d %s"];\n' % (i, i, state is self.end and "(final)" or ""))
+ for arc in state.arcs:
+ label = arc.label
+ next = arc.target
+ if next in todo:
+ j = todo.index(next)
+ else:
+ j = len(todo)
+ todo.append(next)
+ if label is None:
+ writer(" %d -> %d [style=dotted label=ε];\n" % (i, j))
+ else:
+ writer(" %d -> %d [label=%s];\n" % (i, j, label.replace("'", '"')))
+ writer('}\n')
+
class NFAArc:
"""An arc representing a transition between two NFA states.
@@ -301,6 +321,15 @@ class DFA:
for label, next in sorted(state.arcs.items()):
writer(" %s -> %d" % (label, self.states.index(next)))
+ def dump_graph(self, writer):
+ """Dump a DOT representation of the DFA"""
+ writer('digraph %s_dfa {\n' % self.name)
+ for i, state in enumerate(self.states):
+ writer(' %d [label="State %d %s"];\n' % (i, i, state.is_final and "(final)" or ""))
+ for label, next in sorted(state.arcs.items()):
+ writer(" %d -> %d [label=%s];\n" % (i, self.states.index(next), label.replace("'", '"')))
+ writer('}\n')
+
class DFAState(object):
"""A state of a DFA