summaryrefslogtreecommitdiff
path: root/server/src/parser
diff options
context:
space:
mode:
authorsumneko <sumneko@hotmail.com>2019-05-15 20:46:58 +0800
committersumneko <sumneko@hotmail.com>2019-05-15 20:46:58 +0800
commite15d9d2c66da5d49b7ff5c389475ee552f372a6a (patch)
tree3a4679fc1a7f7863841f547793bfe10b57ba271f /server/src/parser
parent4c8343180670d2d36cd68bddd2941f942d39e311 (diff)
downloadlua-language-server-e15d9d2c66da5d49b7ff5c389475ee552f372a6a.zip
更新语法检查
Diffstat (limited to 'server/src/parser')
-rw-r--r--server/src/parser/ast.lua21
-rw-r--r--server/src/parser/grammar.lua21
2 files changed, 28 insertions, 14 deletions
diff --git a/server/src/parser/ast.lua b/server/src/parser/ast.lua
index 6b555e07..cb3597fd 100644
--- a/server/src/parser/ast.lua
+++ b/server/src/parser/ast.lua
@@ -545,6 +545,20 @@ local Defs = {
finish = start + 2,
}
end,
+ DotsAsArg = function (obj)
+ State.Dots[#State.Dots] = true
+ return obj
+ end,
+ DotsAsExp = function (obj)
+ if not State.Dots[#State.Dots] then
+ pushError {
+ type = 'UNEXPECT_DOTS',
+ start = obj.start,
+ finish = obj.finish,
+ }
+ end
+ return obj
+ end,
COLON = function (start)
return {
type = ':',
@@ -982,12 +996,14 @@ local Defs = {
-- 不能jump到另一个局部变量的作用域
-- 函数会切断goto与label
-- 不能从block外jump到block内,但是可以从block内jump到block外
- LabelStart = function ()
+ BlockStart = function ()
State.Label[#State.Label+1] = {}
+ State.Dots[#State.Dots+1] = false
end,
- LabelEnd = function ()
+ BlockEnd = function ()
local labels = State.Label[#State.Label]
State.Label[#State.Label] = nil
+ State.Dots[#State.Dots] = nil
for i = 1, #labels do
local name = labels[i]
local str = name[1]
@@ -1567,6 +1583,7 @@ return function (self, lua, mode, version)
State= {
Break = 0,
Label = {{}},
+ Dots = {true},
Version = version,
}
local suc, res, err = xpcall(self.grammar, debug.traceback, self, lua, mode, Defs)
diff --git a/server/src/parser/grammar.lua b/server/src/parser/grammar.lua
index 1935588c..455a71ca 100644
--- a/server/src/parser/grammar.lua
+++ b/server/src/parser/grammar.lua
@@ -300,7 +300,7 @@ ExpUnit <- Nil
/ Boolean
/ String
/ Number
- / DOTS
+ / DOTS -> DotsAsExp
/ Table
/ Function
/ Simple
@@ -338,7 +338,7 @@ CallArgList <- Sp ({} (COMMA {} / Exp)+ {})
NameList <- (MustName (COMMA MustName)*)
-> List
-ArgList <- (DOTS / Name / Sp {} COMMA)*
+ArgList <- (DOTS -> DotsAsArg / Name / Sp {} COMMA)*
-> ArgList
Table <- Sp ({} TL TableFields? DirtyTR)
@@ -355,14 +355,13 @@ Function <- Sp ({} FunctionBody {})
-> Function
FuncArg <- PL {} ArgList {} NeedPR
/ {} {} -> MissPL Nothing {}
-FunctionBody<- FUNCTION FuncArg
- LabelStart
+FunctionBody<- FUNCTION BlockStart FuncArg
(Emmy / !END Action)*
- LabelEnd
+ BlockEnd
NeedEnd
-LabelStart <- {} -> LabelStart
-LabelEnd <- {} -> LabelEnd
+BlockStart <- {} -> BlockStart
+BlockEnd <- {} -> BlockEnd
-- 纯占位,修改了 `relabel.lua` 使重复定义不抛错
Action <- !END .
@@ -502,10 +501,9 @@ NamedFunction
<- Sp ({} FunctionNamedBody {})
-> NamedFunction
FunctionNamedBody
- <- FUNCTION FuncName FuncArg
- LabelStart
+ <- FUNCTION FuncName BlockStart FuncArg
(Emmy / !END Action)*
- LabelEnd
+ BlockEnd
NeedEnd
FuncName <- (MustName (DOT MustName)* FuncMethod?)
-> Simple
@@ -593,9 +591,8 @@ EmmySee <- {} MustEmmyName %s* '#' %s* MustEmmyName {}
grammar 'Lua' [[
Lua <- Head?
- LabelStart
(Emmy / Action)* -> Lua
- LabelEnd
+ BlockEnd
Sp
Head <- '#' (!%nl .)*
]]