annotate vendor/github.com/dlclark/regexp2/syntax/code.go @ 66:787b5ee0289d draft

Use vendored modules Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Sun, 23 Jul 2023 13:18:53 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1 package syntax
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
2
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
3 import (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
4 "bytes"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
5 "fmt"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
6 "math"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
7 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
8
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
9 // similar to prog.go in the go regex package...also with comment 'may not belong in this package'
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
10
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
11 // File provides operator constants for use by the Builder and the Machine.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
12
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
13 // Implementation notes:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
14 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
15 // Regexps are built into RegexCodes, which contain an operation array,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
16 // a string table, and some constants.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
17 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
18 // Each operation is one of the codes below, followed by the integer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
19 // operands specified for each op.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
20 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
21 // Strings and sets are indices into a string table.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
22
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
23 type InstOp int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
24
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
25 const (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
26 // lef/back operands description
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
27
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
28 Onerep InstOp = 0 // lef,back char,min,max a {n}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
29 Notonerep = 1 // lef,back char,min,max .{n}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
30 Setrep = 2 // lef,back set,min,max [\d]{n}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
31
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
32 Oneloop = 3 // lef,back char,min,max a {,n}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
33 Notoneloop = 4 // lef,back char,min,max .{,n}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
34 Setloop = 5 // lef,back set,min,max [\d]{,n}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
35
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
36 Onelazy = 6 // lef,back char,min,max a {,n}?
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
37 Notonelazy = 7 // lef,back char,min,max .{,n}?
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
38 Setlazy = 8 // lef,back set,min,max [\d]{,n}?
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
39
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
40 One = 9 // lef char a
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
41 Notone = 10 // lef char [^a]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
42 Set = 11 // lef set [a-z\s] \w \s \d
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
43
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
44 Multi = 12 // lef string abcd
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
45 Ref = 13 // lef group \#
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
46
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
47 Bol = 14 // ^
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
48 Eol = 15 // $
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
49 Boundary = 16 // \b
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
50 Nonboundary = 17 // \B
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
51 Beginning = 18 // \A
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
52 Start = 19 // \G
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
53 EndZ = 20 // \Z
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
54 End = 21 // \Z
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
55
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
56 Nothing = 22 // Reject!
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
57
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
58 // Primitive control structures
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
59
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
60 Lazybranch = 23 // back jump straight first
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
61 Branchmark = 24 // back jump branch first for loop
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
62 Lazybranchmark = 25 // back jump straight first for loop
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
63 Nullcount = 26 // back val set counter, null mark
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
64 Setcount = 27 // back val set counter, make mark
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
65 Branchcount = 28 // back jump,limit branch++ if zero<=c<limit
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
66 Lazybranchcount = 29 // back jump,limit same, but straight first
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
67 Nullmark = 30 // back save position
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
68 Setmark = 31 // back save position
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
69 Capturemark = 32 // back group define group
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
70 Getmark = 33 // back recall position
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
71 Setjump = 34 // back save backtrack state
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
72 Backjump = 35 // zap back to saved state
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
73 Forejump = 36 // zap backtracking state
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
74 Testref = 37 // backtrack if ref undefined
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
75 Goto = 38 // jump just go
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
76
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
77 Prune = 39 // prune it baby
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
78 Stop = 40 // done!
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
79
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
80 ECMABoundary = 41 // \b
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
81 NonECMABoundary = 42 // \B
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
82
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
83 // Modifiers for alternate modes
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
84
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
85 Mask = 63 // Mask to get unmodified ordinary operator
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
86 Rtl = 64 // bit to indicate that we're reverse scanning.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
87 Back = 128 // bit to indicate that we're backtracking.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
88 Back2 = 256 // bit to indicate that we're backtracking on a second branch.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
89 Ci = 512 // bit to indicate that we're case-insensitive.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
90 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
91
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
92 type Code struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
93 Codes []int // the code
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
94 Strings [][]rune // string table
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
95 Sets []*CharSet //character set table
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
96 TrackCount int // how many instructions use backtracking
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
97 Caps map[int]int // mapping of user group numbers -> impl group slots
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
98 Capsize int // number of impl group slots
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
99 FcPrefix *Prefix // the set of candidate first characters (may be null)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
100 BmPrefix *BmPrefix // the fixed prefix string as a Boyer-Moore machine (may be null)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
101 Anchors AnchorLoc // the set of zero-length start anchors (RegexFCD.Bol, etc)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
102 RightToLeft bool // true if right to left
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
103 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
104
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
105 func opcodeBacktracks(op InstOp) bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
106 op &= Mask
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
107
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
108 switch op {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
109 case Oneloop, Notoneloop, Setloop, Onelazy, Notonelazy, Setlazy, Lazybranch, Branchmark, Lazybranchmark,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
110 Nullcount, Setcount, Branchcount, Lazybranchcount, Setmark, Capturemark, Getmark, Setjump, Backjump,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
111 Forejump, Goto:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
112 return true
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
113
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
114 default:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
115 return false
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
116 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
117 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
118
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
119 func opcodeSize(op InstOp) int {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
120 op &= Mask
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
121
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
122 switch op {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
123 case Nothing, Bol, Eol, Boundary, Nonboundary, ECMABoundary, NonECMABoundary, Beginning, Start, EndZ,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
124 End, Nullmark, Setmark, Getmark, Setjump, Backjump, Forejump, Stop:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
125 return 1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
126
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
127 case One, Notone, Multi, Ref, Testref, Goto, Nullcount, Setcount, Lazybranch, Branchmark, Lazybranchmark,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
128 Prune, Set:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
129 return 2
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
130
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
131 case Capturemark, Branchcount, Lazybranchcount, Onerep, Notonerep, Oneloop, Notoneloop, Onelazy, Notonelazy,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
132 Setlazy, Setrep, Setloop:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
133 return 3
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
134
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
135 default:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
136 panic(fmt.Errorf("Unexpected op code: %v", op))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
137 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
138 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
139
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
140 var codeStr = []string{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
141 "Onerep", "Notonerep", "Setrep",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
142 "Oneloop", "Notoneloop", "Setloop",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
143 "Onelazy", "Notonelazy", "Setlazy",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
144 "One", "Notone", "Set",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
145 "Multi", "Ref",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
146 "Bol", "Eol", "Boundary", "Nonboundary", "Beginning", "Start", "EndZ", "End",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
147 "Nothing",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
148 "Lazybranch", "Branchmark", "Lazybranchmark",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
149 "Nullcount", "Setcount", "Branchcount", "Lazybranchcount",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
150 "Nullmark", "Setmark", "Capturemark", "Getmark",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
151 "Setjump", "Backjump", "Forejump", "Testref", "Goto",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
152 "Prune", "Stop",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
153 "ECMABoundary", "NonECMABoundary",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
154 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
155
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
156 func operatorDescription(op InstOp) string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
157 desc := codeStr[op&Mask]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
158 if (op & Ci) != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
159 desc += "-Ci"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
160 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
161 if (op & Rtl) != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
162 desc += "-Rtl"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
163 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
164 if (op & Back) != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
165 desc += "-Back"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
166 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
167 if (op & Back2) != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
168 desc += "-Back2"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
169 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
170
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
171 return desc
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
172 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
173
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
174 // OpcodeDescription is a humman readable string of the specific offset
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
175 func (c *Code) OpcodeDescription(offset int) string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
176 buf := &bytes.Buffer{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
177
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
178 op := InstOp(c.Codes[offset])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
179 fmt.Fprintf(buf, "%06d ", offset)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
180
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
181 if opcodeBacktracks(op & Mask) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
182 buf.WriteString("*")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
183 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
184 buf.WriteString(" ")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
185 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
186 buf.WriteString(operatorDescription(op))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
187 buf.WriteString("(")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
188 op &= Mask
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
189
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
190 switch op {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
191 case One, Notone, Onerep, Notonerep, Oneloop, Notoneloop, Onelazy, Notonelazy:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
192 buf.WriteString("Ch = ")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
193 buf.WriteString(CharDescription(rune(c.Codes[offset+1])))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
194
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
195 case Set, Setrep, Setloop, Setlazy:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
196 buf.WriteString("Set = ")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
197 buf.WriteString(c.Sets[c.Codes[offset+1]].String())
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
198
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
199 case Multi:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
200 fmt.Fprintf(buf, "String = %s", string(c.Strings[c.Codes[offset+1]]))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
201
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
202 case Ref, Testref:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
203 fmt.Fprintf(buf, "Index = %d", c.Codes[offset+1])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
204
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
205 case Capturemark:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
206 fmt.Fprintf(buf, "Index = %d", c.Codes[offset+1])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
207 if c.Codes[offset+2] != -1 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
208 fmt.Fprintf(buf, ", Unindex = %d", c.Codes[offset+2])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
209 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
210
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
211 case Nullcount, Setcount:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
212 fmt.Fprintf(buf, "Value = %d", c.Codes[offset+1])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
213
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
214 case Goto, Lazybranch, Branchmark, Lazybranchmark, Branchcount, Lazybranchcount:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
215 fmt.Fprintf(buf, "Addr = %d", c.Codes[offset+1])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
216 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
217
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
218 switch op {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
219 case Onerep, Notonerep, Oneloop, Notoneloop, Onelazy, Notonelazy, Setrep, Setloop, Setlazy:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
220 buf.WriteString(", Rep = ")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
221 if c.Codes[offset+2] == math.MaxInt32 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
222 buf.WriteString("inf")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
223 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
224 fmt.Fprintf(buf, "%d", c.Codes[offset+2])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
225 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
226
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
227 case Branchcount, Lazybranchcount:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
228 buf.WriteString(", Limit = ")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
229 if c.Codes[offset+2] == math.MaxInt32 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
230 buf.WriteString("inf")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
231 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
232 fmt.Fprintf(buf, "%d", c.Codes[offset+2])
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
233 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
234
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
235 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
236
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
237 buf.WriteString(")")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
238
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
239 return buf.String()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
240 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
241
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
242 func (c *Code) Dump() string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
243 buf := &bytes.Buffer{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
244
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
245 if c.RightToLeft {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
246 fmt.Fprintln(buf, "Direction: right-to-left")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
247 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
248 fmt.Fprintln(buf, "Direction: left-to-right")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
249 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
250 if c.FcPrefix == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
251 fmt.Fprintln(buf, "Firstchars: n/a")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
252 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
253 fmt.Fprintf(buf, "Firstchars: %v\n", c.FcPrefix.PrefixSet.String())
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
254 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
255
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
256 if c.BmPrefix == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
257 fmt.Fprintln(buf, "Prefix: n/a")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
258 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
259 fmt.Fprintf(buf, "Prefix: %v\n", Escape(c.BmPrefix.String()))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
260 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
261
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
262 fmt.Fprintf(buf, "Anchors: %v\n", c.Anchors)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
263 fmt.Fprintln(buf)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
264
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
265 if c.BmPrefix != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
266 fmt.Fprintln(buf, "BoyerMoore:")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
267 fmt.Fprintln(buf, c.BmPrefix.Dump(" "))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
268 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
269 for i := 0; i < len(c.Codes); i += opcodeSize(InstOp(c.Codes[i])) {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
270 fmt.Fprintln(buf, c.OpcodeDescription(i))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
271 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
272
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
273 return buf.String()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
274 }