Reviewers: marja,

Message:
Committed patchset #1 manually as r17617.

Description:
Experimental parser: add break instruction

[email protected]

BUG=

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

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

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

Affected files (+22, -2 lines):
  M tools/lexer_generator/generator.py
  M tools/lexer_generator/nfa.py


Index: tools/lexer_generator/generator.py
diff --git a/tools/lexer_generator/generator.py b/tools/lexer_generator/generator.py index f96019543e31171ef43d4361d6494dbecca266f3..7f929cd14bfd7e1b508ddf977c43ea81bb40793f 100644
--- a/tools/lexer_generator/generator.py
+++ b/tools/lexer_generator/generator.py
@@ -96,11 +96,14 @@ class Generator(object):
         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
Index: tools/lexer_generator/nfa.py
diff --git a/tools/lexer_generator/nfa.py b/tools/lexer_generator/nfa.py
index e818a7da5cb6b8300b691ca2c1488bb0f938b04e..30fade56de7c400184e8621bd34d53264e9cdffa 100644
--- a/tools/lexer_generator/nfa.py
+++ b/tools/lexer_generator/nfa.py
@@ -221,6 +221,14 @@ class NfaBuilder:
     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 @@ class NfaBuilder:
     self.__states.append({
       'start_node' : None,
       'subgraphs' : {},
+      'unpatched_ends' : [],
     })

   def __pop_state(self):
@@ -273,6 +282,10 @@ class NfaBuilder:
     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)

@@ -290,6 +303,10 @@ class NfaBuilder:
     return ('CONTINUE', graph)

   @staticmethod
+  def add_break(graph):
+    return ('BREAK', graph)
+
+  @staticmethod
   def join_subgraph(graph, name, subgraph, modifier):
     if modifier:
       modifier = NfaBuilder.__modifer_map[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