Reviewers: marja,

Message:
Committed patchset #1 manually as r17670 (presubmit successful).

Description:
Experimental parser: move code gen to own class

[email protected]

BUG=

Committed: https://code.google.com/p/v8/source/detail?r=17670

Please review this at https://codereview.chromium.org/66333008/

SVN Base: https://v8.googlecode.com/svn/branches/experimental/parser

Affected files (+20, -63 lines):
  M tools/lexer_generator/dfa.py
  M tools/lexer_generator/generator.py
  M tools/lexer_generator/transition_keys.py


Index: tools/lexer_generator/dfa.py
diff --git a/tools/lexer_generator/dfa.py b/tools/lexer_generator/dfa.py
index 08ed64ffb9af3e5bec3c1b880fb7a31f697b50cc..36fca00b24327509a1593cece97f61db74d1bced 100644
--- a/tools/lexer_generator/dfa.py
+++ b/tools/lexer_generator/dfa.py
@@ -56,39 +56,6 @@ class DfaState(AutomatonState):
   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 @@ class Dfa(Automaton):
     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 @@ class Dfa(Automaton):

   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
Index: tools/lexer_generator/generator.py
diff --git a/tools/lexer_generator/generator.py b/tools/lexer_generator/generator.py index 92a440d98ddfa79cf0d972a535f8a20b4c1fefec..618d4f96f038c8d49d4dad0b5b74c35737d5d7ad 100644
--- a/tools/lexer_generator/generator.py
+++ b/tools/lexer_generator/generator.py
@@ -30,6 +30,7 @@ from nfa import Nfa
 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 @@ class Generator(object):

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

 if __name__ == '__main__':

Index: tools/lexer_generator/transition_keys.py
diff --git a/tools/lexer_generator/transition_keys.py b/tools/lexer_generator/transition_keys.py index bbdf45e3d1705ab153bb0ca151b22a5a67408006..f3c80fce6992ac2591de13ac51da64378c059d1f 100644
--- a/tools/lexer_generator/transition_keys.py
+++ b/tools/lexer_generator/transition_keys.py
@@ -190,25 +190,19 @@ class TransitionKey:
   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 @@ class TransitionKey:
   @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