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