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.