diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2023-06-19 11:14:02 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2023-06-19 11:14:02 -0300 |
commit | 9a9ee3d9ab8ce435d743d293ec43075151370200 (patch) | |
tree | 445290bfa04c2cd30f514b65b90b1d8b973f21f1 /test.lua | |
parent | a561630f17e61548193666abf9a8b20f20462558 (diff) | |
download | lpeg-9a9ee3d9ab8ce435d743d293ec43075151370200.tar.gz lpeg-9a9ee3d9ab8ce435d743d293ec43075151370200.tar.bz2 lpeg-9a9ee3d9ab8ce435d743d293ec43075151370200.zip |
Some fixes in vibibility check for back captures
Diffstat (limited to 'test.lua')
-rwxr-xr-x | test.lua | 29 |
1 files changed, 29 insertions, 0 deletions
@@ -1005,6 +1005,35 @@ p = m.Cg(m.C(1) * m.C(1), "k") * m.Ct(m.Cb("k")) | |||
1005 | t = p:match("ab") | 1005 | t = p:match("ab") |
1006 | checkeq(t, {"a", "b"}) | 1006 | checkeq(t, {"a", "b"}) |
1007 | 1007 | ||
1008 | |||
1009 | do | ||
1010 | -- some basic cases | ||
1011 | assert(m.match(m.Cg(m.Cc(3), "a") * m.Cb("a"), "a") == 3) | ||
1012 | assert(m.match(m.Cg(m.C(1), 133) * m.Cb(133), "X") == "X") | ||
1013 | |||
1014 | -- first reference to 'x' should not see the group enclosing it | ||
1015 | local p = m.Cg(m.Cb('x'), 'x') * m.Cb('x') | ||
1016 | checkerr("back reference 'x' not found", m.match, p, '') | ||
1017 | |||
1018 | local p = m.Cg(m.Cb('x') * m.C(1), 'x') * m.Cb('x') | ||
1019 | checkerr("back reference 'x' not found", m.match, p, 'abc') | ||
1020 | |||
1021 | -- reference to 'x' should not see the group enclosed in another capture | ||
1022 | local s = string.rep("a", 30) | ||
1023 | local p = (m.C(1)^-4 * m.Cg(m.C(1), 'x')) / {} * m.Cb('x') | ||
1024 | checkerr("back reference 'x' not found", m.match, p, s) | ||
1025 | |||
1026 | local p = (m.C(1)^-20 * m.Cg(m.C(1), 'x')) / {} * m.Cb('x') | ||
1027 | checkerr("back reference 'x' not found", m.match, p, s) | ||
1028 | |||
1029 | -- second reference 'k' should refer to 10 and first ref. 'k' | ||
1030 | p = m.Cg(m.Cc(20), 'k') * m.Cg(m.Cc(10) * m.Cb('k') * m.C(1), 'k') | ||
1031 | * (m.Cb('k') / function (a,b,c) return a*10 + b + tonumber(c) end) | ||
1032 | -- 10 * 10 (Cc) + 20 (Cb) + 7 (C) == 127 | ||
1033 | assert(p:match("756") == 127) | ||
1034 | |||
1035 | end | ||
1036 | |||
1008 | p = m.P(true) | 1037 | p = m.P(true) |
1009 | for i = 1, 10 do p = p * m.Cg(1, i) end | 1038 | for i = 1, 10 do p = p * m.Cg(1, i) end |
1010 | for i = 1, 10 do | 1039 | for i = 1, 10 do |