Skip to main content

reqlang_expr/
parser.rs

1//! Parsing source code in to expressions
2
3use 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
14/// Parse source code in to an [`ast::Expr`].
15pub 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}