#python #nom #parser #programs #comments #complete

bin+lib python-parser

基于 nom 的完整 Python 解析器

2 个不稳定版本

使用旧的 Rust 2015

0.2.0 2020年9月9日
0.1.0 2018年6月17日

解析器实现 中排名 #2369

每月下载量:23 次
3 crate 中使用

GPL-3.0+

235KB
6K SLoC

rust-python-parser

Rust 库和程序的 Python 解析器。

目前支持 Python 3.8 的语法(除类型注释外,类型注释像普通注释一样被忽略)


lib.rs:

基于 nom 的 Python 解析器,附带一些实用工具。

恐慌

从不(除了栈溢出)。

数字

Python 的整数字面量可能非常大。这得益于 num_bigint crate。禁用 bigint 功能将回退到 u64

字符串编码

ast::PyString 如果启用 wtf8 功能(默认),则使用 WTF8 编码,允许完全支持 Python 的字符串字面量。

如果该功能被禁用,它们默认为常规 Rust 字符串。注意,如果没有启用 wtf8 功能,一些有效的字符串字面量将被错误地解析(丢失字符)。

Python 版本支持

目前支持 Python 3.7 的语法(以及 Python 3.8 一直到 2018-09-22)。

示例

use python_parser::ast::*;
let code = "print(2 + 3, fd=sys.stderr)";
let ast = python_parser::file_input(python_parser::make_strspan(code))
          .unwrap()
          .1;
assert_eq!(ast,
    vec![
        Statement::Assignment(
            vec![
                Expression::Call(
                    Box::new(Expression::Name("print".to_string())),
                    vec![
                        Argument::Positional(
                            Expression::Bop(
                                Bop::Add,
                                Box::new(Expression::Int(2u32.into())),
                                Box::new(Expression::Int(3u32.into())),
                            )
                        ),
                        Argument::Keyword(
                            "fd".to_string(),
                            Expression::Attribute(
                                Box::new(Expression::Name("sys".to_string())),
                                "stderr".to_string(),
                            )
                        ),
                    ]
                ),
            ],
            vec![],
        )
    ]
);

依赖项

~1–1.4MB
~25K SLoC