You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-03 00:45:53 +08:00
30 lines
1.2 KiB
Python
30 lines
1.2 KiB
Python
"""
|
|
Python parse tree 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):
|
|
if ast is None:
|
|
return
|
|
in_loop = (in_loop or (ast.kind in ('while1stmt', 'whileTruestmt',
|
|
'whilestmt', 'whileelsestmt', 'while1elsestmt',
|
|
'for_block'))
|
|
or ast.kind.startswith('async_for'))
|
|
if ast.kind in ('aug_assign1', 'aug_assign2') 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.kind in ('continue', 'break'):
|
|
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)
|