1use lalrpop_util::lalrpop_mod;
4
5use crate::{
6 ast::{self, add_type_to_expr_parse},
7 errors::{ExprResult, SyntaxError},
8 lexer::lex,
9 parser::grammar::ExprParser,
10};
11
12lalrpop_mod!(grammar);
13
14pub fn parse(source: &str) -> ExprResult<ast::Expr> {
16 let tokens = lex(source);
17
18 let mut errs = vec![];
19
20 let expr_parser = ExprParser::new();
21
22 let mut parser_errors = Vec::new();
23
24 let mut expr = match expr_parser.parse(source, &mut parser_errors, tokens) {
25 Ok(ast) => ast,
26 Err(err) => {
27 errs.push(SyntaxError::from_parser_error(err, source));
28 ast::Expr::Error
29 }
30 };
31
32 add_type_to_expr_parse(&mut expr);
33
34 errs.extend(parser_errors);
35
36 if errs.is_empty() { Ok(expr) } else { Err(errs) }
37}