Revision: 17902
Author: [email protected]
Date: Wed Nov 20 10:06:26 2013 UTC
Log: Experimental parser: small cleanups
[email protected]
BUG=
Review URL: https://codereview.chromium.org/77863004
http://code.google.com/p/v8/source/detail?r=17902
Modified:
/branches/experimental/parser/tools/lexer_generator/automata_test.py
/branches/experimental/parser/tools/lexer_generator/automaton.py
/branches/experimental/parser/tools/lexer_generator/dfa.py
/branches/experimental/parser/tools/lexer_generator/lexer_test.py
/branches/experimental/parser/tools/lexer_generator/nfa.py
/branches/experimental/parser/tools/lexer_generator/nfa_builder.py
=======================================
--- /branches/experimental/parser/tools/lexer_generator/automata_test.py
Wed Nov 20 09:31:53 2013 UTC
+++ /branches/experimental/parser/tools/lexer_generator/automata_test.py
Wed Nov 20 10:06:26 2013 UTC
@@ -32,20 +32,15 @@
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 @@
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 @@
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 @@
mdfa = Dfa('S_0', mapping).minimize()
self.assertEqual(3, mdfa.node_count())
-
=======================================
--- /branches/experimental/parser/tools/lexer_generator/automaton.py Wed
Nov 20 09:31:53 2013 UTC
+++ /branches/experimental/parser/tools/lexer_generator/automaton.py Wed
Nov 20 10:06:26 2013 UTC
@@ -154,11 +154,10 @@
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):
=======================================
--- /branches/experimental/parser/tools/lexer_generator/dfa.py Wed Nov 20
09:31:53 2013 UTC
+++ /branches/experimental/parser/tools/lexer_generator/dfa.py Wed Nov 20
10:06:26 2013 UTC
@@ -54,8 +54,8 @@
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):
=======================================
--- /branches/experimental/parser/tools/lexer_generator/lexer_test.py Wed
Nov 20 09:50:09 2013 UTC
+++ /branches/experimental/parser/tools/lexer_generator/lexer_test.py Wed
Nov 20 10:06:26 2013 UTC
@@ -39,7 +39,8 @@
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):
=======================================
--- /branches/experimental/parser/tools/lexer_generator/nfa.py Wed Nov 20
09:31:53 2013 UTC
+++ /branches/experimental/parser/tools/lexer_generator/nfa.py Wed Nov 20
10:06:26 2013 UTC
@@ -40,8 +40,8 @@
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()
=======================================
--- /branches/experimental/parser/tools/lexer_generator/nfa_builder.py Wed
Nov 13 08:20:20 2013 UTC
+++ /branches/experimental/parser/tools/lexer_generator/nfa_builder.py Wed
Nov 20 10:06:26 2013 UTC
@@ -224,7 +224,7 @@
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.