Revision: 19405
Author: [email protected]
Date: Mon Feb 17 12:33:05 2014 UTC
Log: Experimental parser: more verification
[email protected]
BUG=
Review URL: https://codereview.chromium.org/169583003
http://code.google.com/p/v8/source/detail?r=19405
Modified:
/branches/experimental/parser/tools/lexer_generator/dfa.py
/branches/experimental/parser/tools/lexer_generator/dfa_minimizer.py
=======================================
--- /branches/experimental/parser/tools/lexer_generator/dfa.py Mon Feb 17
11:26:21 2014 UTC
+++ /branches/experimental/parser/tools/lexer_generator/dfa.py Mon Feb 17
12:33:05 2014 UTC
@@ -89,6 +89,7 @@
name_map[name] = (node, transitions)
if node_data['terminal']:
self.__terminal_set.add(node)
+ all_keys = []
for name, node_data in mapping.items():
(node, transitions) = name_map[name]
inversion = {}
@@ -97,16 +98,32 @@
inversion[state] = []
inversion[state].append(key)
for state, keys in inversion.items():
+ all_keys += keys
merged_key = TransitionKey.merged_key(encoding, keys)
self.__add_transition(transitions, merged_key, name_map[state][0])
self.__start = name_map[start_name][0]
self.__node_count = len(mapping)
+ self.__disjoint_keys = sorted(
+ TransitionKey.disjoint_keys(encoding, all_keys))
self.__verify()
def __verify(self):
assert self.__terminal_set
state_count = self.visit_all_states(lambda state, count: count + 1, 0)
assert self.__node_count == state_count
+ # assert keys are disjoint
+ def f(state, remaining):
+ remaining = set(TransitionKey.disjoint_keys(self.encoding(),
+ state.key_iter()))
+ for key in state.key_iter():
+ to_drop = set(filter(lambda x : key.is_superset_of_key(x),
remaining))
+ assert to_drop
+ remaining -= to_drop
+ assert not remaining
+ self.visit_all_states(f, set(self.disjoint_keys_iter()))
+
+ def disjoint_keys_iter(self):
+ return iter(self.__disjoint_keys)
def node_count(self):
return self.__node_count
=======================================
--- /branches/experimental/parser/tools/lexer_generator/dfa_minimizer.py
Mon Feb 17 11:26:21 2014 UTC
+++ /branches/experimental/parser/tools/lexer_generator/dfa_minimizer.py
Mon Feb 17 12:33:05 2014 UTC
@@ -89,14 +89,12 @@
# IDs.
initial_partitions = {}
terminal_set = self.__dfa.terminal_set()
- all_keys = [] # Will contain all TransitionKeys in the dfa.
# f fills in initial_partitions, id_to_state and all_keys.
def f(state, visitor_state):
state_id = len(id_to_state)
id_to_state[state_id] = state
action = state.action()
- all_keys.append(state.key_iter())
if state in terminal_set:
key = ("terminal set", action)
else:
@@ -133,8 +131,7 @@
# become clear when we check the transition for TransitionKey [c-d]
(S1 has
# a transition to S2, S3 has a transition to S4).
encoding = self.__dfa.encoding()
- self.__alphabet = list(
- TransitionKey.disjoint_keys(encoding, chain(*all_keys)))
+ self.__alphabet = list(self.__dfa.disjoint_keys_iter())
# For each state and each TransitionKey in the alphabet, find out which
# transition we take from the state with the TransitionKey.
--
--
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.