add pos_arg ::= expr to make params of fns clear

This commit is contained in:
rocky
2016-05-10 18:05:25 -04:00
parent 8a66fd0be3
commit b134d08e91
4 changed files with 49 additions and 39 deletions

View File

@@ -435,6 +435,9 @@ class PythonParser(GenericASTBuilder):
exprlist ::= exprlist expr exprlist ::= exprlist expr
exprlist ::= expr exprlist ::= expr
# Positional arguments in make_function
pos_arg ::= expr
nullexprlist ::= nullexprlist ::=
expr32 ::= expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr32 ::= expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr

View File

@@ -337,7 +337,7 @@ class Python2Parser(PythonParser):
''' '''
def add_custom_rules(self, tokens, customize): def add_custom_rules(self, tokens, customize):
""" '''
Special handling for opcodes that take a variable number Special handling for opcodes that take a variable number
of arguments -- we add a new rule for each: of arguments -- we add a new rule for each:
@@ -354,7 +354,7 @@ class Python2Parser(PythonParser):
expr ::= expr {expr}^n CALL_FUNCTION_VAR_n POP_TOP expr ::= expr {expr}^n CALL_FUNCTION_VAR_n POP_TOP
expr ::= expr {expr}^n CALL_FUNCTION_VAR_KW_n POP_TOP expr ::= expr {expr}^n CALL_FUNCTION_VAR_KW_n POP_TOP
expr ::= expr {expr}^n CALL_FUNCTION_KW_n POP_TOP expr ::= expr {expr}^n CALL_FUNCTION_KW_n POP_TOP
""" '''
for k, v in list(customize.items()): for k, v in list(customize.items()):
# avoid adding the same rule twice to this parser # avoid adding the same rule twice to this parser
if k in self.customized: if k in self.customized:
@@ -375,7 +375,7 @@ class Python2Parser(PythonParser):
# rule = 'dup_topx ::= ' + 'expr '*v + k # rule = 'dup_topx ::= ' + 'expr '*v + k
elif op == 'MAKE_FUNCTION': elif op == 'MAKE_FUNCTION':
self.addRule('mklambda ::= %s LOAD_LAMBDA %s' % self.addRule('mklambda ::= %s LOAD_LAMBDA %s' %
('expr '*v, k), nop_func) ('pos_arg '*v, k), nop_func)
rule = 'mkfunc ::= %s LOAD_CONST %s' % ('expr '*v, k) rule = 'mkfunc ::= %s LOAD_CONST %s' % ('expr '*v, k)
elif op == 'MAKE_CLOSURE': elif op == 'MAKE_CLOSURE':
self.addRule('mklambda ::= %s load_closure LOAD_LAMBDA %s' % self.addRule('mklambda ::= %s load_closure LOAD_LAMBDA %s' %

View File

@@ -368,7 +368,7 @@ class Python3Parser(PythonParser):
return 'CALL_FUNCTION_%i' % token.attr return 'CALL_FUNCTION_%i' % token.attr
def custom_build_class_rule(self, opname, i, token, tokens, customize): def custom_build_class_rule(self, opname, i, token, tokens, customize):
""" '''
# Should the first rule be somehow folded into the 2nd one? # Should the first rule be somehow folded into the 2nd one?
build_class ::= LOAD_BUILD_CLASS mkfunc build_class ::= LOAD_BUILD_CLASS mkfunc
LOAD_CLASSNAME {expr}^n CALL_FUNCTION_n+2 LOAD_CLASSNAME {expr}^n CALL_FUNCTION_n+2
@@ -377,7 +377,7 @@ class Python3Parser(PythonParser):
expr expr
call_function call_function
CALL_FUNCTION_3 CALL_FUNCTION_3
""" '''
# FIXME: I bet this can be simplified # FIXME: I bet this can be simplified
# look for next MAKE_FUNCTION # look for next MAKE_FUNCTION
for i in range(i+1, len(tokens)): for i in range(i+1, len(tokens)):
@@ -422,7 +422,7 @@ class Python3Parser(PythonParser):
nak = ( len(opname)-len('CALL_FUNCTION') ) // 3 nak = ( len(opname)-len('CALL_FUNCTION') ) // 3
token.type = self.call_fn_name(token) token.type = self.call_fn_name(token)
rule = ('call_function ::= expr ' rule = ('call_function ::= expr '
+ ('expr ' * args_pos) + ('pos_arg ' * args_pos)
+ ('kwarg ' * args_kw) + ('kwarg ' * args_kw)
+ 'expr ' * nak + token.type) + 'expr ' * nak + token.type)
self.add_unique_rule(rule, token.type, args_pos, customize) self.add_unique_rule(rule, token.type, args_pos, customize)
@@ -432,13 +432,22 @@ class Python3Parser(PythonParser):
Special handling for opcodes that take a variable number Special handling for opcodes that take a variable number
of arguments -- we add a new rule for each: of arguments -- we add a new rule for each:
Python 3.4: Python 3.4+:
listcomp ::= LOAD_LISTCOMP LOAD_CONST MAKE_FUNCTION_0 expr listcomp ::= LOAD_LISTCOMP LOAD_CONST MAKE_FUNCTION_0 expr
GET_ITER CALL_FUNCTION_1 GET_ITER CALL_FUNCTION_1
listcomp ::= {expr}^n LOAD_LISTCOMP MAKE_CLOSURE
GET_ITER CALL_FUNCTION_1
Python < 3.4 Python < 3.4
listcomp ::= LOAD_LISTCOMP MAKE_FUNCTION_0 expr listcomp ::= LOAD_LISTCOMP MAKE_FUNCTION_0 expr
GET_ITER CALL_FUNCTION_1 GET_ITER CALL_FUNCTION_1
setcomp ::= {expr}^n LOAD_SETCOMP MAKE_CLOSURE
GET_ITER CALL_FUNCTION_1
dictcomp ::= LOAD_DICTCOMP MAKE_FUNCTION_0 expr
GET_ITER CALL_FUNCTION_1
# build_class (see load_build_class) # build_class (see load_build_class)
build_list ::= {expr}^n BUILD_LIST_n build_list ::= {expr}^n BUILD_LIST_n
@@ -450,11 +459,11 @@ class Python3Parser(PythonParser):
unpack ::= UNPACK_TUPLE {expr}^n unpack ::= UNPACK_TUPLE {expr}^n
unpack ::= UNPACK_SEQEUENCE {expr}^n unpack ::= UNPACK_SEQEUENCE {expr}^n
mkfunc ::= {expr}^n LOAD_CONST MAKE_FUNCTION_n mkfunc ::= {pos_arg}^n LOAD_CONST MAKE_FUNCTION_n
mklambda ::= {expr}^n LOAD_LAMBDA MAKE_FUNCTION_n mklambda ::= {pos_arg}^n LOAD_LAMBDA MAKE_FUNCTION_n
mkfunc ::= {expr}^n load_closure LOAD_CONST MAKE_FUNCTION_n mkfunc ::= {pos_arg}^n load_closure LOAD_CONST MAKE_FUNCTION_n
listcomp ::= load_closure expr GET_ITER CALL_FUNCTION_1" listcomp ::= load_closure expr GET_ITER CALL_FUNCTION_1
# call_function (see custom_classfunc_rule) # call_function (see custom_classfunc_rule)
""" """
@@ -500,52 +509,49 @@ class Python3Parser(PythonParser):
elif opname_base.startswith('MAKE_FUNCTION'): elif opname_base.startswith('MAKE_FUNCTION'):
self.addRule('mklambda ::= %s LOAD_LAMBDA %s' % self.addRule('mklambda ::= %s LOAD_LAMBDA %s' %
('expr ' * token.attr, opname), nop_func) ('expr ' * token.attr, opname), nop_func)
if self.version >= 3.2: rule = 'mkfunc ::= %sLOAD_CONST %s' % ('expr ' * token.attr, opname)
rule = 'mkfunc ::= %s LOAD_CONST %s' % ('expr ' * token.attr, opname) self.add_unique_rule(rule, opname, token.attr, customize)
self.add_unique_rule(rule, opname, token.attr, customize) if opname.startswith('MAKE_FUNCTION_N'):
if opname.startswith('MAKE_FUNCTION_N'): args_pos = token.attr & 0xff
args_pos = token.attr & 0xff args_kw = (token.attr >> 8) & 0xff
args_kw = (token.attr >> 8) & 0xff rule = ('mkfunc ::= %s %s %s %s' %
rule = ('mkfunc ::= %s %s %s %s' % ('pos_arg ' * args_pos,
('expr ' * args_pos, 'expr ' * args_kw,
'expr ' * args_kw, 'LOAD_CONST ' * 3,
'LOAD_CONST ' * 3, opname))
opname)) else:
else: rule = 'mkfunc ::= %sLOAD_CONST LOAD_CONST %s' % ('pos_arg ' * token.attr, opname)
rule = 'mkfunc ::= %s LOAD_CONST LOAD_CONST %s' % ('expr ' * token.attr, opname) pass
else:
rule = 'mkfunc ::= %s LOAD_CONST %s' % ('expr ' * token.attr, opname)
self.add_unique_rule(rule, opname, token.attr, customize) self.add_unique_rule(rule, opname, token.attr, customize)
pass
elif opname.startswith('MAKE_CLOSURE'): elif opname.startswith('MAKE_CLOSURE'):
self.add_unique_rule('mklambda ::= %s load_closure LOAD_LAMBDA %s' % self.add_unique_rule('mklambda ::= %sload_closure LOAD_LAMBDA %s' %
('expr ' * token.attr, opname), opname, token.attr, ('pos_arg ' * token.attr, opname), opname, token.attr,
customize) customize)
self.add_unique_rule('genexpr ::= %s load_closure ' self.add_unique_rule('genexpr ::= %sload_closure '
'load_genexpr %s ' 'load_genexpr %s '
'expr GET_ITER CALL_FUNCTION_1' % 'expr GET_ITER CALL_FUNCTION_1' %
('expr ' * token.attr, opname), ('pos_arg ' * token.attr, opname),
opname, token.attr, customize) opname, token.attr, customize)
if self.version >= 3.4: if self.version >= 3.4:
self.add_unique_rule('listcomp ::= %s load_closure ' self.add_unique_rule('listcomp ::= %sload_closure '
'LOAD_LISTCOMP LOAD_CONST %s expr ' 'LOAD_LISTCOMP LOAD_CONST %s expr '
'GET_ITER CALL_FUNCTION_1' % 'GET_ITER CALL_FUNCTION_1' %
('expr ' * token.attr, opname), ('expr ' * token.attr, opname),
opname, token.attr, customize) opname, token.attr, customize)
else: else:
self.add_unique_rule('listcomp ::= %s load_closure ' self.add_unique_rule('listcomp ::= %sload_closure '
'LOAD_LISTCOMP %s expr ' 'LOAD_LISTCOMP %s expr '
'GET_ITER CALL_FUNCTION_1' % 'GET_ITER CALL_FUNCTION_1' %
('expr ' * token.attr, opname), ('expr ' * token.attr, opname),
opname, token.attr, customize) opname, token.attr, customize)
self.add_unique_rule('setcomp ::= %s load_closure LOAD_SETCOMP %s expr ' self.add_unique_rule('setcomp ::= %sload_closure LOAD_SETCOMP %s expr '
'GET_ITER CALL_FUNCTION_1' % 'GET_ITER CALL_FUNCTION_1' %
('expr ' * token.attr, opname), ('expr ' * token.attr, opname),
opname, token.attr, customize) opname, token.attr, customize)
self.add_unique_rule('dictcomp ::= %s load_closure LOAD_DICTCOMP %s ' self.add_unique_rule('dictcomp ::= %sload_closure LOAD_DICTCOMP %s '
'expr GET_ITER CALL_FUNCTION_1' % 'expr GET_ITER CALL_FUNCTION_1' %
('expr '* token.attr, opname), ('pos_arg '* token.attr, opname),
opname, token.attr, customize) opname, token.attr, customize)
rule = ('mkfunc ::= %s load_closure LOAD_CONST %s' rule = ('mkfunc ::= %s load_closure LOAD_CONST %s'
@@ -557,7 +563,7 @@ class Python3Parser(PythonParser):
self.add_unique_rule(rule, opname, token.attr, customize) self.add_unique_rule(rule, opname, token.attr, customize)
rule = ('mkfunc ::= %s load_closure load_genexpr %s' rule = ('mkfunc ::= %s load_closure load_genexpr %s'
% ('expr ' * token.attr, opname)) % ('pos_arg ' * token.attr, opname))
self.add_unique_rule(rule, opname, token.attr, customize) self.add_unique_rule(rule, opname, token.attr, customize)
rule = ('mkfunc ::= %s load_closure LOAD_CONST %s' rule = ('mkfunc ::= %s load_closure LOAD_CONST %s'
% ('expr ' * token.attr, opname)) % ('expr ' * token.attr, opname))

View File

@@ -1031,7 +1031,8 @@ class SourceWalker(GenericASTTraversal, object):
self.prune() self.prune()
def listcomprehension_walk3(self, node, iter_index, code_index=-5): def listcomprehension_walk3(self, node, iter_index, code_index=-5):
"""List comprehensions the way they are done in Python3. """
List comprehensions the way they are done in Python3.
They're more other comprehensions, e.g. set comprehensions They're more other comprehensions, e.g. set comprehensions
See if we can combine code. See if we can combine code.
""" """
@@ -1538,6 +1539,7 @@ class SourceWalker(GenericASTTraversal, object):
if default: if default:
if self.showast: if self.showast:
print()
print('--', name) print('--', name)
print(default) print(default)
print('--') print('--')
@@ -1573,7 +1575,6 @@ class SourceWalker(GenericASTTraversal, object):
return return
# build parameters # build parameters
params = [build_param(ast, name, default) for params = [build_param(ast, name, default) for
name, default in zip_longest(paramnames, defparams, fillvalue=None)] name, default in zip_longest(paramnames, defparams, fillvalue=None)]
# params = [ build_param(ast, name, default) for # params = [ build_param(ast, name, default) for