Reviewers: marja,

Message:
Committed patchset #1 manually as r19600 (tree was closed).

Description:
Experimental parser: cleanup BacktrackingGenerator

[email protected]

BUG=

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

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

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

Affected files (+35, -15 lines):
  M tools/lexer_generator/backtracking_generator.py


Index: tools/lexer_generator/backtracking_generator.py
diff --git a/tools/lexer_generator/backtracking_generator.py b/tools/lexer_generator/backtracking_generator.py index 475647525b4c5c18a0fb9e653248c431f793bd7e..0f92b53457ae3c6859c383f9713561a2cee6ef86 100644
--- a/tools/lexer_generator/backtracking_generator.py
+++ b/tools/lexer_generator/backtracking_generator.py
@@ -33,15 +33,14 @@ class BacktrackingGenerator(object):

   @staticmethod
   def generate(dfa, default_action):
-    return BacktrackingGenerator(dfa, default_action, None).__generate()
+    return BacktrackingGenerator(dfa, default_action).__generate()

-  def __init__(self, dfa, default_action, log):
+  def __init__(self, dfa, default_action):
     self.__dfa = dfa
     self.__default_action = default_action
-    self.__log = log

   @staticmethod
-  def __process_error_states(dfa, error_map, action_state_map):
+  def __print_ambiguous_paths(dfa, error_map, action_state_map):
     path_map = { k : [] for k in error_map.iterkeys()}
     error_states = set(error_map.iterkeys())
     for path, states_in_path, terminal in dfa.path_iter():
@@ -70,9 +69,8 @@ class BacktrackingGenerator(object):
         if count > 10:
           break

-  def __generate(self):
-    dfa = self.__dfa
-    default_action = self.__default_action
+  @staticmethod
+  def __compute_action_states(dfa, default_action):
     terminal_set = dfa.terminal_set()
     # Collect states that terminate currently.
     action_states = {}
@@ -93,7 +91,11 @@ class BacktrackingGenerator(object):
       action_states[state] = match_action
     dfa.visit_all_states(f)
     assert omega_states == terminal_set
-    # Find nodes that need backtracking edges
+    return action_states, omega_states
+
+  @staticmethod
+  def __build_backtracking_map(
+      dfa, default_action, action_states, omega_states):
     incoming_transitions = dfa.build_incoming_transitions_map()
     backtracking_map = {}
     store_states = set()
@@ -141,11 +143,10 @@ class BacktrackingGenerator(object):
         continue
       store_states |= match_edge
       backtracking_map[state.node_number()] = (action, match_edge)
-    # Bail if error occurred.
-    if error_map:
-      self.__process_error_states(dfa, error_map, action_states)
-      raise Exception('ambiguous backtracking')
-    # Now install backtracking everywhere.
+    return backtracking_map, store_states, error_map
+
+  @staticmethod
+ def __construct_dfa_with_backtracking(dfa, backtracking_map, store_states):
     def install_backtracking_action(new_states, node_number):
       omega_state_id = str(node_number) + '_bt'
       key = TransitionKey.omega()
@@ -167,6 +168,7 @@ class BacktrackingGenerator(object):
         term = Term('chain', term, action.term())
       return Action(term, 0)
     # Now generate the new dfa.
+    terminal_set = dfa.terminal_set()
     def convert(old_state, new_states):
       node_number = old_state.node_number()
       # Clone existing state.
@@ -176,9 +178,27 @@ class BacktrackingGenerator(object):
         'action' : new_state_action(old_state),
         'terminal' : old_state in terminal_set
       }
-      # install a backtracking action
+      # Install a backtracking action.
       if node_number in backtracking_map:
         install_backtracking_action(new_states, node_number)
       return new_states
-    new_states = dfa.visit_all_states(convert, {})
+    return dfa.visit_all_states(convert, {})
+
+  def __generate(self):
+    dfa = self.__dfa
+    default_action = self.__default_action
+    # Find nodes that have actions.
+    action_states, omega_states= self.__compute_action_states(
+      dfa, default_action)
+    # Find nodes that need backtracking edges.
+ backtracking_map, store_states, error_map = self.__build_backtracking_map(
+      dfa, default_action, action_states, omega_states)
+    # Bail if error occurred.
+    if error_map:
+      self.__print_ambiguous_paths(dfa, error_map, action_states)
+      raise Exception('ambiguous backtracking')
+    # Now install backtracking everywhere.
+    new_states = self.__construct_dfa_with_backtracking(
+      dfa, backtracking_map, store_states)
+    start_state = dfa.start_state()
     return Dfa(dfa.encoding(), str(start_state.node_number()), new_states)


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