-
Notifications
You must be signed in to change notification settings - Fork 3
/
gogenerate_charclass.go
74 lines (67 loc) · 2.39 KB
/
gogenerate_charclass.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package yarex
import (
"fmt"
"strings"
"unicode"
)
func (gg *GoGenerator) generateCharClassAux(cc CharClass, follower *codeFragments) *codeFragments {
switch c := cc.(type) {
case AsciiMaskClass:
return gg.generateAsciiMaskClass(c, follower)
case CompAsciiMaskClass:
return gg.generateCompAsciiMaskClass(c, follower)
case *RangeTableClass:
return gg.generateRangeTableClass(c, follower)
case CompClass:
return gg.generateCompClass(c, follower)
case CompositeClass:
}
panic(fmt.Errorf("Please implement compiler for %T", cc))
}
func (gg *GoGenerator) generateAsciiMaskClass(c AsciiMaskClass, follower *codeFragments) *codeFragments {
return &codeFragments{1, fmt.Sprintf(`yarex.AsciiMaskClass{Hi: 0x%X, Lo: 0x%X}`, c.Hi, c.Lo), follower}
}
func (gg *GoGenerator) generateCompAsciiMaskClass(c CompAsciiMaskClass, follower *codeFragments) *codeFragments {
return &codeFragments{1, fmt.Sprintf(`yarex.CompAsciiMaskClass{yarex.AsciiMaskClass{Hi: 0x%X, Lo: 0x%X}}`, c.AsciiMaskClass.Hi, c.AsciiMaskClass.Lo), follower}
}
func (gg *GoGenerator) generateRangeTableClass(c *RangeTableClass, follower *codeFragments) *codeFragments {
rt := (*unicode.RangeTable)(c)
var buf strings.Builder
buf.WriteString("(*yarex.RangeTableClass)(*unicode.RangeTable{\n")
if rt.R16 != nil {
buf.WriteString(" R16: []Range16{\n")
for _, r := range rt.R16 {
fmt.Fprintf(&buf, " {0x%04x, 0x%04x, %d},\n", r.Lo, r.Hi, r.Stride)
}
buf.WriteString(" },\n")
}
if rt.R32 != nil {
buf.WriteString(" R32: []Range32{\n")
for _, r := range rt.R32 {
fmt.Fprintf(&buf, " {0x%x, 0x%x, %d},\n", r.Lo, r.Hi, r.Stride)
}
buf.WriteString(" },\n")
}
if rt.LatinOffset != 0 {
fmt.Fprintf(&buf, " LatinOffset: %d,\n", rt.LatinOffset)
}
buf.WriteString("})\n")
return &codeFragments{1, buf.String(), follower}
}
func (gg *GoGenerator) generateCompClass(c CompClass, follower *codeFragments) *codeFragments {
return &codeFragments{
1,
`yarex.CompClass{`,
gg.generateCharClassAux(c.CharClass, follower.prepend("}")),
}
}
func (gg *GoGenerator) generateCompositeClass(c CompositeClass, follower *codeFragments) *codeFragments {
follower = follower.prepend(")")
cs := ([]CharClass)(c)
follower = gg.generateCharClassAux(cs[len(cs)-1], follower)
for _, c := range cs[0 : len(cs)-1] {
follower = follower.prepend(", ")
follower = gg.generateCharClassAux(c, follower)
}
return follower.prepend("yarex.ComopsiteClass(")
}