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.