Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(737)

Unified Diff: tools/lexer_generator/nfa_builder.py

Issue 141293003: Experimental parser: visualize rule trees. (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/parser
Patch Set: . Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/lexer_generator/generator.py ('k') | tools/lexer_generator/rule_parser.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/lexer_generator/nfa_builder.py
diff --git a/tools/lexer_generator/nfa_builder.py b/tools/lexer_generator/nfa_builder.py
index e127ab4cecf4f3409adc7aa4a7a9742b762d4bdf..d591f5c39969a94d3d9559289b09f6ed7b3d0cc7 100644
--- a/tools/lexer_generator/nfa_builder.py
+++ b/tools/lexer_generator/nfa_builder.py
@@ -240,6 +240,41 @@ class NfaBuilder(object):
return Nfa(self.__encoding, start, end, nodes_created)
@staticmethod
+ def rule_tree_dot(graph):
+ node_ix = [0]
+ node_template = 'node [label="%s"]; N_%d;'
+ edge_template = 'N_%d -> N_%d'
+ nodes = []
+ edges = []
+
+ def escape(v):
+ v = str(v)
+ v = v.replace('\r', '\\\\r').replace('\t', '\\\\t').replace('\n', '\\\\n')
+ v = v.replace('\\', '\\\\').replace('\"', '\\\"')
+ return v
+
+ def process_thing(thing):
+ if isinstance(thing, str):
+ node_ix[0] += 1
+ nodes.append(node_template % (escape(thing), node_ix[0]))
+ return node_ix[0]
+ if isinstance(thing, tuple):
+ child_ixs = map(process_thing, list(thing)[1:])
+ node_ix[0] += 1
+ nodes.append(node_template % (escape(thing[0]), node_ix[0]))
+ for child_ix in child_ixs:
+ edges.append(edge_template % (node_ix[0], child_ix))
+ return node_ix[0]
+ if isinstance(thing, Action):
+ node_ix[0] += 1
+ nodes.append(node_template % (str(thing), node_ix[0]))
+ return node_ix[0]
+ raise Exception
+
+ process_thing(graph)
+ return 'digraph { %s %s }' % ('\n'.join(nodes), '\n'.join(edges))
+
+ @staticmethod
def add_action(graph, action):
return ('ACTION', graph, action)
« no previous file with comments | « tools/lexer_generator/generator.py ('k') | tools/lexer_generator/rule_parser.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698