Reviewers: marja,

Message:
Committed patchset #1 manually as r17902 (presubmit successful).

Description:
Experimental parser: small cleanups

[email protected]

BUG=

Committed: https://code.google.com/p/v8/source/detail?r=17902

Please review this at https://codereview.chromium.org/77863004/

SVN Base: https://v8.googlecode.com/svn/branches/experimental/parser

Affected files (+18, -24 lines):
  tools/lexer_generator/automata_test.py
  tools/lexer_generator/automaton.py
  tools/lexer_generator/dfa.py
  tools/lexer_generator/lexer_test.py
  tools/lexer_generator/nfa.py
  tools/lexer_generator/nfa_builder.py


Index: tools/lexer_generator/automata_test.py
diff --git a/tools/lexer_generator/automata_test.py b/tools/lexer_generator/automata_test.py index 6c45b9ed9628fc93d6c4fc6a722b8e0fd2803886..a81adb23a6e75b3f50bfb6b6c84fe389f3a0d017 100644
--- a/tools/lexer_generator/automata_test.py
+++ b/tools/lexer_generator/automata_test.py
@@ -32,20 +32,15 @@ from transition_keys import TransitionKey
 from nfa_builder import NfaBuilder
 from dfa import Dfa

-def dfa_from_nfa(nfa):
-  (start_name, dfa_nodes) = nfa.compute_dfa()
-  return Dfa(start_name, dfa_nodes)
-
-def build_automata(string):
-  nfa = NfaBuilder().nfa(RegexParser.parse(string))
-  dfa = dfa_from_nfa(nfa)
-  return (nfa, dfa, dfa.minimize())
-
-def simple_action(string):
-  return Action(None, (string, None))
-
 class AutomataTestCase(unittest.TestCase):

+  @staticmethod
+  def __build_automata(string):
+    nfa = NfaBuilder().nfa(RegexParser.parse(string))
+    (start_name, dfa_nodes) = nfa.compute_dfa()
+    dfa = Dfa(start_name, dfa_nodes)
+    return (nfa, dfa, dfa.minimize())
+
     # (pattern, should match, should not match)
     __test_data = [
       ("a", ["a"], ["b", ""]),
@@ -71,7 +66,7 @@ class AutomataTestCase(unittest.TestCase):

     def test_matches(self):
       for (regex, matches, not_matches) in self.__test_data:
-        automata = build_automata(regex)
+        automata = self.__build_automata(regex)
         for string in matches:
           for automaton in automata:
             self.assertTrue(automaton.matches(string))
@@ -81,7 +76,7 @@ class AutomataTestCase(unittest.TestCase):

     def test_can_construct_dot(self):
       for (regex, matches, not_matches) in self.__test_data:
-        for automaton in build_automata(regex):
+        for automaton in self.__build_automata(regex):
           automaton.to_dot()

     def test_minimization(self):
@@ -100,4 +95,3 @@ class AutomataTestCase(unittest.TestCase):

       mdfa = Dfa('S_0', mapping).minimize()
       self.assertEqual(3, mdfa.node_count())
-
Index: tools/lexer_generator/automaton.py
diff --git a/tools/lexer_generator/automaton.py b/tools/lexer_generator/automaton.py index e37df525487a49259b9ad5c17b29f50f8d99f6b2..dff7f0c75bfd65ab73b287f573ef0fa4c5792847 100644
--- a/tools/lexer_generator/automaton.py
+++ b/tools/lexer_generator/automaton.py
@@ -154,11 +154,10 @@ class Automaton(object):
def visit_all_states(self, visitor, visit_state = None, state_iter = None): return self.visit_states(self.start_set(), visitor, visit_state, state_iter)

-  # TODO use iters
   @staticmethod
   def epsilon_closure(states):
-    f = lambda acc, node: acc | node.epsilon_closure()
-    return reduce(f, states, set(iter(states)))
+    f = lambda state : state.epsilon_closure_iter()
+    return set(chain(iter(states), *map(f, states)))

   @staticmethod
   def __transition_states_for_char(valid_states, c):
Index: tools/lexer_generator/dfa.py
diff --git a/tools/lexer_generator/dfa.py b/tools/lexer_generator/dfa.py
index e6cc405d332ed59752f61d75924b3186ce8161c1..154caef89c09d0ca26ed4fd2507994d251815e95 100644
--- a/tools/lexer_generator/dfa.py
+++ b/tools/lexer_generator/dfa.py
@@ -54,8 +54,8 @@ class DfaState(AutomatonState):
   def transitions(self):
     return self.__transitions

-  def epsilon_closure(self):
-    return set([self])
+  def epsilon_closure_iter(self):
+    return iter([])

   # TODO abstract state matching
   def __matches(self, match_func, value):
Index: tools/lexer_generator/lexer_test.py
diff --git a/tools/lexer_generator/lexer_test.py b/tools/lexer_generator/lexer_test.py index 53630b95caee2db1255a4179069df68166997a3c..1d1707b124deae8947afaf3ee6c72bd861679698 100644
--- a/tools/lexer_generator/lexer_test.py
+++ b/tools/lexer_generator/lexer_test.py
@@ -39,7 +39,8 @@ class LexerTestCase(unittest.TestCase):
           self.assertEquals(expected[i][0], action)
           self.assertEquals(expected[i][1], string[start : stop])

-  def __terminate(self):
+  @staticmethod
+  def __terminate():
     return (Action(None, ('terminate', None)), '\0')

   def test_simple(self):
Index: tools/lexer_generator/nfa.py
diff --git a/tools/lexer_generator/nfa.py b/tools/lexer_generator/nfa.py
index 30e96c00d7e7b22c2f597bd304431d49741d3843..289ec48eee21980b156b2a1eea7a153372d59bd6 100644
--- a/tools/lexer_generator/nfa.py
+++ b/tools/lexer_generator/nfa.py
@@ -40,8 +40,8 @@ class NfaState(AutomatonState):
   def transitions_to_multiple_states(self):
     return True

-  def epsilon_closure(self):
-    return self.__epsilon_closure
+  def epsilon_closure_iter(self):
+    return iter(self.__epsilon_closure)

   def set_epsilon_closure(self, closure):
     assert self.is_closed()
Index: tools/lexer_generator/nfa_builder.py
diff --git a/tools/lexer_generator/nfa_builder.py b/tools/lexer_generator/nfa_builder.py index 908e07cbfb83c911293201157ce6a879dba95b3c..c5410b324d693466233b22cc7dbef846241b1173 100644
--- a/tools/lexer_generator/nfa_builder.py
+++ b/tools/lexer_generator/nfa_builder.py
@@ -224,7 +224,7 @@ class NfaBuilder(object):
     transitions = state.transitions()
     if not catch_all in transitions:
       return
-    f = lambda acc, state: acc | state.epsilon_closure()
+    f = lambda acc, state: acc | set(state.epsilon_closure_iter())
     reachable_states = reduce(f, transitions[catch_all], set())
     f = lambda acc, state: acc | set(state.transitions().keys())
     keys = reduce(f, reachable_states, set())


--
--
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