* fixes #19104; peg Incorrect captures [backport:1.6] * add tests Co-authored-by: khchen <khchen@gmail.com>
This commit is contained in:
parent
79afee868d
commit
2b80ff2374
2 changed files with 8 additions and 1 deletions
|
|
@ -838,10 +838,13 @@ template matchOrParse(mopProc: untyped) =
|
||||||
var idx = c.ml # reserve a slot for the subpattern
|
var idx = c.ml # reserve a slot for the subpattern
|
||||||
result = mopProc(s, p.sons[0], start, c)
|
result = mopProc(s, p.sons[0], start, c)
|
||||||
if result >= 0:
|
if result >= 0:
|
||||||
inc(c.ml)
|
|
||||||
if idx < MaxSubpatterns:
|
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)
|
c.matches[idx] = (start, start+result-1)
|
||||||
#else: silently ignore the capture
|
#else: silently ignore the capture
|
||||||
|
inc(c.ml)
|
||||||
leave(pkCapture, s, p, start, result)
|
leave(pkCapture, s, p, start, result)
|
||||||
of pkBackRef:
|
of pkBackRef:
|
||||||
enter(pkBackRef, s, p, start)
|
enter(pkBackRef, s, p, start)
|
||||||
|
|
|
||||||
|
|
@ -158,6 +158,10 @@ block:
|
||||||
privateAccess(NonTerminal)
|
privateAccess(NonTerminal)
|
||||||
privateAccess(Captures)
|
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 escapePeg("abc''def'") == r"'abc'\x27\x27'def'\x27"
|
||||||
doAssert match("(a b c)", peg"'(' @ ')'")
|
doAssert match("(a b c)", peg"'(' @ ')'")
|
||||||
doAssert match("W_HI_Le", peg"\y 'while'")
|
doAssert match("W_HI_Le", peg"\y 'while'")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue