Reviewers: marja,
Message:
Committed patchset #1 manually as r17701 (presubmit successful).
Description:
Experimental parser: dump minimal dfa into html
[email protected]
BUG=
Committed: https://code.google.com/p/v8/source/detail?r=17701
Please review this at https://codereview.chromium.org/60733018/
SVN Base: https://v8.googlecode.com/svn/branches/experimental/parser
Affected files (+37, -3 lines):
M tools/lexer_generator/dfa.py
M tools/lexer_generator/generator.py
M tools/lexer_generator/rule_parser.py
Index: tools/lexer_generator/dfa.py
diff --git a/tools/lexer_generator/dfa.py b/tools/lexer_generator/dfa.py
index
14a5d6367ff105006f7e122256e5d9756432f9bc..805e6315aa4281f4b00ba77dd52db7b725f399e0
100644
--- a/tools/lexer_generator/dfa.py
+++ b/tools/lexer_generator/dfa.py
@@ -243,6 +243,33 @@ class DfaMinimizer:
def __partition_count(partitions):
return len(reduce(lambda acc, p: acc | p.set(), partitions, set()))
+ def __merge_partitions(self, id_map, partitions):
+ mapping = {}
+ name_map = {}
+ for partition in partitions:
+ name_map[partition] = str(partition)
+ alphabet = self.__generate_alphabet()
+ for partition in partitions:
+ state_id = iter(partition).next()
+ state = id_map[state_id]
+ node = {
+ 'transitions' : {},
+ 'terminal' : state in self.__dfa.terminal_set(),
+ 'action' : state.action(),
+ }
+ mapping[str(partition)] = node
+ for key in alphabet:
+ transition_state = state.key_matches(key)
+ if not transition_state:
+ continue
+ transition_id = transition_state.node_number()
+ transition_partition = self.__find_partition(partitions,
transition_id)
+ assert transition_partition
+ node['transitions'][key] = name_map[transition_partition]
+ start_id = self.__dfa.start_state().node_number()
+ start_name = name_map[self.__find_partition(partitions, start_id)]
+ return (start_name, mapping)
+
def minimize(self):
(id_map, partitions) = self.__partition()
node_count = self.__dfa.node_count()
@@ -294,4 +321,5 @@ class DfaMinimizer:
self.__verify_partitions(id_map, partitions)
if len(partitions) == len(id_map):
return self.__dfa
- # merge partitions
+ (start_name, mapping) = self.__merge_partitions(id_map, partitions)
+ return Dfa(start_name, mapping)
Index: tools/lexer_generator/generator.py
diff --git a/tools/lexer_generator/generator.py
b/tools/lexer_generator/generator.py
index
67f144ecab8c2236e49ac5beb8f69dcd4caea8f5..f11531ad7304d803ce7534b7ba61f9fc0fb16978
100644
--- a/tools/lexer_generator/generator.py
+++ b/tools/lexer_generator/generator.py
@@ -69,11 +69,15 @@ def generate_html(rule_processor):
loads = []
for i, (name, automata) in
enumerate(list(rule_processor.automata_iter())):
(nfa, dfa) = (automata.nfa(), automata.dfa())
- (nfa_i, dfa_i) = ("nfa_%d" % i, "dfa_%d" % i)
+ mdfa = None if name == 'default' else automata.minimal_dfa()
+ (nfa_i, dfa_i, mdfa_i) = ("nfa_%d" % i, "dfa_%d" % i, "mdfa_%d" % i)
scripts.append(script_template % (nfa_i, nfa.to_dot()))
- scripts.append(script_template % (dfa_i, dfa.to_dot()))
loads.append(load_template % ("nfa [%s]" % name, nfa_i))
+ scripts.append(script_template % (dfa_i, dfa.to_dot()))
loads.append(load_template % ("dfa [%s]" % name, dfa_i))
+ if mdfa and mdfa != dfa:
+ scripts.append(script_template % (mdfa_i, mdfa.to_dot()))
+ loads.append(load_template % ("mdfa [%s]" % name, mdfa_i))
body = "\n".join(scripts) + (load_outer_template % "\n".join(loads))
return file_template % body
Index: tools/lexer_generator/rule_parser.py
diff --git a/tools/lexer_generator/rule_parser.py
b/tools/lexer_generator/rule_parser.py
index
aebd49936c0edcbadb24ecb5b1039329d237b0b9..1461863b6b00ddd19881669bf1aec7f39fcf33c4
100644
--- a/tools/lexer_generator/rule_parser.py
+++ b/tools/lexer_generator/rule_parser.py
@@ -252,6 +252,8 @@ class RuleProcessor(object):
return self.__dfa
def minimal_dfa(self):
+ if not self.__minimial_dfa:
+ self.__minimial_dfa = self.__dfa.minimize()
return self.__minimial_dfa
def __process_parser_state(self, parser_state, minimize_dfa):
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.