diff options
author | 最萌小汐 <sumneko@hotmail.com> | 2019-11-23 00:05:30 +0800 |
---|---|---|
committer | 最萌小汐 <sumneko@hotmail.com> | 2019-11-23 00:05:30 +0800 |
commit | 6da2b175e20ed3c03b0dfcfc9046de1e0e5d4444 (patch) | |
tree | fdc22d78150fd1c5edc46732c8b151ccfefb519f /script-beta/parser/lines.lua | |
parent | d0ff66c9abe9d6abbca12fd811e0c3cb69c1033a (diff) | |
download | lua-language-server-6da2b175e20ed3c03b0dfcfc9046de1e0e5d4444.zip |
正路目录
Diffstat (limited to 'script-beta/parser/lines.lua')
-rw-r--r-- | script-beta/parser/lines.lua | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/script-beta/parser/lines.lua b/script-beta/parser/lines.lua new file mode 100644 index 00000000..c7961d13 --- /dev/null +++ b/script-beta/parser/lines.lua @@ -0,0 +1,46 @@ +local m = require 'lpeglabel' +local utf8Len = utf8.len + +_ENV = nil + +local function Line(start, line, range, finish) + line.start = start + line.finish = finish - 1 + line.range = range - 1 + return line +end + +local function Space(...) + local line = {...} + local sp = 0 + local tab = 0 + for i = 1, #line do + if line[i] == ' ' then + sp = sp + 1 + elseif line[i] == '\t' then + tab = tab + 1 + end + line[i] = nil + end + line.sp = sp + line.tab = tab + return line +end + +local parser = m.P{ +'Lines', +Lines = m.Ct(m.V'Line'^0 * m.V'LastLine'), +Line = m.Cp() * m.V'Indent' * (1 - m.V'Nl')^0 * m.Cp() * m.V'Nl' * m.Cp() / Line, +LastLine= m.Cp() * m.V'Indent' * (1 - m.V'Nl')^0 * m.Cp() * m.Cp() / Line, +Nl = m.P'\r\n' + m.S'\r\n', +Indent = m.C(m.S' \t')^0 / Space, +} + +return function (self, text) + local lines, err = parser:match(text) + if not lines then + return nil, err + end + + return lines +end |