mirror of
https://github.com/nim-lang/Nim.git
synced 2026-02-14 07:13:27 +00:00
* fixes #19104; peg Incorrect captures [backport:1.6] * add tests Co-authored-by: khchen <khchen@gmail.com>
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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'")
|
||||
|
||||
Reference in New Issue
Block a user