1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
macro_rules! display_single_state {
($fst:expr, $state_id:expr, $f: expr, $show_weight_one: expr) => {
for tr in $fst.get_trs($state_id).unwrap().trs() {
if tr.weight.is_one() && !$show_weight_one {
writeln!(
$f,
"{}\t{}\t{}\t{}",
$state_id, &tr.nextstate, &tr.ilabel, &tr.olabel
)?;
} else {
writeln!(
$f,
"{}\t{}\t{}\t{}\t{}",
$state_id, &tr.nextstate, &tr.ilabel, &tr.olabel, &tr.weight
)?;
}
}
};
}
macro_rules! write_fst {
($fst:expr, $f:expr, $show_weight_one: expr) => {
if let Some(start_state) = $fst.start() {
display_single_state!($fst, start_state, $f, $show_weight_one);
for state_id in $fst.states_iter() {
if state_id != start_state {
display_single_state!($fst, state_id, $f, $show_weight_one);
}
}
for final_state in $fst.final_states_iter() {
let final_weight =
unsafe { $fst.final_weight_unchecked(final_state).unsafe_unwrap() };
if final_weight.is_one() && !$show_weight_one {
writeln!($f, "{}", &final_state)?;
} else {
writeln!($f, "{}\t{}", &final_state, &final_weight)?;
}
}
}
};
}
macro_rules! display_fst_trait {
($semiring:tt, $fst_type:ty) => {
impl<$semiring: 'static + SerializableSemiring> fmt::Display for $fst_type {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write_fst!(self, f, true);
Ok(())
}
}
};
}