oxide/
lib.rs

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
10// Convenience function to parse source code in one step
11pub 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}