"""This script can be used to test the equivalence in parsing between rustpython and cpython. Usage example: $ python crawl_sourcecode.py crawl_sourcecode.py > cpython.txt $ cargo run crawl_sourcecode.py crawl_sourcecode.py > rustpython.txt $ diff cpython.txt rustpython.txt """ import ast import dis import symtable import sys filename = sys.argv[1] print("Crawling file:", filename) with open(filename, "r") as f: source = f.read() t = ast.parse(source) print(t) shift = 3 def print_node(node, indent=0): indents = " " * indent if isinstance(node, ast.AST): lineno = "row={}".format(node.lineno) if hasattr(node, "lineno") else "" print(indents, "NODE", node.__class__.__name__, lineno) for field in node._fields: print(indents, "-", field) f = getattr(node, field) if isinstance(f, list): for f2 in f: print_node(f2, indent=indent + shift) else: print_node(f, indent=indent + shift) else: print(indents, "OBJ", node) print_node(t) # print(ast.dump(t)) flag_names = [ "is_referenced", "is_assigned", "is_global", "is_local", "is_parameter", "is_free", ] def print_table(table, indent=0): indents = " " * indent print(indents, "table:", table.get_name()) print(indents, " ", "name:", table.get_name()) print(indents, " ", "type:", table.get_type()) print(indents, " ", "line:", table.get_lineno()) print(indents, " ", "identifiers:", table.get_identifiers()) print(indents, " ", "Syms:") for sym in table.get_symbols(): flags = [] for flag_name in flag_names: func = getattr(sym, flag_name) if func(): flags.append(flag_name) print(indents, " sym:", sym.get_name(), "flags:", " ".join(flags)) if table.has_children(): print(indents, " ", "Child tables:") for child in table.get_children(): print_table(child, indent=indent + shift) table = symtable.symtable(source, "a", "exec") print_table(table) print() print("======== dis.dis ========") print() co = compile(source, filename, "exec") dis.dis(co)