Revision: 17617
Author:   [email protected]
Date:     Mon Nov 11 12:28:48 2013 UTC
Log:      Experimental parser: add break instruction

[email protected]

BUG=

Review URL: https://codereview.chromium.org/68343006
http://code.google.com/p/v8/source/detail?r=17617

Modified:
 /branches/experimental/parser/tools/lexer_generator/generator.py
 /branches/experimental/parser/tools/lexer_generator/nfa.py

=======================================
--- /branches/experimental/parser/tools/lexer_generator/generator.py Mon Nov 11 07:52:15 2013 UTC +++ /branches/experimental/parser/tools/lexer_generator/generator.py Mon Nov 11 12:28:48 2013 UTC
@@ -96,11 +96,14 @@
         action = code if code else default_code
         if action:
           graph = NfaBuilder.add_action(graph, (precedence, action))
-        if transition == 'continue':
+        if not transition:
+          pass
+        elif transition == 'continue':
           assert not k == 'default'
           graph = NfaBuilder.add_continue(graph)
         elif transition == 'break':
-          pass
+          assert code
+          graph = NfaBuilder.add_break(graph)
         elif (transition == 'terminate' or
               transition == 'terminate_illegal'):
           assert not code
=======================================
--- /branches/experimental/parser/tools/lexer_generator/nfa.py Mon Nov 11 07:52:15 2013 UTC +++ /branches/experimental/parser/tools/lexer_generator/nfa.py Mon Nov 11 12:28:48 2013 UTC
@@ -221,6 +221,14 @@
     end.add_epsilon_transition(state['start_node'])
     return (start, ends)

+  def __break(self, graph):
+    (start, ends) = self.__process(graph[1])
+    self.__peek_state()['unpatched_ends'] += ends
+    new_end = self.__new_state()
+    for end in ends:
+      end.add_epsilon_transition(new_end)
+    return (start, [new_end])
+
   def __join(self, graph):
     (graph, name, subgraph, modifier) = graph[1:]
     subgraphs = self.__peek_state()['subgraphs']
@@ -254,6 +262,7 @@
     self.__states.append({
       'start_node' : None,
       'subgraphs' : {},
+      'unpatched_ends' : [],
     })

   def __pop_state(self):
@@ -273,6 +282,10 @@
     for k, subgraph in state['subgraphs'].items():
       subgraph[1].close(None)
     end =  self.__new_state()
+    if self.__states:
+      self.__peek_state()['unpatched_ends'] += state['unpatched_ends']
+    else:
+      self.__patch_ends(state['unpatched_ends'], end)
     self.__patch_ends(ends, end)
     return (start, end, self.__node_number - start_node_number)

@@ -289,6 +302,10 @@
   def add_continue(graph):
     return ('CONTINUE', graph)

+  @staticmethod
+  def add_break(graph):
+    return ('BREAK', graph)
+
   @staticmethod
   def join_subgraph(graph, name, subgraph, modifier):
     if modifier:

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