1pub mod lexer;
2pub mod parser;
3
4pub use lexer::{LexError, Lexer, Token};
5pub use parser::{
6 BinaryOp, Expr, ParseError, ParseErrors, Parser, Program, Stmt, UnaryOp, parse_source,
7 parse_tokens,
8};
9
10pub fn compile(source: &str) -> Result<Program, Box<dyn std::error::Error>> {
12 match parse_source(source) {
13 Ok(program) => Ok(program),
14 Err(errors) => Err(Box::new(errors)),
15 }
16}
17
18#[cfg(test)]
19mod tests {
20 use super::*;
21
22 #[test]
23 fn test_full_pipeline() {
24 let source = "let x = 5 + 3 * 2; let y = -x;";
25 let program = compile(source).unwrap();
26
27 assert_eq!(program.statements.len(), 2);
28 }
29
30 #[test]
31 fn test_parse_source_convenience() {
32 let source = "let hello = 42;";
33 let program = parse_source(source).unwrap();
34
35 assert_eq!(program.statements.len(), 1);
36 match &program.statements[0] {
37 Stmt::Let { name, value } => {
38 assert_eq!(name, "hello");
39 assert_eq!(*value, Expr::Number(42));
40 }
41 _ => panic!("Expected let statement"),
42 }
43 }
44}