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.