You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-03 16:59:52 +08:00
parse2.py: restore accidently-removed while1stmt rule scanner27.py: grammar typo check_ast: add while1else to list of looping constructs pysource.py: CALL_FUNCTION_VAR_KW_ARGS with positional args rule is different?
27 lines
1.1 KiB
Python
27 lines
1.1 KiB
Python
"""
|
|
Python AST grammar checker.
|
|
|
|
Our rules sometimes give erroneous results. Until we have perfect rules,
|
|
This checker will catch mistakes in decompilation we've made.
|
|
|
|
FIXME idea: extend parsing system to do same kinds of checks or nonterminal
|
|
before reduction and don't reduce when there is a problem.
|
|
"""
|
|
|
|
def checker(ast, in_loop, errors):
|
|
in_loop = in_loop or ast.type in ('while1stmt', 'whileTruestmt',
|
|
'whilestmt', 'whileelsestmt', 'while1elsestmt',
|
|
'for_block')
|
|
if ast.type in ('augassign1', 'augassign2') and ast[0][0] == 'and':
|
|
text = str(ast)
|
|
error_text = '\n# improper augmented assigment (e.g. +=, *=, ...):\n#\t' + '\n# '.join(text.split("\n")) + '\n'
|
|
errors.append(error_text)
|
|
|
|
for node in ast:
|
|
if not in_loop and node.type in ('continue_stmt', 'break_stmt'):
|
|
text = str(node)
|
|
error_text = '\n# not in loop:\n#\t' + '\n# '.join(text.split("\n"))
|
|
errors.append(error_text)
|
|
if hasattr(node, '__repr1__'):
|
|
checker(node, in_loop, errors)
|