2 unstable releases

Uses old Rust 2015

0.2.0 Sep 9, 2020
0.1.0 Jun 17, 2018

#2353 in Parser implementations

Download history 53/week @ 2024-07-27 3/week @ 2024-08-03 6/week @ 2024-08-17 1/week @ 2024-08-24 46/week @ 2024-09-21 255/week @ 2024-09-28 15/week @ 2024-10-05 22/week @ 2024-10-12 8/week @ 2024-10-19 4/week @ 2024-10-26 241/week @ 2024-11-09

254 downloads per month
Used in 3 crates

GPL-3.0+

235KB
6K SLoC

rust-python-parser

A Python parser for Rust libraries and programs.

Currently supports Python 3.8's syntax (except type comments, which are ignored like regular comments)


lib.rs:

A Python parser based on nom, plus some utilities.

Panics

Never (except stack overflows).

Numbers

Python's integer literals may be arbitrary large. This is supported thanks to the num_bigint crate. Disable the bigint feature to fall back to u64.

String encoding

ast::PyStrings are WTF8-encoded if the wtf8 feature is enabled (the default) allowing full support for Python's string literals.

If that feature is disabled, they default to regular Rust strings. Note that without the wtf8 feature, some valid string literals will be badly parsed (missing characters).

Python version support

Currently supports Python 3.7's syntax (and Python 3.8 up to 2018-09-22).

Example

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![],
        )
    ]
);

Dependencies

~1–1.3MB
~24K SLoC