github.com/jmigpin/editor@v1.6.0/util/parseutil/lrparser/ruledotla.go (about)

     1  package lrparser
     2  
     3  import (
     4  	"fmt"
     5  )
     6  
     7  // aka "set of items"
     8  type RuleDotsLaSet map[RuleDot]RuleSet // lookahead set
     9  
    10  func (rdslas RuleDotsLaSet) setRuleSet(rd RuleDot, rset RuleSet) {
    11  	if _, ok := rdslas[rd]; !ok {
    12  		rdslas[rd] = RuleSet{}
    13  	}
    14  	rdslas[rd].add(rset)
    15  }
    16  func (rdslas RuleDotsLaSet) setRule(rd RuleDot, r Rule) {
    17  	if _, ok := rdslas[rd]; !ok {
    18  		rdslas[rd] = RuleSet{}
    19  	}
    20  	rdslas[rd].set(r)
    21  }
    22  func (rdslas RuleDotsLaSet) hasRule(rd RuleDot, r Rule) bool {
    23  	rset, ok := rdslas[rd]
    24  	if !ok {
    25  		return false
    26  	}
    27  	return rset.has(r)
    28  }
    29  
    30  //----------
    31  
    32  func (rdslas RuleDotsLaSet) ruleDots() RuleDots {
    33  	w := RuleDots{}
    34  	for rd := range rdslas {
    35  		u := rd
    36  		w = append(w, &u)
    37  	}
    38  	return w
    39  }
    40  
    41  //----------
    42  
    43  func (rdslas RuleDotsLaSet) String() string {
    44  	rds := RuleDots{}
    45  	for k := range rdslas {
    46  		u := k
    47  		rds = append(rds, &u)
    48  	}
    49  	rds = rds.sorted()
    50  	s := ""
    51  	for _, rd := range rds {
    52  		rset := rdslas[*rd]
    53  		u := fmt.Sprintf("[%v,%v]", rd, rset)
    54  		s += fmt.Sprintf("%v\n", u)
    55  	}
    56  	return s
    57  }
    58  
    59  //----------
    60  //----------
    61  //----------
    62  
    63  //// aka "set of items"
    64  //type RuleDotLas []*RuleDotLa
    65  
    66  //func (rdlas RuleDotLas) has(rdla *RuleDotLa) bool {
    67  //	str := rdla.String()
    68  //	for _, rdla2 := range rdlas {
    69  //		if rdla2.String() == str {
    70  //			return true
    71  //		}
    72  //	}
    73  //	return false
    74  //}
    75  //func (rdlas RuleDotLas) hasAll(rdlas2 RuleDotLas) bool {
    76  //	for _, rdla2 := range rdlas2 {
    77  //		if rdlas.has(rdla2) {
    78  //			return true
    79  //		}
    80  //	}
    81  //	return false
    82  //}
    83  //func (rdlas RuleDotLas) appendUnique(rdlas2 RuleDotLas) RuleDotLas {
    84  //	m := map[string]bool{}
    85  //	for _, rdla := range rdlas {
    86  //		id := rdla.String()
    87  //		m[id] = true
    88  //	}
    89  //	for _, rdla := range rdlas2 {
    90  //		id := rdla.String()
    91  //		if !m[id] {
    92  //			rdlas = append(rdlas, rdla)
    93  //		}
    94  //	}
    95  //	return rdlas
    96  //}
    97  //func (rdlas RuleDotLas) String() string {
    98  //	s := "ruledotlookaheads:\n"
    99  //	for _, rdl := range rdlas {
   100  //		s += fmt.Sprintf("\t%v\n", rdl)
   101  //	}
   102  //	return s
   103  //}
   104  
   105  //----------
   106  //----------
   107  //----------
   108  
   109  //func rdlaLookahead(rdla *RuleDotLa, rFirst *RulesFirst) {
   110  //	if rdla.parent == nil { // rdla is the start rule
   111  //		rdla.looka.set(rFirst.ri.endRule()) // lookahead is the end rule
   112  //		return
   113  //	}
   114  
   115  //	b := []Rule{}
   116  //	rd, ok := rdla.parent.rd.advanceDot()
   117  //	if ok {
   118  //		w := rd.dotAndAfterRules()
   119  //		b = append(b, w...)
   120  //		//if ok {
   121  //		//b = append(b, r)
   122  //		//rdla.looka.add(rFirst.get(r))
   123  //		//}
   124  //	}
   125  
   126  //	for _, a := range rdla.parent.looka.sorted() {
   127  //		ha := append(b, a)
   128  //		rset := rFirst.getSequence(ha)
   129  //		rdla.looka.add(rset)
   130  //	}
   131  
   132  //	//nilr := rFirst.ri.nilRule()
   133  //	//if len(rdla.looka) == 0 || rdla.looka.isSet(nilr) {
   134  //	//	rdla.looka.add(rdla.parent.looka)
   135  //	//}
   136  //}