1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
pub mod ast; mod parser { include!(concat!(env!("OUT_DIR"), "/parser.rs")); } pub use lalrpop_util::ParseError; pub use crate::parser::Token; pub struct Parser {} impl Parser { pub fn parse(input: &str) -> Result<ast::Expression, ParseError<usize, Token, &str>> { Ok(*parser::ExpressionParser::new().parse(input)?) } } #[cfg(test)] mod tests { use super::*; use crate::ast::{Expression, OpCode}; #[test] fn literal() { assert_eq!(Parser::parse("1"), Ok(Expression::Number(1.0))); } #[test] fn binary_expression() { assert_eq!( Parser::parse("1+2"), Ok(Expression::BinaryOperation { operation: OpCode::Add, left: Box::new(Expression::Number(1.0)), right: Box::new(Expression::Number(2.0)), }), ); } #[test] fn binary_expression_whitespace() { assert_eq!(Parser::parse("1 + 2 "), Parser::parse("1+2"),); } }