py_ast/
lib.rs

1#![feature(let_chains)]
2
3mod macros;
4pub mod parse;
5pub mod semantic;
6
7use py_ir as ir;
8
9#[cfg(test)]
10fn parse_test(
11    chars: &str,
12    tester: impl FnOnce(&mut terl::Parser<py_lex::Token>) -> terl::Result<(), terl::ParseError>,
13) {
14    use terl::{Buffer, ResultMapperExt, Source};
15
16    let source = Buffer::new("test.py1".to_string(), chars.chars().collect());
17    let parser = terl::Parser::<char>::new(source);
18    let (char_buffer, mut parser) = parser
19        .process(|p| {
20            let mut tokens = vec![];
21
22            while let Some(token) = p.parse::<py_lex::Token>().apply(terl::mapper::Try)? {
23                tokens.push(token);
24            }
25            Ok(tokens)
26        })
27        .unwrap_or_else(|_| unreachable!());
28
29    if let Err(error) = tester(&mut parser) {
30        let calling_tree = parser.calling_tree();
31        eprintln!("{calling_tree}");
32        eprintln!("error: {:?}", error);
33        let error = py_lex::Token::handle_error(&(&char_buffer, parser.buffer()), error.error());
34        eprintln!("{error}");
35        panic!("panic as expected")
36    }
37}