Function parol::analysis::reachability::unreachable_non_terminals
source ยท pub fn unreachable_non_terminals(cfg: &Cfg) -> BTreeSet<String>
Expand description
Calculates all unreachable non-terminals.
use parol::{Cfg, Pr, Symbol, SymbolAttribute, Terminal, TerminalKind};
use parol::analysis::unreachable_non_terminals;
use std::collections::BTreeSet;
use std::convert::From;
macro_rules! terminal {
($term:literal) => {Symbol::T(Terminal::Trm($term.to_string(), TerminalKind::Legacy,
vec![0], SymbolAttribute::None, None))};
}
let g = Cfg::with_start_symbol("S")
.add_pr(Pr::new("S", vec![Symbol::n("Y")]))
.add_pr(Pr::new("Y", vec![Symbol::n("Y"), Symbol::n("Z")]))
.add_pr(Pr::new("Y", vec![Symbol::n("Y"), terminal!("a")]))
.add_pr(Pr::new("Y", vec![terminal!("b")]))
.add_pr(Pr::new("U", vec![Symbol::n("V")]))
.add_pr(Pr::new("X", vec![terminal!("c")]))
.add_pr(Pr::new("V", vec![Symbol::n("V"), terminal!("d")]))
.add_pr(Pr::new("V", vec![terminal!("d")]))
.add_pr(Pr::new("Z", vec![Symbol::n("Z"), Symbol::n("X")]));
let productive = unreachable_non_terminals(&g);
assert_eq!(
[
"U".to_owned(),
"V".to_owned()
].iter().cloned().collect::<BTreeSet<String>>(),
productive);