pest_extra/parser/
mod.rs

1pub mod types;
2
3use crate::pest_parser::{self, grammar_processor::process_grammar};
4
5use pest::Parser;
6
7use types::*;
8
9fn build_grammar(processed: ProcessedGrammar) -> String {
10    let mut grammar = String::new();
11    for (k, v) in processed.variables.iter() {
12        grammar += format!("{k} = {{ \"{}\" }}\n", v.value).as_str();
13    }
14    for (_, v) in processed.normal_rules.iter() {
15        grammar += format!("{}\n", v.rule).as_str();
16    }
17    grammar
18}
19
20pub fn compile_grammar(grammar: Grammar) -> Result<String, String> {
21    match process_grammar(grammar) {
22        Ok(processed) => Ok(build_grammar(processed)),
23        Err(e) => Err(e.to_string()),
24    }
25}
26
27pub(crate) fn parse_pest_source(
28    source: &str,
29) -> Result<pest::iterators::Pairs<'_, pest_parser::Rule>, Box<pest::error::Error<pest_parser::Rule>>>
30{
31    let res = pest_parser::PestParser::parse(pest_parser::Rule::grammar_rules, source);
32    if let Err(e) = res {
33        Err(Box::new(e))
34    } else {
35        Ok(res.unwrap())
36    }
37}