rustlr 0.3.93

Bottom-Up Parser Generator with Advanced Options
Documentation
24c24
< pub const MAXK:usize = 3; // this is only the default
---
> pub const MAXK:usize = 2; // this is only the default
27c27
< type PREAGENDATYPE = BTreeSet<usize>;
---
> type PREAGENDATYPE = HashSet<usize>;
29c29
< type ITEMSETTYPE = BTreeSet<LRitem>;
---
> type ITEMSETTYPE = HashSet<LRitem>;
150,151c150,153
<             let comblen = comblength(&rilhs,combing);
<              if *cpi==0 && comblen>maxk { // cannot be extended
---
>              /*
>              if *cpi==0 { // cannot be extended?
>               let comblen = comblength(&rilhs,combing);
>               if comblen>maxk {
154c156
<                   print!("FAILURE. MAXIMUM COMBING IN CONFLICT:\n  [[ ");
---
>                   print!("FAILURE. MAXIMAL COMBING IN CONFLICT:\n  [[ ");
162a165
>               }
164c167
< 
---
>              */
178,194c181,182
<               let defaultcomb = vec![nti];
<               let comb = combing.get(&nti).unwrap_or(&defaultcomb);
<               /*
<               if comb.len()>maxk {
<                 answer= false;
<                 if !failed {
<                   print!("FAILURE. MAXIMUM COMBING IN CONFLICT: [[");
<                   for x in comb {
<                     print!("{} ",&Gmr.Symbols[*x].sym);
<                   }
<                   println!("]]");
<                 }
<                 return answer
<                 //panic!("\nFAILED!!!!!!!!\n");      ///////PANIC
<               }
<               */
< //             else {
---
>               //let defaultcomb = vec![nti];
>               //let comb = combing.get(&nti).unwrap_or(&defaultcomb);
196c184,198
< if LTRACE {print!("EXTENSION OF: "); printitem2(&item,Gmr,combing);}
---
>                let comblen = comblength(&nti,combing);
>                if comblen>maxk {
>                  if !failed {
>                     let comb = uncombing(&rilhs,combing);               
>                     print!("FAILURE. MAXIMUM COMBING IN CONFLICT:\n  [[ ");
>                     for x in &comb {
>                       print!("{} ",&Gmr.Symbols[*x].sym);
>                     }
>                     println!("]]");
>                     failed = true;
>                  }//print
>                  answer =  false;
>                }//failure detected
>              
>              else if answer {
213c215
<               let eri=Gmr.delay_extend(*ri,*pi,pi+2,combing,comb.clone(),rhash);
---
>               let eri=Gmr.delay_extend(*ri,*pi,pi+2,combing/*,comb*/,rhash);
217c219,223
< //            //self.lrkernel.insert(extenditem);  ////????? utimately no
---
>                 //self.lrkernel.insert(extenditem);  ////?????
>                 // if the above line is added, then two kernels should be
>                 // considered the same if they contain the same non-deprecated
>                 // items.
> 
220a227
> if LTRACE {print!("got rule {}, EXTENSION OF: ",eri); printitem2(&item,Gmr,combing);}
225,226c232,233
<               }
< //             } // can extend
---
>               } //extenditem already onclosure?
>              } // can extend (does not exceed maxk (closes else if answer)
231d237
<           //if self.deprecated.contains(&nc) {continue;}  /////  JUST ADDED
260a267
> 
263c270
<       if self.lrkernel.len() != other.lrkernel.len() { return false; } //***
---
>       if self.lrkernel.len() != other.lrkernel.len() { return false; } // ***
269,270d275
<       
< /*      
271a277,280
> /*
>    // version that compares kernels for non-deprecated items
>    fn eq(&self, other:&MLState) -> bool {
>      for item in self.lrkernel.iter() {
275,279c284,287
<            
< 
<        for item in other.lrkernel.iter() {
<         if !self.deprecated.contains(item) &&
<            !other.deprecated.contains(item) &&
---
>      }
>      for item in other.lrkernel.iter() {
>         if !other.deprecated.contains(item) &&
>            !self.deprecated.contains(item) &&
281c289,291
<       }
---
>      }
>      true
>    }
283,289d292
<       /*      
<       if other.lrkernel.len()>self.lrkernel.len() {
< println!("\n\nHOW COULD THIS HAPPEN???!, {}, and {}\n\n",self.lrkernel.len(),other.lrkernel.len());
< //        for item in other.lrkernel.iter() {
< //           if !self.lrkernel.contains(item) && !other.deprecated.contains(item) && !self.deprecated.contains(item) {return false;}
< //        }
<       }
291,311d293
<       for item in other.lrkernel.iter() {
<         if !self.lrkernel.contains(item) {return false;}
<       }
<       for item in other.conflicts.iter() {
<         if !self.conflicts.contains(item) {return false;}
<       }
<       if self.items.len() != other.items.len() { return false; }      
<       for item in self.items.iter() {
<         if !other.items.contains(item) {return false;}
<       }
<       */
< 
< /*
<    fn eq(&self, other:&MLState) -> bool {
<       if self.lrkernel.len() != other.lrkernel.len() { return false; }
<       for item in self.lrkernel.iter() {
<         if !other.lrkernel.contains(item) {return false;}
<       }
<       true
<    }//eq
< */
500c482,486
<          }
---
>             if bc.pi==0 && !self.failed && checkfailure(&bc,&self.Gmr,&self.combing,self.maxk)   {
>                reportfailure(&self.Gmr.Rules[bc.ri].lhs.index,&self.Gmr,&self.combing);
>                self.failed=true; break;
>             }//failure check
>          }//inserted
556a543,569
>        if interior.contains(&si) {continue;}  //check during push below
> 
>        // check kernels and items 
>          for istate in interior.iter() {
>          let same = true;
>          if self.States[*istate] == self.States[si] {
>            println!("States {} and {} have the same kernel",istate,si);
>            /*
>            println!("Kernel of state {}:",istate);
>            for item in self.States[*istate].lrkernel.iter() {
>              printitem2(item,&self.Gmr,&self.combing);
>            }
>            println!("... and Kernel of state {}:",si);
>            for item in self.States[si].lrkernel.iter() {
>              printitem2(item,&self.Gmr,&self.combing);
>            }
>            */
>          }
>        }/////// printing trace
> 
> /*
>        println!("Kernel of state {}:",si);
>        for item in self.States[si].lrkernel.iter() {
>          printitem2(item,&self.Gmr,&self.combing);
>        }
> */
> 
559c572
<        for (_,action) in self.FSM[si].iter() {
---
>        for (symi,action) in self.FSM[si].iter() {
562c575,578
<              if !interior.contains(nsi) {frontier.push(*nsi);} 
---
>              if !interior.contains(nsi) {
>                frontier.push(*nsi);
>                //println!("FRONTIER STATE {} ->{}-> {}",si,&self.Gmr.Symbols[*symi].sym,nsi);
>              } 
645c661
< 
---
>       
673c689
<              if pi-1==0 { priority=true; }
---
>              if pi-1>0 { priority=true; }
679,682c695,698
<                if bc.pi==0 && checkfailure(&bc,&self.Gmr,&self.combing,self.maxk) {
<                if !self.failed {reportfailure(&self.Gmr.Rules[bc.ri].lhs.index,&self.Gmr,&self.combing);}
<                self.failed=true; break;
<   }
---
>                if bc.pi==0 && !self.failed && checkfailure(&bc,&self.Gmr,&self.combing,self.maxk) {
>                  reportfailure(&self.Gmr.Rules[bc.ri].lhs.index,&self.Gmr,&self.combing);
>                  self.failed=true; break;
>                   }
796a813
> //if true || LTRACE {println!("FINAL RULE COUNT: {}",self.Gmr.Rules.len());}
996c1013
<   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
---
>   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
1023c1040
< //println!("REUSING BY-NAME NT {}",&newnt.sym);                
---
> //println!("REUSING BY-NAME NT {}",&newnt.sym);       //checked         
1045,1048c1062,1068
<          let defvec = vec![self.Rules[ri].rhs[dbegin].index];
<          let mut oldvec = combing.get(&self.Rules[ri].rhs[dbegin].index).unwrap_or(&defvec).clone();
<          //let mut oldvec = uncombing(&ri,self,combing);
<          oldvec.push(self.Rules[ri].rhs[dend-1].index);
---
>          //let defvec = vec![self.Rules[ri].rhs[dbegin].index];
>          //let mut oldvec = combing.get(&self.Rules[ri].rhs[dbegin].index).unwrap_or(&defvec).clone();
>          let mut oldvec = uncombing(&self.Rules[ri].rhs[dbegin].index,combing);
>          // this assumes that dend = debegin+2
>          let mut extension = uncombing(&self.Rules[ri].rhs[dend-1].index,combing);
>          oldvec.append(&mut extension);
>          //oldvec.push(self.Rules[ri].rhs[dend-1].index);
1054,1055d1073
< //println!("Rulesfor size for {}: {}",&NT1.sym, NTrules.len());
< 
1057c1075
<            // create new rule
---
>            // create new rule: A-> a to [Ab] -> ab
1427,1428c1445,1447
<         let defaultcomb = vec![lhs.index];
<         let comb = combing.get(&Gmr.Rules[item.ri].lhs.index).unwrap_or(&defaultcomb);
---
>         //let defaultcomb = vec![lhs.index];
>         //let comb = combing.get(&Gmr.Rules[item.ri].lhs.index).unwrap_or(&defaultcomb);
>         let comb = uncombing(&Gmr.Rules[item.ri].lhs.index,combing);
1430c1449
<         for c in comb {
---
>         for c in &comb {
1440,1441c1459,1461
<         let defaultcomb = vec![Gmr.Rules[item.ri].rhs[i].index];
<         let comb = combing.get(&Gmr.Rules[item.ri].rhs[i].index).unwrap_or(&defaultcomb);
---
>         //let defaultcomb = vec![Gmr.Rules[item.ri].rhs[i].index];
>         //let comb = combing.get(&Gmr.Rules[item.ri].rhs[i].index).unwrap_or(&defaultcomb);
>         let comb = uncombing(&Gmr.Rules[item.ri].rhs[i].index,combing);
1444c1464
<         for c in comb {
---
>         for c in &comb {