Function parol::analysis::reachability::nt_producing_productions [−][src]
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};
use parol::analysis::nt_producing_productions;
use std::collections::BTreeSet;
use std::convert::From;
let g = Cfg::with_start_symbol("S")
.add_pr(Pr::new("S", vec![Symbol::n("A")]))
.add_pr(Pr::new("A", vec![Symbol::t("x"), Symbol::n("B"), Symbol::n("AA")]))
.add_pr(Pr::new("AA", vec![Symbol::t("d"), Symbol::n("AA")]))
.add_pr(Pr::new("AA", vec![]))
.add_pr(Pr::new("B", vec![Symbol::t("y")]))
.add_pr(Pr::new("C", vec![Symbol::t("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)");