Skip to content

Commit 478861c

Browse files
committed
Issue yuin#159 : more mysterious brackets in the lua pattern matching
1 parent d819443 commit 478861c

File tree

3 files changed

+23
-32
lines changed

3 files changed

+23
-32
lines changed

_glua-tests/issues.lua

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,3 +174,11 @@ local b
174174
local x = util.fn(
175175
1,
176176
(b or {}).x)
177+
178+
local s = [=[["a"]['b'][9] - ["a"]['b'][8] > ]=]
179+
local result = {}
180+
for i in s:gmatch([=[[[][^%s,]*[]]]=]) do
181+
table.insert(result, i)
182+
end
183+
assert(result[1] == [=[["a"]['b'][9]]=])
184+
assert(result[2] == [=[["a"]['b'][8]]=])

_glua-tests/strings.lua

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,6 @@ end)
55
assert(not ok and string.find(msg, "GopherLua does not support the string.dump"))
66
assert(string.find("","aaa") == nil)
77
assert(string.gsub("hello world", "(%w+)", "%1 %1 %c") == "hello hello %c world world %c")
8-
local ok, msg = pcall(function()
9-
string.gsub("aaa", "]", "")
10-
end)
11-
assert(not ok and string.find(msg, "invalid '%]'"))
12-
13-
local ok, msg = pcall(function()
14-
string.match("aaa", "]", -10)
15-
end)
16-
assert(not ok and string.find(msg, "invalid '%]'"))
17-
18-
local ok, msg = pcall(function()
19-
string.find("aaa", "]")
20-
end)
21-
assert(not ok and string.find(msg, "invalid '%]'"))
22-
23-
local ok, msg = pcall(function()
24-
string.gmatch("aaa", "]")
25-
end)
26-
assert(not ok and string.find(msg, "invalid '%]'"))
278

289
local ret1, ret2, ret3, ret4 = string.find("aaa bbb", "(%w+())")
2910
assert(ret1 == 1)

pm/pm.go

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -312,14 +312,13 @@ func parseClass(sc *scanner, allowset bool) class {
312312
case '.':
313313
if allowset {
314314
return &dotClass{}
315-
} else {
316-
return &charClass{ch}
317315
}
316+
return &charClass{ch}
318317
case '[':
319-
if !allowset {
320-
panic(newError(sc.CurrentPos(), "invalid '['"))
318+
if allowset {
319+
return parseClassSet(sc)
321320
}
322-
return parseClassSet(sc)
321+
return &charClass{ch}
323322
//case '^' '$', '(', ')', ']', '*', '+', '-', '?':
324323
// panic(newError(sc.CurrentPos(), "invalid %c", ch))
325324
case EOS:
@@ -339,13 +338,16 @@ func parseClassSet(sc *scanner) class {
339338
for {
340339
ch := sc.Peek()
341340
switch ch {
342-
case '[':
343-
panic(newError(sc.CurrentPos(), "'[' can not be nested"))
344-
case ']':
345-
sc.Next()
346-
goto exit
341+
// case '[':
342+
// panic(newError(sc.CurrentPos(), "'[' can not be nested"))
347343
case EOS:
348344
panic(newError(sc.CurrentPos(), "unexpected EOS"))
345+
case ']':
346+
if len(set.Classes) > 0 {
347+
sc.Next()
348+
goto exit
349+
}
350+
fallthrough
349351
case '-':
350352
if len(set.Classes) > 0 {
351353
sc.Next()
@@ -398,10 +400,10 @@ func parsePattern(sc *scanner, toplevel bool) *seqPattern {
398400
sc.Restore()
399401
pat.Patterns = append(pat.Patterns, &singlePattern{parseClass(sc, true)})
400402
}
401-
case '.', '[':
403+
case '.', '[', ']':
402404
pat.Patterns = append(pat.Patterns, &singlePattern{parseClass(sc, true)})
403-
case ']':
404-
panic(newError(sc.CurrentPos(), "invalid ']'"))
405+
//case ']':
406+
// panic(newError(sc.CurrentPos(), "invalid ']'"))
405407
case ')':
406408
if toplevel {
407409
panic(newError(sc.CurrentPos(), "invalid ')'"))

0 commit comments

Comments
 (0)