Revision: 17670
Author:   [email protected]
Date:     Tue Nov 12 18:47:52 2013 UTC
Log:      Experimental parser: move code gen to own class

[email protected]

BUG=

Review URL: https://codereview.chromium.org/66333008
http://code.google.com/p/v8/source/detail?r=17670

Modified:
 /branches/experimental/parser/tools/lexer_generator/dfa.py
 /branches/experimental/parser/tools/lexer_generator/generator.py
 /branches/experimental/parser/tools/lexer_generator/transition_keys.py

=======================================
--- /branches/experimental/parser/tools/lexer_generator/dfa.py Tue Nov 12 16:33:57 2013 UTC +++ /branches/experimental/parser/tools/lexer_generator/dfa.py Tue Nov 12 18:47:52 2013 UTC
@@ -56,39 +56,6 @@
   def transitions(self):
     return self.__transitions

-  def to_code(self, start_node_number):
-    # FIXME: add different check types (if, switch, lookup table)
-    # FIXME: add action + break / continue
-    # FIXME: add default action
-    code = '''
-code_%s:
- fprintf(stderr, "state %s\\n");''' % (self.node_number(), self.node_number())
-
-    action = self.action()
-    if action:
-      if action[1] == 'terminate':
-        code += 'return 0;'
-        return code
-      elif action[1] == 'terminate_illegal':
-        code += 'return 1;'
-        return code
-
-    code += '''
-    yych = *(++cursor_);
-    fprintf(stderr, "char at hand is %c (%d)\\n", yych, yych);\n'''
-
-    for key, state in self.__transitions.items():
-      code += key.to_code()
-      code += ''' {
-        goto code_%s;
-    }
-''' % state.node_number()
-
-    if action:
- code += '%s\nyych = *(--cursor_);\ngoto code_%s;\n' % (self.action()[1], start_node_number)
-
-    return code
-
 class Dfa(Automaton):

   def __init__(self, start_name, mapping):
@@ -113,12 +80,18 @@
     self.__start = self.__name_map[start_name]
     assert self.__terminal_set

+  def start_state(self):
+    return self.__start
+
   def start_set(self):
     return set([self.__start])

   def terminal_set(self):
     return set(self.__terminal_set)

+  def all_states_iter(self):
+    return iter(self.__name_map.values())
+
   @staticmethod
   def __match_char(state, char):
match = list(state.state_iter(key_filter = lambda k: k.matches_char(char)))
@@ -162,12 +135,3 @@

   def minimize(self):
     pass
-
-  def to_code(self):
-    code = '''
-YYCTYPE yych = *cursor_;
-goto code_%s;
-''' % (self.__start.node_number())
-    for n in self.__name_map.values():
-      code += n.to_code(self.__start.node_number())
-    return code
=======================================
--- /branches/experimental/parser/tools/lexer_generator/generator.py Tue Nov 12 09:47:12 2013 UTC +++ /branches/experimental/parser/tools/lexer_generator/generator.py Tue Nov 12 18:47:52 2013 UTC
@@ -30,6 +30,7 @@
 from nfa_builder import NfaBuilder
 from dfa import Dfa
 from rule_parser import RuleParser, RuleParserState
+from code_generator import CodeGenerator

 file_template = '''
 <html>
@@ -141,7 +142,7 @@

   def generate_code(self):
     (nfa, dfa) = self.__automata['default']
-    return dfa.to_code()
+    return CodeGenerator.dfa_to_code(dfa)

 if __name__ == '__main__':

=======================================
--- /branches/experimental/parser/tools/lexer_generator/transition_keys.py Tue Nov 12 15:31:00 2013 UTC +++ /branches/experimental/parser/tools/lexer_generator/transition_keys.py Tue Nov 12 18:47:52 2013 UTC
@@ -190,25 +190,19 @@
   def __eq__(self, other):
return isinstance(other, self.__class__) and self.__ranges == other.__ranges

-  def to_code(self):
-    code = 'if ('
-    first = True
+  @staticmethod
+  def __class_name(r):
+    for name, v in TransitionKey.__class_bounds.items():
+      if r == v: return name
+    assert False
+
+  def range_iter(self):
+    assert not self == TransitionKey.epsilon() and not self.__is_unique()
     for r in self.__ranges:
-      if r[0] >= 256: # FIXME: add class checks
-        continue
-      if not first:
-        code += ' || '
-      if r[0] == r[1]:
-        code += 'yych == %s' % r[0]
-      elif r[0] == 0:
-        code += 'yych <= %s' % r[1]
- elif r[1] == 255: # FIXME: this should depend on the char type maybe??
-        code += 'yych >= %s' % r[0]
+      if self.__is_class_range(r):
+        yield ('CLASS', TransitionKey.__class_name(r))
       else:
-        code += '(yych >= %s && yych <= %s)' % (r[0], r[1])
-      first = False
-    code += ')'
-    return code
+        yield ('LATIN_1', r)

   __printable_cache = {
     ord('\t') : '\\t',
@@ -219,9 +213,7 @@
   @staticmethod
   def __range_str(r):
     if TransitionKey.__is_class_range(r):
-      for name, v in TransitionKey.__class_bounds.items():
-        if r == v: return name
-      assert False
+      return TransitionKey.__class_name(r)
     def to_str(x):
       assert TransitionKey.__in_latin_1(x)
       if not x in TransitionKey.__printable_cache:

--
--
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