Reviewers: marja,

Message:
Committed patchset #2 manually as r19048 (tree was closed).

Description:
Experimental parser: always add all subtrees

[email protected]

BUG=

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

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

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

Affected files (+12, -22 lines):
  M tools/lexer_generator/nfa_builder.py
  M tools/lexer_generator/rule_parser.py


Index: tools/lexer_generator/nfa_builder.py
diff --git a/tools/lexer_generator/nfa_builder.py b/tools/lexer_generator/nfa_builder.py index 5438b7b4d0c73d0d01d5a2b2132269dae9b32f1b..9de32c280f6920d5062f68bb96340755cc7618d0 100644
--- a/tools/lexer_generator/nfa_builder.py
+++ b/tools/lexer_generator/nfa_builder.py
@@ -156,17 +156,12 @@ class NfaBuilder(object):
   def __unique_key(self, name):
     return self.__key_state(TransitionKey.unique(name))

-  def __join(self, graph, name, subgraph):
-    subgraphs = self.__peek_state()['subgraphs']
-    if not name in subgraphs:
-      subgraphs[name] = self.__nfa(subgraph)
-    (subgraph_start, subgraph_end, nodes_in_subgraph) = subgraphs[name]
-    (start, ends) = self.__process(graph)
-    self.__patch_ends(ends, subgraph_start)
-    if subgraph_end:
-      end = self.__new_state()
-      subgraph_end.add_epsilon_transition(end)
-      return (start, [end])
+  def __join(self, tree, subtree):
+    (subtree_start, subtree_end, nodes_in_subtree) = self.__nfa(subtree)
+    (start, ends) = self.__process(tree)
+    self.__patch_ends(ends, subtree_start)
+    if subtree_end:
+      return (start, [subtree_end])
     else:
       return (start, [])

@@ -186,8 +181,6 @@ class NfaBuilder(object):
   def __push_state(self):
     self.__states.append({
       'start_node' : None,
-      'subgraphs' : {},
-      'unpatched_ends' : [],
     })

   def __pop_state(self):
@@ -204,10 +197,6 @@ class NfaBuilder(object):
     if state['start_node']:
       state['start_node'].close(start)
       start = state['start_node']
-    for k, subgraph in state['subgraphs'].items():
-      if subgraph[1]:
-        subgraph[1].close(None)
-
# Don't create an end node for the subgraph if it would be unused (ends can # be an empty list e.g., in the case when everything inside the subgraph is
     # "continue").
@@ -215,7 +204,6 @@ class NfaBuilder(object):
     if ends:
       end = self.__new_state()
       self.__patch_ends(ends, end)
-
     return (start, end, self.__node_number - start_node_number)

   @staticmethod
@@ -282,8 +270,8 @@ class NfaBuilder(object):
     return Term('UNIQUE_KEY', name)

   @staticmethod
-  def join_subgraph(term, name, subgraph_term):
-    return Term('JOIN', term, name, subgraph_term)
+  def join_subgraph(tree, subtree):
+    return Term('JOIN', tree, subtree)

   @staticmethod
   def or_terms(terms):
Index: tools/lexer_generator/rule_parser.py
diff --git a/tools/lexer_generator/rule_parser.py b/tools/lexer_generator/rule_parser.py index 5351fe8221880e8d0672fafd2ac1aa8c1eee2c2e..a0a15af81a83a732c2ad3b2ea197cbc7873bdd7b 100644
--- a/tools/lexer_generator/rule_parser.py
+++ b/tools/lexer_generator/rule_parser.py
@@ -295,7 +295,9 @@ class RuleProcessor(object):

     def optimize_dfa(self, log = False):
       assert not self.__dfa
-      self.__dfa = DfaOptimizer.optimize(self.dfa(), log)
+      assert not self.__minimial_dfa
+      self.__dfa = DfaOptimizer.optimize(self.minimal_dfa(), log)
+      self.__minimial_dfa = None

     def minimal_dfa(self):
       if not self.__minimial_dfa:
@@ -320,7 +322,7 @@ class RuleProcessor(object):
         else:
           assert subgraph == 'default', 'unimplemented'
           graph = NfaBuilder.join_subgraph(
-            graph, transition, rule_map[transition])
+            graph, rule_map[transition])
         graphs.append(graph)
       graph = NfaBuilder.or_terms(graphs)
       rule_map[subgraph] = graph


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