summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
-rw-r--r--server/locale/en-US/script.lni3
-rw-r--r--server/locale/zh-CN/script.lni5
-rw-r--r--server/src/parser/ast.lua105
-rw-r--r--server/src/parser/grammar.lua47
4 files changed, 120 insertions, 40 deletions
diff --git a/server/locale/en-US/script.lni b/server/locale/en-US/script.lni
index c91d0994..604453df 100644
--- a/server/locale/en-US/script.lni
+++ b/server/locale/en-US/script.lni
@@ -15,7 +15,7 @@ MWS_COMPLETE = 'Workspace is complete now. You may try again...'
PARSER_CRASH = 'Parser crashed! Last words:{}'
PARSER_UNKNOWN = 'Unknown syntax error...'
-PARSER_MISS_NAME = '<name> expected.'
+PARSER_MISS_NAME = '<name> expected'
PARSER_UNKNOWN_SYMBOL = 'Unexpected symbol `{symbol}`'
PARSER_MISS_SYMBOL = 'Missed symbol `{symbol}`'
PARSER_MISS_ESC_X = 'Should be 2 hexadecimal digits'
@@ -25,5 +25,6 @@ PARSER_UTF8_MAX = 'Should between {min} and {max}'
PARSER_ERR_ESC = 'Invalid escape sequence'
PARSER_MUST_X16 = 'Should be hexadecimal digits'
PARSER_MISS_EXPONENT = 'Missed digits for the exponent'
+PARSER_MISS_EXP = '<exp> expected'
SYMBOL_ANONYMOUS = '<Anonymous>'
diff --git a/server/locale/zh-CN/script.lni b/server/locale/zh-CN/script.lni
index 3014b5fa..585780f1 100644
--- a/server/locale/zh-CN/script.lni
+++ b/server/locale/zh-CN/script.lni
@@ -5,10 +5,10 @@ DIAG_UNUSED_LOCAL = '未使用的局部变量 `{}`。'
DIAG_UNDEFINED_GLOBAL = '未定义的全局变量 `{}`。'
DIAG_UNUSED_LABEL = '未使用的标签 `{}`。'
DIAG_REDEFINED_LOCAL = '重定义局部变量 `{}`。'
-DIAG_PREVIOUS_CALL = '解析为了上一行的函数调用。你可能需要在前面加一个 `;`。'
+DIAG_PREVIOUS_CALL = '解析为了上一行的函数调用。你可能需要在前面加一个 `;`。'
DIAG_OVER_MAX_ARGS = '函数只接收 {:d} 个参数,但你传了 {:d} 个。'
-MWS_NOT_SUPPORT = '{} 目前还不支持多工作目录,我可能需要重启才能支持新的工作目录...'
+MWS_NOT_SUPPORT = '{} 目前还不支持多工作目录,我可能需要重启才能支持新的工作目录...'
MWS_RESTART = '重启'
MWS_NOT_COMPLETE = '工作目录还没有准备好,你可以稍后再试一下...'
MWS_COMPLETE = '工作目录准备好了,你可以再试一下了...'
@@ -25,5 +25,6 @@ PARSER_UTF8_MAX = '必须在 {min} 与 {max} 之间'
PARSER_ERR_ESC = '错误的转义符'
PARSER_MUST_X16 = '必须是16进制字符'
PARSER_MISS_EXPONENT = '缺少指数部分'
+PARSER_MISS_EXP = '缺少表达式'
SYMBOL_ANONYMOUS = '<匿名函数>'
diff --git a/server/src/parser/ast.lua b/server/src/parser/ast.lua
index 04a625c1..de305ca3 100644
--- a/server/src/parser/ast.lua
+++ b/server/src/parser/ast.lua
@@ -4,7 +4,13 @@ local utf8_char = utf8.char
local Errs
local function pushError(err)
- err.level = 'error'
+ local last = Errs[#Errs]
+ if last then
+ if last.start <= err.start and last.finish >= err.finish then
+ return
+ end
+ end
+ err.level = err.level or 'error'
Errs[#Errs+1] = err
end
@@ -83,6 +89,15 @@ local defs = {
end
local v = tonumber(char, 16)
if not v then
+ for i = 1, #char do
+ if not tonumber(char:sub(i, i), 16) then
+ pushError {
+ type = 'MUST_X16',
+ start = pos + i - 1,
+ finish = pos + i - 1,
+ }
+ end
+ end
return ''
end
if v < 0 or v > 0x10ffff then
@@ -238,29 +253,18 @@ local defs = {
obj[max] = nil
return obj
end,
- Table = function (start, table, finish)
- if table then
- table.start = start
- table.finish = finish - 1
- else
- table = {
- type = 'table',
- start = start,
- finish = finish - 1,
- }
- end
+ Table = function (start, ...)
+ local table = {
+ type = 'table',
+ start = start,
+ ...,
+ }
+ local max = #table
+ local finish = table[max]
+ table.finish = finish - 1
+ table[max] = nil
return table
end,
- TableFields = function (...)
- if ... == '' then
- return nil
- else
- return {
- type = 'table',
- ...,
- }
- end
- end,
NewField = function (key, value)
return {
type = 'pair',
@@ -452,11 +456,11 @@ local defs = {
end,
-- 捕获错误
- UnknownSymbol = function (start, symbol, finish)
+ UnknownSymbol = function (start, symbol)
pushError {
type = 'UNKNOWN_SYMBOL',
start = start,
- finish = finish - 1,
+ finish = start + #symbol - 1,
info = {
symbol = symbol,
}
@@ -475,6 +479,19 @@ local defs = {
[1] = ''
}
end,
+ DirtyExp = function (pos)
+ pushError {
+ type = 'MISS_EXP',
+ start = pos,
+ finish = pos,
+ }
+ return {
+ type = 'name',
+ start = pos,
+ finish = pos,
+ [1] = ''
+ }
+ end,
MissExponent = function (start, finish)
pushError {
type = 'MISS_EXPONENT',
@@ -529,6 +546,26 @@ local defs = {
}
}
end,
+ MissBR = function (pos)
+ pushError {
+ type = 'MISS_SYMBOL',
+ start = pos,
+ finish = pos,
+ info = {
+ symbol = ']',
+ }
+ }
+ end,
+ MissPR = function (pos)
+ pushError {
+ type = 'MISS_SYMBOL',
+ start = pos,
+ finish = pos,
+ info = {
+ symbol = ')',
+ }
+ }
+ end,
ErrEsc = function (pos)
pushError {
type = 'ERR_ESC',
@@ -543,6 +580,26 @@ local defs = {
finish = math.max(pos + #str - 1, pos),
}
end,
+ MissAssign = function (pos)
+ pushError {
+ type = 'MISS_SYMBOL',
+ start = pos,
+ finish = pos,
+ info = {
+ symbol = '=',
+ }
+ }
+ end,
+ MissTableSep = function (pos)
+ pushError {
+ type = 'MISS_SYMBOL',
+ start = pos,
+ finish = pos,
+ info = {
+ symbol = ','
+ }
+ }
+ end,
}
return function (self, lua, mode)
diff --git a/server/src/parser/grammar.lua b/server/src/parser/grammar.lua
index a13fb465..051ab446 100644
--- a/server/src/parser/grammar.lua
+++ b/server/src/parser/grammar.lua
@@ -54,6 +54,7 @@ defs.en = '\n'
defs.er = '\r'
defs.et = '\t'
defs.ev = '\v'
+defs['nil'] = m.Cp() / function () return nil end
defs.NotReserved = function (_, _, str)
if RESERVED[str] then
return false
@@ -94,6 +95,7 @@ grammar 'Common' [[
Word <- [a-zA-Z0-9_]
Cut <- !Word
X16 <- [a-fA-F0-9]
+Rest <- (!%nl .)*
AND <- Sp {'and'} Cut
BREAK <- Sp 'break' Cut
@@ -134,12 +136,11 @@ EChar <- 'a' -> ea
/ ('z' (%nl / %s)*) -> ''
/ ('x' {X16 X16}) -> Char16
/ ([0-9] [0-9]? [0-9]?) -> Char10
- / ('u{' {} {X16*} '}')
- -> CharUtf8
+ / ('u{' {} {Word*} '}') -> CharUtf8
-- 错误处理
/ 'x' {} -> MissEscX
/ 'u' !'{' {} -> MissTL
- / 'u{' X16* !'}' {} -> MissTR
+ / 'u{' Word* !'}' {} -> MissTR
/ {} -> ErrEsc
Comp <- Sp {CompList}
@@ -188,6 +189,11 @@ ASSIGN <- Sp '='
Nothing <- {} -> Nothing
TOCLOSE <- Sp '*toclose'
+
+DirtyAssign <- ASSIGN / {} -> MissAssign
+DirtyBR <- BR / {} -> MissBR
+DirtyTR <- TR / {} -> MissTR
+DirtyPR <- TR / {} -> MissPR
]]
grammar 'Nil' [[
@@ -219,7 +225,7 @@ grammar 'Number' [[
Number <- Sp ({} {NumberDef} {}) -> Number
ErrNumber?
NumberDef <- Number16 / Number10
-ErrNumber <- ({} {([0-9a-zA-Z] / '.')+} {})
+ErrNumber <- ({} {([0-9a-zA-Z] / '.')+})
-> UnknownSymbol
Number10 <- Float10 Float10Exp?
@@ -249,7 +255,7 @@ DirtyName <- {} -> DirtyName
]]
grammar 'Exp' [[
-Exp <- ExpOr
+Exp <- Sp ExpOr
ExpOr <- (ExpAnd (OR ExpAnd)*) -> Binary
ExpAnd <- (ExpCompare (AND ExpCompare)*) -> Binary
ExpCompare <- (ExpBor (Comp ExpBor)*) -> Binary
@@ -284,7 +290,8 @@ Suffix <- DOT MustName
/ Sp ({} BL DirtyExp (BR / Sp) {}) -> Index
/ Sp ({} PL ExpList (PR / Sp) {}) -> Call
-DirtyExp <- Exp / DirtyName
+DirtyExp <- Exp
+ / {} -> DirtyExp
ExpList <- (COMMA DirtyExp)+
-> List
/ (Exp (COMMA DirtyExp)*)?
@@ -306,14 +313,28 @@ AfterArg <- DOTS
/ MustName
-Table <- Sp ({} TL TableFields TR? {})
+Table <- ({} TL TR {})
+ -> Table
+ / ({} TL TableFields DirtyTR {})
-> Table
-TableFields <- TableSep (TableSep? TableField)+ TableSep?
- / (TableField (TableSep? TableField)* TableSep?)?
- -> TableFields
+ / ({} TL DirtyTR {})
+ -> Table
+TableFields <- TableField
+ (TableAfterF)*
+ LastTableSep?
+ / DirtyExp
+ (TableAfterF)+
+ LastTableSep?
+TableAfterF <- TableSep !TR TableField
+ / DirtyInTable
TableSep <- COMMA / SEMICOLON
-TableField <- NewIndex / NewField / Exp
-NewIndex <- (BL DirtyExp BR ASSIGN DirtyExp)
+ / {}
+ -> MissTableSep
+LastTableSep<- COMMA / SEMICOLON
+TableField <- DirtyInTable? (NewIndex / NewField / Exp)
+DirtyInTable<- Sp ({} {(!TR !COMMA !SEMICOLON !Word !BL !PL !TL !DOTS .)+})
+ -> UnknownSymbol
+NewIndex <- (BL DirtyExp DirtyBR DirtyAssign DirtyExp)
-> NewIndex
NewField <- (MustName ASSIGN DirtyExp)
-> NewField
@@ -356,7 +377,7 @@ CrtAction <- SEMICOLON
/ Set
/ Call
/ Exp
-UnkAction <- ({} {. (!Sps !CrtAction .)*} {})
+UnkAction <- ({} {. (!Sps !CrtAction .)*})
-> UnknownSymbol
SimpleList <- (Simple (COMMA Simple)*)