[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/coolreader18/RustPython/let-chains/crawl_sourcecode.py [Back]  [Original]

"""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 sys
import symtable
import dis

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)

Web Proxy Viewer  |  New URL  |  Original Page