Revision: 17849
Author:   [email protected]
Date:     Mon Nov 18 18:42:04 2013 UTC
Log:      Experimental parser: inline rules

[email protected]

BUG=

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

Modified:
 /branches/experimental/parser/tools/lexer_generator/code_generator.jinja
 /branches/experimental/parser/tools/lexer_generator/code_generator.py
 /branches/experimental/parser/tools/lexer_generator/code_generator_test.py
 /branches/experimental/parser/tools/lexer_generator/generator.py

=======================================
--- /branches/experimental/parser/tools/lexer_generator/code_generator.jinja Mon Nov 18 16:22:04 2013 UTC +++ /branches/experimental/parser/tools/lexer_generator/code_generator.jinja Mon Nov 18 18:42:04 2013 UTC
@@ -53,13 +53,22 @@
 {%- endmacro -%}


-{%- macro do_dfa_state(state) -%}
+{%- macro do_dfa_state(node_number, inline) -%}

-  {%- if start_node_number == state.node_number %}
-    code_start:
-  {% else %}
-    code_{{state.node_number}}:
-  {% endif %}
+  {%- set state = dfa_states[node_number] -%}
+
+  {%- if not inline -%}
+    {%- if state['inline'] -%}
+      bad generated code for {{node_number}}
+    {%- endif -%}
+    {%- if start_node_number == node_number -%}
+      code_start:
+    {%- else -%}
+      code_{{node_number}}:
+    {%- endif -%}
+  {%- else -%}
+    // inlined state {{node_number}}
+  {%- endif %}

   {% if debug_print %}
     fprintf(stderr, "state {{state.node_number}}\n");
@@ -72,13 +81,17 @@

   {%- if debug_print %}
     fprintf(stderr, "char at hand is %c (%d)\n", yych, yych);
-  {% endif %}
+  {% endif -%}

-  // matchers
-  {%- for match_key, match_state in state.transitions %}
-    if ({{do_key(match_key)}}) {
-      FORWARD();
-      goto code_{{match_state}};
+  {%- for key, transition_state_id in state.transitions %}
+ {%- set inline_transition = dfa_states[transition_state_id]['inline'] -%}
+    if ({{do_key(key)}}) {
+        FORWARD();
+      {%- if inline_transition %}
+        {{ do_dfa_state(transition_state_id, True) }}
+      {% else %}
+        goto code_{{transition_state_id}};
+      {% endif %}
     }
   {% endfor -%}

@@ -142,7 +155,10 @@

 {# first node is start node #}
 {% for dfa_state in dfa_states -%}
-  {{ do_dfa_state(dfa_state) }}
+  {%- set inline = dfa_state['inline'] -%}
+  {%- if not inline %}
+    {{ do_dfa_state(dfa_state['node_number'], False) }}
+  {%- endif -%}
 {%- endfor %}

   // Should never fall off the edge.
=======================================
--- /branches/experimental/parser/tools/lexer_generator/code_generator.py Mon Nov 18 12:39:46 2013 UTC +++ /branches/experimental/parser/tools/lexer_generator/code_generator.py Mon Nov 18 18:42:04 2013 UTC
@@ -33,8 +33,13 @@

 class CodeGenerator:

-  def __init__(self, rule_processor, use_mdfa, debug_print = False):
-    if use_mdfa:
+  def __init__(self,
+               rule_processor,
+               minimize_default = True,
+               inline = True,
+               debug_print = False,
+               log = False):
+    if minimize_default:
       dfa = rule_processor.default_automata().minimal_dfa()
     else:
       dfa = rule_processor.default_automata().dfa()
@@ -42,6 +47,8 @@
     self.__default_action = rule_processor.default_action
     self.__debug_print = debug_print
     self.__start_node_number = self.__dfa.start_state().node_number()
+    self.__log = log
+    self.__inline = inline

   def __state_cmp(self, left, right):
     if left['original_node_number'] == self.__start_node_number:
@@ -109,7 +116,7 @@
       'original_node_number' : state.node_number(),
       'transitions' : transitions,
       'disjoint_keys' : keys,
-      'inline' : False,
+      'inline' : None,
       'depth' : None,
       'action' : action,
       'entry_action' : entry_action,
@@ -125,6 +132,15 @@
     for (k, transition_node) in state['transitions']:
       CodeGenerator.__compute_depths(transition_node, depth + 1, id_map)

+  @staticmethod
+  def __set_inline(count, state):
+    assert state['inline'] == None
+    inline = False
+    if not state['transitions']:
+      inline = True
+    state['inline'] = inline
+    return count + 1 if inline else count
+
   def __canonicalize_traversal(self):
     dfa_states = []
self.__dfa.visit_all_states(lambda state, acc: dfa_states.append(state))
@@ -140,16 +156,21 @@
     for state in dfa_states:
       state['transitions'] = map(f, state['transitions'])
     assert id_map[self.__start_node_number]['node_number'] == 0
+    assert len(dfa_states) == self.__dfa.node_count()
+    # set nodes to inline
+    if self.__inline:
+      inlined = reduce(CodeGenerator.__set_inline, dfa_states, 0)
+      if self.__log:
+        print "inlined %s" % inlined
+    elif self.__log:
+      print "no inlining"
     self.__dfa_states = dfa_states

   def process(self):

     self.__canonicalize_traversal()

-    start_node_number = self.__start_node_number
     dfa_states = self.__dfa_states
-    assert len(dfa_states) == self.__dfa.node_count()
-    assert dfa_states[0]['node_number'] == 0

     default_action = self.__default_action
     assert(default_action and default_action.match_action())
=======================================
--- /branches/experimental/parser/tools/lexer_generator/code_generator_test.py Mon Nov 18 07:52:02 2013 UTC +++ /branches/experimental/parser/tools/lexer_generator/code_generator_test.py Mon Nov 18 18:42:04 2013 UTC
@@ -40,4 +40,4 @@
     "foo"         <|{FOO}|>
     eof           <|terminate|>
     default_action <{DEFAULT}>'''
-    CodeGenerator(RuleProcessor.parse(rules), False)
+    CodeGenerator(RuleProcessor.parse(rules))
=======================================
--- /branches/experimental/parser/tools/lexer_generator/generator.py Mon Nov 18 07:52:02 2013 UTC +++ /branches/experimental/parser/tools/lexer_generator/generator.py Mon Nov 18 18:42:04 2013 UTC
@@ -99,6 +99,7 @@
   parser.add_argument('--code')
   parser.add_argument('--no-minimize-default', action='store_true')
   parser.add_argument('--no-verify-default', action='store_true')
+  parser.add_argument('--no-inline', action='store_true')
   parser.add_argument('--verbose', action='store_true')
   parser.add_argument('--debug-code', action='store_true')
   args = parser.parse_args()
@@ -133,8 +134,10 @@
   code_file = args.code
   if code_file:
     code_generator = CodeGenerator(rule_processor,
-                                   minimize_default,
-                                   args.debug_code)
+                                   minimize_default = minimize_default,
+                                   log = verbose,
+                                   inline = not args.no_inline,
+                                   debug_print = args.debug_code)
     code = code_generator.process()
     with open(code_file, 'w') as f:
       f.write(code)

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