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

pub fn reachable_non_terminals(cfg: &Cfg) -> BTreeSet<String>
Expand description

Calculates all reachable non-terminals.

use parol::{Cfg, Pr, Symbol};
use parol::analysis::reachable_non_terminals;
use std::collections::BTreeSet;
use std::convert::From;

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"), Symbol::t("a", vec![0])]))
    .add_pr(Pr::new("Y", vec![Symbol::t("b", vec![0])]))
    .add_pr(Pr::new("U", vec![Symbol::n("V")]))
    .add_pr(Pr::new("X", vec![Symbol::t("c", vec![0])]))
    .add_pr(Pr::new("V", vec![Symbol::n("V"), Symbol::t("d", vec![0])]))
    .add_pr(Pr::new("V", vec![Symbol::t("d", vec![0])]))
    .add_pr(Pr::new("Z", vec![Symbol::n("Z"), Symbol::n("X")]));
let productive = reachable_non_terminals(&g);
assert_eq!(
    [
        "S".to_owned(),
        "X".to_owned(),
        "Y".to_owned(),
        "Z".to_owned()
    ].iter().cloned().collect::<BTreeSet<String>>(),
    productive);