1pub mod error;
3pub mod grammar;
4#[allow(clippy::needless_lifetimes)]
5pub mod grammar_trait;
6pub mod parser;
7pub mod tree;
8
9use eure_tree::Cst;
10pub use parol_runtime;
11
12pub use error::{EureParseError, ParseErrorKind};
13pub use parol_runtime::parser::parse_tree_type::TreeConstruct;
14use tree::CstBuilder;
15
16#[derive(Debug)]
18pub enum ParseResult {
19 Ok(Cst),
21 ErrWithCst { cst: Cst, error: EureParseError },
23}
24
25impl ParseResult {
26 pub fn cst(self) -> Cst {
28 match self {
29 ParseResult::Ok(cst) => cst,
30 ParseResult::ErrWithCst { cst, .. } => cst,
31 }
32 }
33
34 pub fn error(&self) -> Option<&EureParseError> {
36 match self {
37 ParseResult::Ok(_) => None,
38 ParseResult::ErrWithCst { error, .. } => Some(error),
39 }
40 }
41
42 pub fn is_ok(&self) -> bool {
44 matches!(self, ParseResult::Ok(_))
45 }
46}
47
48pub fn parse(input: &str) -> Result<Cst, EureParseError> {
49 let mut actions = grammar::Grammar::new();
50 let mut tree_builder = CstBuilder::new();
51 parser::parse_into(input, &mut tree_builder, "test.eure", &mut actions)
52 .map_err(EureParseError::from)?;
53 Ok(tree_builder.build_tree())
54}
55
56pub fn parse_tolerant(input: &str) -> ParseResult {
58 let mut actions = grammar::Grammar::new();
59 let mut tree_builder = CstBuilder::new();
60
61 match parser::parse_into(input, &mut tree_builder, "test.eure", &mut actions) {
62 Ok(()) => ParseResult::Ok(tree_builder.build_tree()),
63 Err(error) => ParseResult::ErrWithCst {
64 cst: tree_builder.build_tree(),
65 error: EureParseError::from(error),
66 },
67 }
68}