do_not_use_antlr_rust/
dfa_serializer.rs

1use std::fmt::{Display, Formatter};
2
3use crate::dfa::DFA;
4use crate::dfa_state::DFAState;
5use crate::lexer_atn_simulator::ERROR_DFA_STATE_REF;
6
7pub struct DFASerializer<'a, 'b> {
8    dfa: &'a DFA,
9    get_edge_label: &'b dyn Fn(usize) -> String,
10}
11
12impl Display for DFASerializer<'_, '_> {
13    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
14        let dfa = &self.dfa.states;
15        for source in dfa.iter() {
16            for (i, edge) in source.edges.iter().copied().enumerate() {
17                if edge != 0 && edge != ERROR_DFA_STATE_REF {
18                    let target = &dfa[edge];
19                    f.write_fmt(format_args!(
20                        "{}-{}->{}\n",
21                        self.get_state_string(source),
22                        (self.get_edge_label)(i),
23                        self.get_state_string(target)
24                    ))?;
25                }
26            }
27        }
28        Ok(())
29    }
30}
31
32impl DFASerializer<'_, '_> {
33    pub fn new<'a, 'b>(
34        dfa: &'a DFA,
35        get_edge_label: &'b dyn Fn(usize) -> String,
36    ) -> DFASerializer<'a, 'b> {
37        DFASerializer {
38            dfa,
39            get_edge_label,
40        }
41    }
42
43    fn get_state_string(&self, state: &DFAState) -> String {
44        let mut base_str = format!(
45            "{}s{}{}",
46            if state.is_accept_state { ":" } else { "" },
47            state.state_number - 1,
48            if state.requires_full_context { "^" } else { "" },
49        );
50        if state.is_accept_state {
51            base_str = if !state.predicates.is_empty() {
52                unimplemented!()
53            //                format!("{}=>{:?}", base_str, state.predicates)
54            } else {
55                format!("{}=>{}", base_str, state.prediction)
56            };
57        }
58        base_str
59    }
60}