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.