1pub mod ast;
4pub mod error;
5pub mod lexer;
6pub mod parser;
7pub mod span;
8pub mod token;
9
10use chumsky::Parser;
11
12pub fn parse(source: &str) -> error::ParseResult<ast::Statement> {
17 let (tokens, lex_errors) = lexer::Lexer::new(source).lex();
18
19 let mut errors: Vec<error::ParseError> = lex_errors
20 .into_iter()
21 .map(|e| error::ParseError {
22 span: e.span,
23 message: e.message,
24 expected: vec![],
25 found: None,
26 label: None,
27 })
28 .collect();
29
30 let len = source.len();
31 let stream = chumsky::Stream::from_iter(
32 len..len + 1,
33 tokens
34 .into_iter()
35 .filter(|(tok, _)| !matches!(tok, token::Token::Eof)),
36 );
37
38 let (ast, parse_errors) = parser::statement::statement_parser().parse_recovery(stream);
39
40 errors.extend(
41 parse_errors
42 .into_iter()
43 .map(error::ParseError::from_chumsky),
44 );
45
46 error::ParseResult {
47 ast: ast.map(|(stmt, _span)| stmt),
48 errors,
49 }
50}