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.