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}