Function parol::analysis::reachability::nt_producing_productions[][src]

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};
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)");