aboutsummaryrefslogtreecommitdiff
path: root/Lua/test.lua
blob: c2fbb3c095fde66e2029c3b4bb95f1dcfdb61221 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
local bp = require 'bp'

local function iter(state, _)
    local m, start, len = bp.match(state[1], state[2], state[3])
    state[3] = m and start+math.max(len,1)
    return m, start, len
end

bp.each = function(s, pat, index)
    return iter, {s, pat, index}, index
end

local function repr(obj)
    if type(obj) == 'table' then
        local ret = {}
        for k,v in pairs(obj) do table.insert(ret, ("%s=%s"):format(k, repr(v))) end
        return ("{%s}"):format(table.concat(ret,","))
    elseif type(obj) == 'string' then
        return string.format("%q", obj)
    else
        return tostring(obj)
    end
end

print("Matching:")
for m, i,j in bp.each("one two  three", "(*`a-z) => '(@0)'") do
    print(("%s @%d len=%d"):format(repr(m),i,j))
end

print(("Replacing: %q (%d replacements)"):format(bp.replace("one two  three", "+`a-z", "(@0)")))


print("Captures:")
local m = bp.match("one two three four", "@first=+`a-z _ @second=(+`a-z => 'XX@0XX') _ @+`a-z _ @last=+`a-z")
print(repr(m))

local m = bp.match("one two three four", "@dup=+`a-z _ @dup=+`a-z _ @two=(@a=+`a-z _ @b=+`a-z)")
print(repr(m))


print("Testing parse errors:")
local ok, msg = pcall(function()
    bp.match("xxx", ".;//;;; wtf")
end)
if not ok then print(("\x1B[41;30mParse error:\x1B[0;1;31m %s\x1B[m\n"):format(msg)) end

print("Testing builtins:")
print(bp.match("...(foo())...", "parens"))