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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
local M = {}
local patterns = {
{ "^:%a+", "pseudoclass" },
{ "^%$%a+", "property" },
{ "^%a+", "keyword" },
{ "^%d+", "number" },
{ "^'[^']*'", "string.double" },
}
local function lex_words(self, text)
local tokens = {}
local pos = 1
while pos <= #text do
local tag, stop = "whitespace", pos
for _, pattern in ipairs(patterns) do
local start, finish = text:find(pattern[1], pos)
if start then
tag, stop = pattern[2], finish
break
end
end
tokens[#tokens + 1] = tag
tokens[#tokens + 1] = stop + 1
pos = stop + 1
end
return tokens
end
local function lex_short(self, text)
if #text < 5 then
return {}
end
return { "keyword", 5 }
end
local function lex_raise(self, text)
error("this lexer always raises")
end
local lexers = {
fake = { lex = lex_words },
short = { lex = lex_short },
badlex = { lex = lex_raise },
}
function M.load(name)
local lexer = lexers[name]
if lexer == nil then
error("no fake lexer named " .. tostring(name))
end
return lexer
end
function M.detect(filename, line)
if filename:match("%.viadetect$") then
return "fake"
end
if line ~= nil and line:match("^#!.*fake") then
return "fake"
end
return nil
end
return M
|