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.