92 lines
1.3 KiB
Go
92 lines
1.3 KiB
Go
![]() |
package syntax
|
||
|
|
||
|
import (
|
||
|
"testing"
|
||
|
)
|
||
|
|
||
|
var compileTests = []struct {
|
||
|
Regexp string
|
||
|
Prog string
|
||
|
}{
|
||
|
{"a", ` 0 fail
|
||
|
1* rune "a" -> 2
|
||
|
2 match
|
||
|
`},
|
||
|
{"[A-M][n-z]", ` 0 fail
|
||
|
1* rune "AM" -> 2
|
||
|
2 rune "nz" -> 3
|
||
|
3 match
|
||
|
`},
|
||
|
{"", ` 0 fail
|
||
|
1* nop -> 2
|
||
|
2 match
|
||
|
`},
|
||
|
{"a?", ` 0 fail
|
||
|
1 rune "a" -> 3
|
||
|
2* alt -> 1, 3
|
||
|
3 match
|
||
|
`},
|
||
|
{"a??", ` 0 fail
|
||
|
1 rune "a" -> 3
|
||
|
2* alt -> 3, 1
|
||
|
3 match
|
||
|
`},
|
||
|
{"a+", ` 0 fail
|
||
|
1* rune "a" -> 2
|
||
|
2 alt -> 1, 3
|
||
|
3 match
|
||
|
`},
|
||
|
{"a+?", ` 0 fail
|
||
|
1* rune "a" -> 2
|
||
|
2 alt -> 3, 1
|
||
|
3 match
|
||
|
`},
|
||
|
{"a*", ` 0 fail
|
||
|
1 rune "a" -> 2
|
||
|
2* alt -> 1, 3
|
||
|
3 match
|
||
|
`},
|
||
|
{"a*?", ` 0 fail
|
||
|
1 rune "a" -> 2
|
||
|
2* alt -> 3, 1
|
||
|
3 match
|
||
|
`},
|
||
|
{"a+b+", ` 0 fail
|
||
|
1* rune "a" -> 2
|
||
|
2 alt -> 1, 3
|
||
|
3 rune "b" -> 4
|
||
|
4 alt -> 3, 5
|
||
|
5 match
|
||
|
`},
|
||
|
{"(a+)(b+)", ` 0 fail
|
||
|
1* cap 2 -> 2
|
||
|
2 rune "a" -> 3
|
||
|
3 alt -> 2, 4
|
||
|
4 cap 3 -> 5
|
||
|
5 cap 4 -> 6
|
||
|
6 rune "b" -> 7
|
||
|
7 alt -> 6, 8
|
||
|
8 cap 5 -> 9
|
||
|
9 match
|
||
|
`},
|
||
|
{"a+|b+", ` 0 fail
|
||
|
1 rune "a" -> 2
|
||
|
2 alt -> 1, 6
|
||
|
3 rune "b" -> 4
|
||
|
4 alt -> 3, 6
|
||
|
5* alt -> 1, 3
|
||
|
6 match
|
||
|
`},
|
||
|
}
|
||
|
|
||
|
func TestCompile(t *testing.T) {
|
||
|
for _, tt := range compileTests {
|
||
|
re, _ := Parse(tt.Regexp, Perl)
|
||
|
p, _ := Compile(re)
|
||
|
s := p.String()
|
||
|
if s != tt.Prog {
|
||
|
t.Errorf("compiled %#q:\n--- have\n%s---\n--- want\n%s---", tt.Regexp, s, tt.Prog)
|
||
|
}
|
||
|
}
|
||
|
}
|