Function parol::analysis::reachability::nt_producing_productions
source ยท pub fn nt_producing_productions(cfg: &Cfg, nt: &str) -> BTreeSet<usize>
Expand description
Calculates the numbers of all productions that eventually can produce the given non-terminal by applying several derivation steps.
use parol::{Cfg, Pr, Symbol, SymbolAttribute, Terminal, TerminalKind};
use parol::analysis::nt_producing_productions;
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("A")]))
.add_pr(Pr::new("A", vec![terminal!("x"), Symbol::n("B"), Symbol::n("AA")]))
.add_pr(Pr::new("AA", vec![terminal!("d"), Symbol::n("AA")]))
.add_pr(Pr::new("AA", vec![]))
.add_pr(Pr::new("B", vec![terminal!("y")]))
.add_pr(Pr::new("C", vec![terminal!("b")]));
let prod_numbers = nt_producing_productions(&g, "S");
assert_eq!(
[].iter().cloned().collect::<BTreeSet<usize>>(),
prod_numbers,
"NT(S)");
let prod_numbers = nt_producing_productions(&g, "A");
assert_eq!(
[0,].iter().cloned().collect::<BTreeSet<usize>>(),
prod_numbers,
"NT(A)");
let prod_numbers = nt_producing_productions(&g, "AA");
assert_eq!(
[0, 1, 2].iter().cloned().collect::<BTreeSet<usize>>(),
prod_numbers,
"NT(AA)");
let prod_numbers = nt_producing_productions(&g, "B");
assert_eq!(
[0, 1,].iter().cloned().collect::<BTreeSet<usize>>(),
prod_numbers,
"NT(B)");
let prod_numbers = nt_producing_productions(&g, "C");
assert_eq!(
[].iter().cloned().collect::<BTreeSet<usize>>(),
prod_numbers,
"NT(C)");