Skip to main content

eure_parol/
lib.rs

1// This module is generated by eure-gen.
2pub 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/// Result of parsing that may include a partial CST even on error
17#[derive(Debug)]
18pub enum ParseResult {
19    /// Parsing succeeded
20    Ok(Cst),
21    /// Parsing failed but a partial CST is available
22    ErrWithCst { cst: Cst, error: EureParseError },
23}
24
25impl ParseResult {
26    /// Returns the CST regardless of whether parsing succeeded
27    pub fn cst(self) -> Cst {
28        match self {
29            ParseResult::Ok(cst) => cst,
30            ParseResult::ErrWithCst { cst, .. } => cst,
31        }
32    }
33
34    /// Returns the error if parsing failed
35    pub fn error(&self) -> Option<&EureParseError> {
36        match self {
37            ParseResult::Ok(_) => None,
38            ParseResult::ErrWithCst { error, .. } => Some(error),
39        }
40    }
41
42    /// Returns true if parsing succeeded
43    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
56/// Parse with error tolerance - returns a CST even if parsing fails
57pub 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}