diff options
Diffstat (limited to 'src/lib/regexp')
-rw-r--r-- | src/lib/regexp/all_test.go | 78 | ||||
-rw-r--r-- | src/lib/regexp/regexp.go | 15 |
2 files changed, 39 insertions, 54 deletions
diff --git a/src/lib/regexp/all_test.go b/src/lib/regexp/all_test.go index dd2e94712..b228ee845 100644 --- a/src/lib/regexp/all_test.go +++ b/src/lib/regexp/all_test.go @@ -49,7 +49,7 @@ var bad_re = []StringError{ StringError{ `\x`, regexp.ErrBadBackslash }, } -type Vec [20]int; +type Vec []int; type Tester struct { re string; @@ -57,33 +57,31 @@ type Tester struct { match Vec; } -const END = -1000 - var matches = []Tester { - Tester{ ``, "", Vec{0,0, END} }, - Tester{ `a`, "a", Vec{0,1, END} }, - Tester{ `b`, "abc", Vec{1,2, END} }, - Tester{ `.`, "a", Vec{0,1, END} }, - Tester{ `.*`, "abcdef", Vec{0,6, END} }, - Tester{ `^abcd$`, "abcd", Vec{0,4, END} }, - Tester{ `^bcd'`, "abcdef", Vec{END} }, - Tester{ `^abcd$`, "abcde", Vec{END} }, - Tester{ `a+`, "baaab", Vec{1,4, END} }, - Tester{ `a*`, "baaab", Vec{0,0, END} }, - Tester{ `[a-z]+`, "abcd", Vec{0,4, END} }, - Tester{ `[^a-z]+`, "ab1234cd", Vec{2,6, END} }, - Tester{ `[a\-\]z]+`, "az]-bcz", Vec{0,4, END} }, - Tester{ `[日本語]+`, "日本語日本語", Vec{0,18, END} }, - Tester{ `()`, "", Vec{0,0, 0,0, END} }, - Tester{ `(a)`, "a", Vec{0,1, 0,1, END} }, - Tester{ `(.)(.)`, "日a", Vec{0,4, 0,3, 3,4, END} }, - Tester{ `(.*)`, "", Vec{0,0, 0,0, END} }, - Tester{ `(.*)`, "abcd", Vec{0,4, 0,4, END} }, - Tester{ `(..)(..)`, "abcd", Vec{0,4, 0,2, 2,4, END} }, - Tester{ `(([^xyz]*)(d))`, "abcd", Vec{0,4, 0,4, 0,3, 3,4, END} }, - Tester{ `((a|b|c)*(d))`, "abcd", Vec{0,4, 0,4, 2,3, 3,4, END} }, - Tester{ `(((a|b|c)*)(d))`, "abcd", Vec{0,4, 0,4, 0,3, 2,3, 3,4, END} }, - Tester{ `a*(|(b))c*`, "aacc", Vec{0,4, 2,2, -1,-1, END} }, + Tester{ ``, "", Vec{0,0} }, + Tester{ `a`, "a", Vec{0,1} }, + Tester{ `b`, "abc", Vec{1,2} }, + Tester{ `.`, "a", Vec{0,1} }, + Tester{ `.*`, "abcdef", Vec{0,6} }, + Tester{ `^abcd$`, "abcd", Vec{0,4} }, + Tester{ `^bcd'`, "abcdef", Vec{} }, + Tester{ `^abcd$`, "abcde", Vec{} }, + Tester{ `a+`, "baaab", Vec{1,4} }, + Tester{ `a*`, "baaab", Vec{0,0} }, + Tester{ `[a-z]+`, "abcd", Vec{0,4} }, + Tester{ `[^a-z]+`, "ab1234cd", Vec{2,6} }, + Tester{ `[a\-\]z]+`, "az]-bcz", Vec{0,4} }, + Tester{ `[日本語]+`, "日本語日本語", Vec{0,18} }, + Tester{ `()`, "", Vec{0,0, 0,0} }, + Tester{ `(a)`, "a", Vec{0,1, 0,1} }, + Tester{ `(.)(.)`, "日a", Vec{0,4, 0,3, 3,4} }, + Tester{ `(.*)`, "", Vec{0,0, 0,0} }, + Tester{ `(.*)`, "abcd", Vec{0,4, 0,4} }, + Tester{ `(..)(..)`, "abcd", Vec{0,4, 0,2, 2,4} }, + Tester{ `(([^xyz]*)(d))`, "abcd", Vec{0,4, 0,4, 0,3, 3,4} }, + Tester{ `((a|b|c)*(d))`, "abcd", Vec{0,4, 0,4, 2,3, 3,4} }, + Tester{ `(((a|b|c)*)(d))`, "abcd", Vec{0,4, 0,4, 0,3, 2,3, 3,4} }, + Tester{ `a*(|(b))c*`, "aacc", Vec{0,4, 2,2, -1,-1} }, } func CompileTest(t *testing.T, expr string, error *os.Error) regexp.Regexp { @@ -94,30 +92,20 @@ func CompileTest(t *testing.T, expr string, error *os.Error) regexp.Regexp { return re } -func MarkedLen(m *[] int) int { - if m == nil { - return 0 - } - var i int; - for i = 0; i < len(m) && m[i] != END; i = i+2 { - } - return i -} - -func PrintVec(t *testing.T, m *[] int) { - l := MarkedLen(m); +func PrintVec(t *testing.T, m [] int) { + l := len(m); if l == 0 { t.Log("\t<no match>"); } else { - for i := 0; i < l && m[i] != END; i = i+2 { + for i := 0; i < l; i = i+2 { t.Log("\t", m[i], ",", m[i+1]) } } } -func Equal(m1, m2 *[]int) bool { - l := MarkedLen(m1); - if l != MarkedLen(m2) { +func Equal(m1, m2 []int) bool { + l := len(m1); + if l != len(m2) { return false } for i := 0; i < l; i++ { @@ -128,7 +116,7 @@ func Equal(m1, m2 *[]int) bool { return true } -func MatchTest(t *testing.T, expr string, str string, match *[]int) { +func MatchTest(t *testing.T, expr string, str string, match []int) { re := CompileTest(t, expr, nil); if re == nil { return @@ -157,6 +145,6 @@ export func TestBadCompile(t *testing.T) { export func TestMatch(t *testing.T) { for i := 0; i < len(matches); i++ { test := &matches[i]; - MatchTest(t, test.re, test.text, &test.match) + MatchTest(t, test.re, test.text, test.match) } } diff --git a/src/lib/regexp/regexp.go b/src/lib/regexp/regexp.go index 3c458dbfb..2176c4ddb 100644 --- a/src/lib/regexp/regexp.go +++ b/src/lib/regexp/regexp.go @@ -582,7 +582,7 @@ func Compiler(str string, ch *chan *RE) { // Public interface has only execute functionality (not yet implemented) export type Regexp interface { - Execute(s string) *[]int + Execute(s string) []int } // Compile in separate goroutine; wait for result @@ -595,12 +595,12 @@ export func Compile(str string) (regexp Regexp, error *os.Error) { type State struct { inst Inst; // next instruction to execute - match *[]int; // pairs of bracketing submatches. 0th is start,end + match []int; // pairs of bracketing submatches. 0th is start,end } // Append new state to to-do list. Leftmost-longest wins so avoid // adding a state that's already active. -func AddState(s *[]State, inst Inst, match *[]int) *[]State { +func AddState(s []State, inst Inst, match []int) []State { index := inst.Index(); l := len(s); pos := match[0]; @@ -625,8 +625,8 @@ func AddState(s *[]State, inst Inst, match *[]int) *[]State { return s; } -func (re *RE) DoExecute(str string, pos int) *[]int { - var s [2]*[]State; // TODO: use a vector when State values (not ptrs) can be vector elements +func (re *RE) DoExecute(str string, pos int) []int { + var s [2][]State; // TODO: use a vector when State values (not ptrs) can be vector elements s[0] = new([]State, 10)[0:0]; s[1] = new([]State, 10)[0:0]; in, out := 0, 1; @@ -708,13 +708,10 @@ func (re *RE) DoExecute(str string, pos int) *[]int { } pos += charwidth; } - if !found { - return nil - } return final.match; } -func (re *RE) Execute(s string) *[]int { +func (re *RE) Execute(s string) []int { return re.DoExecute(s, 0) } |