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.

Reply via email to