Revision: 19167
Author: [email protected]
Date: Thu Feb 6 16:38:00 2014 UTC
Log: Experimental parser: better rule tree visualization
[email protected]
BUG=
Review URL: https://codereview.chromium.org/145723010
http://code.google.com/p/v8/source/detail?r=19167
Modified:
/branches/experimental/parser/tools/lexer_generator/nfa_builder.py
/branches/experimental/parser/tools/lexer_generator/regex_parser.py
=======================================
--- /branches/experimental/parser/tools/lexer_generator/nfa_builder.py Tue
Feb 4 11:58:53 2014 UTC
+++ /branches/experimental/parser/tools/lexer_generator/nfa_builder.py Thu
Feb 6 16:38:00 2014 UTC
@@ -59,10 +59,11 @@
self.__global_end_node = self.__new_state()
return self.__global_end_node
- def __or(self, left, right):
+ def __or(self, *trees):
start = self.__new_state()
ends = []
- for (sub_start, sub_end) in [self.__process(left),
self.__process(right)]:
+ for tree in trees:
+ (sub_start, sub_end) = self.__process(tree)
start.add_epsilon_transition(sub_start)
ends += sub_end
start.close(None)
@@ -110,17 +111,28 @@
midpoints.append(midpoint)
return (start, ends + midpoints)
- def __cat(self, left_tree, right_tree):
- (left, right) = (self.__process(left_tree), self.__process(right_tree))
- self.__patch_ends(left[1], right[0])
- return (left[0], right[1])
+ def __cat(self, *trees):
+ (start, ends) = (None, None)
+ for tree in trees:
+ (sub_start, sub_ends) = self.__process(tree)
+ if start == None:
+ start = sub_start
+ else:
+ assert sub_ends, "this creates unreachable nodes"
+ self.__patch_ends(ends, sub_start)
+ ends = sub_ends
+ return (start, ends)
def __key_state(self, key):
state = self.__new_state()
state.add_unclosed_transition(key)
return (state, [state])
- def __literal(self, char):
+ def __literal(self, chars):
+ terms = map(lambda c : Term('SINGLE_CHAR', c), chars)
+ return self.__process(self.cat_terms(terms))
+
+ def __single_char(self, char):
return self.__key_state(
TransitionKey.single_char(self.__encoding, char))
@@ -285,11 +297,13 @@
@staticmethod
def or_terms(terms):
- return reduce(lambda acc, g: Term('OR', acc, g), terms)
+ if len(terms) == 1: return terms[0]
+ return Term('OR', *terms) if terms else Term.empty()
@staticmethod
def cat_terms(terms):
- return reduce(lambda acc, g: Term('CAT', acc, g), terms)
+ if len(terms) == 1: return terms[0]
+ return Term('CAT', *terms) if terms else Term.empty()
__modifer_map = {
'+': 'ONE_OR_MORE',
=======================================
--- /branches/experimental/parser/tools/lexer_generator/regex_parser.py Tue
Feb 4 11:58:53 2014 UTC
+++ /branches/experimental/parser/tools/lexer_generator/regex_parser.py Thu
Feb 6 16:38:00 2014 UTC
@@ -171,7 +171,7 @@
p[0] = self.__cat(p[1], p[2])
def p_fragment(self, p):
- '''fragment : literal maybe_modifier
+ '''fragment : literal_array maybe_modifier
| class maybe_modifier
| group maybe_modifier
| any maybe_modifier
@@ -202,9 +202,22 @@
else:
p[0] = ("REPEAT", p[2], p[4])
- def p_literal(self, p):
- '''literal : LITERAL'''
- p[0] = Term('LITERAL', p[1])
+ def p_literal_array(self, p):
+ '''literal_array : literals'''
+ p[0] = Term('LITERAL', ''.join(reversed(p[1])))
+
+ def p_literals(self, p):
+ '''literals : LITERAL maybe_literals'''
+ if not p[2]:
+ p[0] = [p[1]]
+ else:
+ p[2].append(p[1])
+ p[0] = p[2]
+
+ def p_maybe_literals(self, p):
+ '''maybe_literals : literals
+ | empty'''
+ p[0] = p[1]
def p_any(self, p):
'''any : ANY'''
--
--
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.