fixes #19104; peg Incorrect captures [backport:1.6] (#20352)

* fixes #19104; peg Incorrect captures [backport:1.6]

* add tests

Co-authored-by: khchen <khchen@gmail.com>
This commit is contained in:
ringabout
2022-09-15 13:54:53 +08:00
committed by GitHub
parent 79afee868d
commit 2b80ff2374
2 changed files with 8 additions and 1 deletions

View File

@@ -838,10 +838,13 @@ template matchOrParse(mopProc: untyped) =
var idx = c.ml # reserve a slot for the subpattern
result = mopProc(s, p.sons[0], start, c)
if result >= 0:
inc(c.ml)
if idx < MaxSubpatterns:
if idx != c.ml:
for i in countdown(c.ml, idx):
c.matches[i+1] = c.matches[i]
c.matches[idx] = (start, start+result-1)
#else: silently ignore the capture
inc(c.ml)
leave(pkCapture, s, p, start, result)
of pkBackRef:
enter(pkBackRef, s, p, start)

View File

@@ -158,6 +158,10 @@ block:
privateAccess(NonTerminal)
privateAccess(Captures)
if "test" =~ peg"s <- {{\ident}}": # bug #19104
doAssert matches[0] == "test"
doAssert matches[1] == "test", $matches[1]
doAssert escapePeg("abc''def'") == r"'abc'\x27\x27'def'\x27"
doAssert match("(a b c)", peg"'(' @ ')'")
doAssert match("W_HI_Le", peg"\y 'while'")