do_not_use_antlr_rust/
dfa_serializer.rs1use 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 } else {
55 format!("{}=>{}", base_str, state.prediction)
56 };
57 }
58 base_str
59 }
60}