rustlr 0.3.3

LR/LALR parser generator that can automatically create abstract syntax trees
Documentation
21c21
< const LTRACE:bool = false;
---
> const LTRACE:bool = true;
84c84
<   fn close_all(&mut self, Gmr:&mut Grammar, combing:&mut COMBINGTYPE, known_conflicts:&mut HashMap<(bool,usize,usize),(bool,usize)>) -> bool
---
>   fn close_all(&mut self, Gmr:&mut Grammar, combing:&mut COMBINGTYPE, known_conflicts:&mut HashMap<(bool,usize,usize),(bool,usize)>, rhash:&mut HashMap<Vec<usize>,usize>) -> bool
182c182
<               let eri=Gmr.delay_extend(*ri,*pi,pi+2,combing);
---
>               let eri=Gmr.delay_extend(*ri,*pi,pi+2,combing,comb.clone(),rhash);
258a259
>    pub Ruleshash: HashMap<Vec<usize>,usize>,
272a274
>           Ruleshash:HashMap::new(),
512c514
<         let res=self.States[si].close_all(&mut self.Gmr,&mut self.combing,&mut self.known_conflicts);
---
>         let res=self.States[si].close_all(&mut self.Gmr,&mut self.combing,&mut self.known_conflicts,&mut self.Ruleshash);
707c709
<   pub fn delay_extend(&mut self,ri:usize,dbegin:usize,dend:usize,combing:&mut COMBINGTYPE) -> usize
---
>   pub fn delay_extend(&mut self,ri:usize,dbegin:usize,dend:usize,combing:&mut COMBINGTYPE,comb:Vec<usize>, rulehash:&mut HashMap<Vec<usize>,usize>) -> usize
725c727,732
<        if let Some(nti) = self.Symhash.get(&newntname) {
---
>        let combget = combing.rget(&comb);
>        if let Some(cnti) = combget {
>           newnt = self.Symbols[*cnti].clone();
> println!("REUSING COMBING NT {}",newnt.index);          
>        }
>        else if let Some(nti) = self.Symhash.get(&newntname) {
726a734
> println!("REUSING BY-NAME NT {}",&newnt.sym);                
752a761,763
>          
> println!("Rulesfor size for {}: {}",&NT1.sym, NTrules.len());
> 
801a813
>        ////// HOW TO AVOID DUPLICATE RULES?
813a826,830
>        newrulei.rhs = newrhs; // change rhs of rule
>        let hashr = hashrule(&newrulei);
>        if let Some(rnti) = rulehash.get(&hashr) {
>          return *rnti;
>        }
830d846
<        newrulei.rhs = newrhs; // change rhs of rule
843a860
>          rulehash.insert(hashr,self.Rules.len()-1);
1094a1112,1121
> 
> //// compute hash value for a rule
> fn hashrule(rule:&Grule) -> Vec<usize>
> {
>    let mut h = vec![rule.lhs.index];
>    for r in &rule.rhs {
>      h.push(r.index);
>    }
>    h
> }//hashrule