Skip to main content

kyu_parser/
lib.rs

1//! kyu-parser: chumsky lexer + Cypher parser -> AST.
2
3pub mod ast;
4pub mod error;
5pub mod lexer;
6pub mod parser;
7pub mod span;
8pub mod token;
9
10use chumsky::Parser;
11
12/// Parse a Cypher query string into an AST.
13///
14/// Returns the AST (if parsing succeeded or error recovery produced a partial
15/// result) and all collected errors.
16pub 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}