blob: bcafa17a1e7d09240b164bfd38ea7e15aa0582dd (
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
49
50
51
52
53
54
55
56
57
58
59
60
|
return function(utf8)
local matchers = {
sliding = function()
return [[
add(function(ctx) -- sliding
while ctx.pos <= ctx.len do
local clone = ctx:clone()
-- debug('starting from', clone, "start_pos", clone.pos)
clone.result.start = clone.pos
clone:next_function()
clone:get_function()(clone)
ctx:next_char()
end
ctx:terminate()
end)
]]
end,
fromstart = function(ctx)
return [[
add(function(ctx) -- fromstart
if ctx.byte_pos > ctx.len then
return
end
ctx.result.start = ctx.pos
ctx:next_function()
ctx:get_function()(ctx)
ctx:terminate()
end)
]]
end,
}
local function default()
return matchers.sliding()
end
local function parse(regex, c, bs, ctx)
if bs ~= 1 then return end
local functions
local skip = 0
if c == '^' then
functions = matchers.fromstart()
skip = 1
else
functions = matchers.sliding()
end
return functions, skip
end
return {
parse = parse,
default = default,
}
end
|