#python #语法树 #AST #访问 #解析

nightly python-ast

将Python编译成Rust的库

17个版本

0.3.1 2024年5月16日
0.3.0 2024年5月13日
0.2.3 2024年1月24日
0.1.12 2024年1月9日
0.1.4 2023年10月28日

#236进程宏

39 每月下载量
用于 2 crates

Apache-2.0

130KB
3.5K SLoC

python-ast-rs

使用Python 3 ast库通过Rust库访问Python AST。因为它依赖于Python本身来解析Python,所以它应该非常接近参考实现。然而,如果语法树有重大变化,底层Python语言的变化可能会阻止它完全工作。

此项目处于非常早期阶段,应被视为完全不稳定的。

用法

将Python文件读入AST的操作如下

use python_ast::parse;

fn read_python_file(input: std::path::Path) {
    let py = read_to_string(input).unwrap();
    let ast = parse(&py, "mod_name.py").unwrap();

    println!("{:?}", ast);
}

您还可以使用CodeGen trait将Python代码转换为Rust代码。请注意,此功能极其不稳定且为实验性质。

use python_ast::{parse, CodeGen, CodeGenContext, PythonOptions, SymbolTableScopes};

fn read_python_file(input: std::path::Path) {
    let py = read_to_string(input).unwrap();
    let ast = parse(&py, "mod_name.py").unwrap();

    let rust = ast.to_rust(Context::Module("mod_name".to_string(), PythonOptions::default(), SymbolTableScopes::new())).unwrap();

    println!("{}", rust);
}

注意事项

此项目的目标是创建一个尽可能接近参考语言的完全编译的Python样语言,同时具有Rust的静态类型和无需担心的并发优势。目前,最好将其视为一个概念验证,而不是一个可行的工具,但我希望这会改变。

依赖项

~7–13MB
~148K SLoC