kbnf_syntax/
utils.rs

1use crate::{
2    node::{Alternation, OperatorFlattenedNode},
3    regex::{FiniteStateAutomaton, FiniteStateAutomatonConfig},
4    semantic_error::SemanticError,
5    InternedStrings,
6};
7
8#[allow(clippy::result_large_err)]
9pub fn compile_one_regex_string(
10    regex_string: &str,
11    config: FiniteStateAutomatonConfig,
12) -> Result<FiniteStateAutomaton, SemanticError> {
13    let regex: Result<FiniteStateAutomaton, SemanticError> = match config {
14        FiniteStateAutomatonConfig::Dfa(ref config) => {
15            kbnf_regex_automata::dfa::dense::Builder::new()
16                .configure(config.clone())
17                .build(regex_string)
18                .map(FiniteStateAutomaton::Dfa)
19                .map_err(SemanticError::DfaRegexBuildError)
20        }
21    };
22    regex
23}
24
25pub fn from_terminals_to_regex_string(
26    terminals: &[Alternation],
27    interned_strings: &InternedStrings,
28) -> String {
29    let regex = terminals
30        .iter()
31        .map(|x| x.concatenations.first().unwrap())
32        .map(|x| match x {
33            OperatorFlattenedNode::Terminal(x) => x,
34            _ => unreachable!(),
35        })
36        .map(|x| regex_lite::escape(interned_strings.terminals.resolve(*x).unwrap()))
37        .collect::<Vec<_>>()
38        .join("|");
39    format!(r"\A(?:{})\z", regex)
40}