Merge pull request #163 from rocky/grammar-cleanup

Grammar cleanup
This commit is contained in:
R. Bernstein
2018-03-25 21:30:50 -04:00
committed by GitHub
3 changed files with 19 additions and 20 deletions

View File

@@ -31,7 +31,7 @@ def test_grammar():
expect_lhs.add('kv3') expect_lhs.add('kv3')
unused_rhs = unused_rhs.union(set(""" unused_rhs = unused_rhs.union(set("""
except_pop_except generator_exp classdefdeco2 except_pop_except generator_exp
dict dict
""".split())) """.split()))
if PYTHON_VERSION >= 3.0: if PYTHON_VERSION >= 3.0:
@@ -39,6 +39,8 @@ def test_grammar():
expect_lhs.add("annotate_tuple") expect_lhs.add("annotate_tuple")
unused_rhs.add("mkfunc_annotate") unused_rhs.add("mkfunc_annotate")
unused_rhs.add('call') unused_rhs.add('call')
unused_rhs.add("dict_comp")
unused_rhs.add("classdefdeco1")
if PYTHON_VERSION < 3.6: if PYTHON_VERSION < 3.6:
# 3.6 has at least one non-custom call rule # 3.6 has at least one non-custom call rule
# the others don't # the others don't

View File

@@ -298,19 +298,8 @@ class Python2Parser(PythonParser):
# The order of opname listed is roughly sorted below # The order of opname listed is roughly sorted below
if opname_base in ('BUILD_LIST', 'BUILD_SET', 'BUILD_TUPLE'): if opname_base in ('BUILD_LIST', 'BUILD_SET', 'BUILD_TUPLE'):
v = token.attr v = token.attr
thousands = (v//1024)
thirty32s = ((v//32) % 32)
if thirty32s > 0:
rule = "expr32 ::=%s" % (' expr' * 32)
self.add_unique_rule(rule, opname_base, v, customize)
self.seen32 = True
if thousands > 0:
self.add_unique_rule("expr1024 ::=%s" % (' expr32' * 32),
opname_base, v, customize)
self.seen1024 = True
collection = opname_base[opname_base.find('_')+1:].lower() collection = opname_base[opname_base.find('_')+1:].lower()
rule = (('%s ::= ' % collection) + 'expr1024 '*thousands + rule = '%s ::= %s%s' % (collection, (token.attr * 'expr '), opname)
'expr32 '*thirty32s + 'expr '*(v % 32) + opname)
self.add_unique_rules([ self.add_unique_rules([
"expr ::= %s" % collection, "expr ::= %s" % collection,
rule], customize) rule], customize)

View File

@@ -83,8 +83,6 @@ class Python3Parser(PythonParser):
stmt ::= dict_comp_func stmt ::= dict_comp_func
dict_comp_func ::= BUILD_MAP_0 LOAD_FAST FOR_ITER store dict_comp_func ::= BUILD_MAP_0 LOAD_FAST FOR_ITER store
comp_iter JUMP_BACK RETURN_VALUE RETURN_LAST comp_iter JUMP_BACK RETURN_VALUE RETURN_LAST
dict_comp ::= LOAD_DICTCOMP LOAD_CONST MAKE_FUNCTION_0 expr
GET_ITER CALL_FUNCTION_1
comp_iter ::= comp_if comp_iter ::= comp_if
comp_iter ::= comp_if_not comp_iter ::= comp_if_not
@@ -124,8 +122,6 @@ class Python3Parser(PythonParser):
stmt ::= classdefdeco stmt ::= classdefdeco
classdefdeco ::= classdefdeco1 store classdefdeco ::= classdefdeco1 store
classdefdeco1 ::= expr classdefdeco1 CALL_FUNCTION_1
classdefdeco1 ::= expr classdefdeco2 CALL_FUNCTION_1
assert ::= assert_expr jmp_true LOAD_ASSERT RAISE_VARARGS_1 COME_FROM assert ::= assert_expr jmp_true LOAD_ASSERT RAISE_VARARGS_1 COME_FROM
@@ -718,6 +714,16 @@ class Python3Parser(PythonParser):
'CALL_FUNCTION_VAR', 'CALL_FUNCTION_VAR',
'CALL_FUNCTION_VAR_KW')) 'CALL_FUNCTION_VAR_KW'))
or opname.startswith('CALL_FUNCTION_KW')): or opname.startswith('CALL_FUNCTION_KW')):
if opname == 'CALL_FUNCTION' and token.attr == 1:
rule = """
dict_comp ::= LOAD_DICTCOMP LOAD_CONST MAKE_FUNCTION_0 expr
GET_ITER CALL_FUNCTION_1
classdefdeco1 ::= expr classdefdeco1 CALL_FUNCTION_1
classdefdeco1 ::= expr classdefdeco2 CALL_FUNCTION_1
"""
self.addRule(rule, nop_func)
self.custom_classfunc_rule(opname, token, customize, self.custom_classfunc_rule(opname, token, customize,
seen_LOAD_BUILD_CLASS, seen_LOAD_BUILD_CLASS,
seen_GET_AWAITABLE_YIELD_FROM, tokens[i+1]) seen_GET_AWAITABLE_YIELD_FROM, tokens[i+1])
@@ -884,9 +890,11 @@ class Python3Parser(PythonParser):
% ('expr ' * args_pos, kwargs_str, opname)) % ('expr ' * args_pos, kwargs_str, opname))
self.add_unique_rule(rule, opname, token.attr, customize) self.add_unique_rule(rule, opname, token.attr, customize)
rule = ('mkfunc ::= %sload_closure load_genexpr %s'
% ('pos_arg ' * args_pos, opname)) if args_kw == 0:
self.add_unique_rule(rule, opname, token.attr, customize) rule = ('mkfunc ::= %sload_closure load_genexpr %s'
% ('pos_arg ' * args_pos, opname))
self.add_unique_rule(rule, opname, token.attr, customize)
if self.version < 3.4: if self.version < 3.4:
rule = ('mkfunc ::= %sload_closure LOAD_CONST %s' rule = ('mkfunc ::= %sload_closure LOAD_CONST %s'