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 //}