1
2
3
4
5 package syntax
6
7 import "testing"
8
9 var compileTests = []struct {
10 Regexp string
11 Prog string
12 }{
13 {"a", ` 0 fail
14 1* rune1 "a" -> 2
15 2 match
16 `},
17 {"[A-M][n-z]", ` 0 fail
18 1* rune "AM" -> 2
19 2 rune "nz" -> 3
20 3 match
21 `},
22 {"", ` 0 fail
23 1* nop -> 2
24 2 match
25 `},
26 {"a?", ` 0 fail
27 1 rune1 "a" -> 3
28 2* alt -> 1, 3
29 3 match
30 `},
31 {"a??", ` 0 fail
32 1 rune1 "a" -> 3
33 2* alt -> 3, 1
34 3 match
35 `},
36 {"a+", ` 0 fail
37 1* rune1 "a" -> 2
38 2 alt -> 1, 3
39 3 match
40 `},
41 {"a+?", ` 0 fail
42 1* rune1 "a" -> 2
43 2 alt -> 3, 1
44 3 match
45 `},
46 {"a*", ` 0 fail
47 1 rune1 "a" -> 2
48 2* alt -> 1, 3
49 3 match
50 `},
51 {"a*?", ` 0 fail
52 1 rune1 "a" -> 2
53 2* alt -> 3, 1
54 3 match
55 `},
56 {"a+b+", ` 0 fail
57 1* rune1 "a" -> 2
58 2 alt -> 1, 3
59 3 rune1 "b" -> 4
60 4 alt -> 3, 5
61 5 match
62 `},
63 {"(a+)(b+)", ` 0 fail
64 1* cap 2 -> 2
65 2 rune1 "a" -> 3
66 3 alt -> 2, 4
67 4 cap 3 -> 5
68 5 cap 4 -> 6
69 6 rune1 "b" -> 7
70 7 alt -> 6, 8
71 8 cap 5 -> 9
72 9 match
73 `},
74 {"a+|b+", ` 0 fail
75 1 rune1 "a" -> 2
76 2 alt -> 1, 6
77 3 rune1 "b" -> 4
78 4 alt -> 3, 6
79 5* alt -> 1, 3
80 6 match
81 `},
82 {"A[Aa]", ` 0 fail
83 1* rune1 "A" -> 2
84 2 rune "A"/i -> 3
85 3 match
86 `},
87 {"(?:(?:^).)", ` 0 fail
88 1* empty 4 -> 2
89 2 anynotnl -> 3
90 3 match
91 `},
92 {"(?:|a)+", ` 0 fail
93 1 nop -> 4
94 2 rune1 "a" -> 4
95 3* alt -> 1, 2
96 4 alt -> 3, 5
97 5 match
98 `},
99 {"(?:|a)*", ` 0 fail
100 1 nop -> 4
101 2 rune1 "a" -> 4
102 3 alt -> 1, 2
103 4 alt -> 3, 6
104 5* alt -> 3, 6
105 6 match
106 `},
107 }
108
109 func TestCompile(t *testing.T) {
110 for _, tt := range compileTests {
111 re, _ := Parse(tt.Regexp, Perl)
112 p, _ := Compile(re)
113 s := p.String()
114 if s != tt.Prog {
115 t.Errorf("compiled %#q:\n--- have\n%s---\n--- want\n%s---", tt.Regexp, s, tt.Prog)
116 }
117 }
118 }
119
120 func BenchmarkEmptyOpContext(b *testing.B) {
121 for i := 0; i < b.N; i++ {
122 var r1 rune = -1
123 for _, r2 := range "foo, bar, baz\nsome input text.\n" {
124 EmptyOpContext(r1, r2)
125 r1 = r2
126 }
127 EmptyOpContext(r1, -1)
128 }
129 }
130
View as plain text