extern crate perplex;
use perplex::grammar::{Grammar, Rule};
use perplex::item_set::ItemSets;
use perplex::glr::GlrAnalysis;
#[allow(non_snake_case)]
fn main() {
let mut g = Grammar::new();
let nt_s = g.add_nonterminal("S");
let nt_a = g.add_nonterminal("A");
let nt_b = g.add_nonterminal("B");
let nt_c = g.add_nonterminal("C");
let nt_d = g.add_nonterminal("D");
let nt_e = g.add_nonterminal("E");
let t_x = g.add_terminal("x");
let t_y = g.add_terminal("y");
let t_z = g.add_terminal("z");
g.add_rule(Rule::new(nt_s, vec![nt_a.into(), nt_b.into(), t_z.into()]));
g.add_rule(Rule::new(nt_b, vec![nt_b.into(), t_y.into(), nt_c.into()]));
g.add_rule(Rule::new(nt_b, vec![nt_c.into()]));
g.add_rule(Rule::new(nt_c, vec![t_x.into()]));
g.add_rule(Rule::new(nt_a, vec![nt_d.into()]));
g.add_rule(Rule::new(nt_a, vec![nt_e.into()]));
g.add_rule(Rule::new(nt_d, vec![t_x.into()]));
g.add_rule(Rule::new(nt_e, vec![]));
let is = ItemSets::compute(&g);
println!("{}", is.pretty(&g));
let ga = GlrAnalysis::compute(&g, &is);
println!("{:#?}", ga);
}