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}