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.

Reply via email to