summaryrefslogtreecommitdiff
path: root/script-beta/parser/lines.lua
diff options
context:
space:
mode:
author最萌小汐 <sumneko@hotmail.com>2019-11-23 00:05:30 +0800
committer最萌小汐 <sumneko@hotmail.com>2019-11-23 00:05:30 +0800
commit6da2b175e20ed3c03b0dfcfc9046de1e0e5d4444 (patch)
treefdc22d78150fd1c5edc46732c8b151ccfefb519f /script-beta/parser/lines.lua
parentd0ff66c9abe9d6abbca12fd811e0c3cb69c1033a (diff)
downloadlua-language-server-6da2b175e20ed3c03b0dfcfc9046de1e0e5d4444.zip
正路目录
Diffstat (limited to 'script-beta/parser/lines.lua')
-rw-r--r--script-beta/parser/lines.lua46
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