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