From 2687363810809f350038acfab2f52f27a3dc51a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=80=E8=90=8C=E5=B0=8F=E6=B1=90?= Date: Mon, 19 Nov 2018 17:11:20 +0800 Subject: =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/matcher/definition.lua | 14 ++- src/parser/grammar.lua | 10 ++- test/definition/arg.lua | 11 +++ test/definition/init.lua | 214 ++------------------------------------------- test/definition/local.lua | 208 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 243 insertions(+), 214 deletions(-) create mode 100644 test/definition/arg.lua create mode 100644 test/definition/local.lua diff --git a/src/matcher/definition.lua b/src/matcher/definition.lua index bf7457e7..b18e1a01 100644 --- a/src/matcher/definition.lua +++ b/src/matcher/definition.lua @@ -54,6 +54,15 @@ function defs.Name(str) return {str, namePos} end +function defs.DOTSPos(p) + namePos = p +end + +function defs.DOTS(str) + checkDifinition(str, namePos) + return {str, namePos} +end + function defs.LocalVar(names) for _, name in ipairs(names) do scopeSet(name) @@ -66,10 +75,13 @@ function defs.LocalSet(names) end end -function defs.FunctionDef(names) +function defs.FunctionDef(names, args) if #names == 1 then scopeSet(names[1]) end + for _, arg in ipairs(args) do + scopeSet(arg) + end scopePush() end diff --git a/src/parser/grammar.lua b/src/parser/grammar.lua index 1e3a37c1..cb14fe6d 100644 --- a/src/parser/grammar.lua +++ b/src/parser/grammar.lua @@ -147,7 +147,8 @@ TL <- Sp '{' TR <- Sp '}' COMMA <- Sp ',' SEMICOLON <- Sp ';' -DOTS <- Sp '...' +DOTS <- Sp {} -> DOTSPos + '...' -> DOTS DOT <- Sp '.' COLON <- Sp ':' LABEL <- Sp '::' @@ -185,7 +186,8 @@ Float16 <- ('.' X16*)? ([pP] [+-]? [1-9]? [0-9]*)? ]] grammar 'Name' [[ -Name <- Sp {} -> NamePos {[a-zA-Z_] [a-zA-Z0-9_]*} -> Name +Name <- Sp {} -> NamePos + {[a-zA-Z_] [a-zA-Z0-9_]*} -> Name ]] grammar 'Exp' [[ @@ -222,7 +224,7 @@ Suffix <- DOT Name / BL Exp BR / PL ArgList? PR -ArgList <- Arg (COMMA Arg)* +ArgList <- (Arg (COMMA Arg)*) Arg <- DOTS / Exp @@ -233,7 +235,7 @@ TableField <- NewIndex / NewField / Exp NewIndex <- BL Exp BR ASSIGN Exp NewField <- Name ASSIGN Exp -Function <- (FUNCTION {| FuncName? |} PL ArgList? PR) -> FunctionDef +Function <- (FUNCTION {| FuncName? |} PL {| ArgList? |} PR) -> FunctionDef (!END Action)* -> Function END FuncName <- Name (FuncSuffix)* diff --git a/test/definition/arg.lua b/test/definition/arg.lua new file mode 100644 index 00000000..e1ce0891 --- /dev/null +++ b/test/definition/arg.lua @@ -0,0 +1,11 @@ +TEST [[ +local function x () + = 1 +end +]] + +TEST [[ +local function x (x, ) + x = +end +]] diff --git a/test/definition/init.lua b/test/definition/init.lua index f9a0bf3e..88d6a1b9 100644 --- a/test/definition/init.lua +++ b/test/definition/init.lua @@ -1,6 +1,8 @@ local matcher = require 'matcher' -local function test(script) +rawset(_G, 'TEST', true) + +function TEST(script) local start = script:find('', 1, true) - 1 local pos = script:find(' - = 1 -]] - -test [[ -local z, y, - = 1 -]] - -test [[ -local = 1 - = 1 -]] - -test [[ -local z, y, = 1 - = 1 -]] - -test [[ -function () end - = 1 -]] - -test [[ -local function () end - = 1 -]] - -test [[ -local x -local - = 1 -]] - -test [[ -local -do - = 1 -end -]] - -test [[ -local -do - local x -end - = 1 -]] - -test [[ -local -if then - local x -end -]] - -test [[ -local -if x then - local x -elseif then - local x -end -]] - -test [[ -local -if x then - local x -elseif x then - local x -else - local x -end - = 1 -]] - -test [[ -local -if x then - = 1 -elseif x then - local x -else - local x -end -]] - -test [[ -local -for x = 1, 10 do -end - = 1 -]] - -test [[ -local x -for = 1, 10 do - = 1 -end -]] - -test [[ -local -for x in x do -end - = 1 -]] - -test [[ -local -for x in do -end -]] - -test [[ -local x -for in x do - = 1 -end -]] - -test [[ -local x -for z, y, in x do - = 1 -end -]] - -test [[ -local -while do -end -]] - -test [[ -local -while x do - = 1 -end -]] - -test [[ -local -while x do - local x -end - = 1 -]] - -test [[ -local -repeat - = 1 -until true -]] - -test [[ -local -repeat - local x -until true - = 1 -]] - -test [[ -local -repeat -until -]] - -test [[ -local x -repeat - local -until -]] - -test [[ -local -function _() - local x -end - = 1 -]] - -test [[ -local -return function () - = 1 -end -]] - -test [[ -local -local x = function () - = 1 -end -]] - -test [[ -local x -local function () - = 1 -end -]] +require 'definition.local' +require 'definition.arg' diff --git a/test/definition/local.lua b/test/definition/local.lua new file mode 100644 index 00000000..bbfd3752 --- /dev/null +++ b/test/definition/local.lua @@ -0,0 +1,208 @@ +TEST [[ +local + = 1 +]] + +TEST [[ +local z, y, + = 1 +]] + +TEST [[ +local = 1 + = 1 +]] + +TEST [[ +local z, y, = 1 + = 1 +]] + +TEST [[ +function () end + = 1 +]] + +TEST [[ +local function () end + = 1 +]] + +TEST [[ +local x +local + = 1 +]] + +TEST [[ +local +do + = 1 +end +]] + +TEST [[ +local +do + local x +end + = 1 +]] + +TEST [[ +local +if then + local x +end +]] + +TEST [[ +local +if x then + local x +elseif then + local x +end +]] + +TEST [[ +local +if x then + local x +elseif x then + local x +else + local x +end + = 1 +]] + +TEST [[ +local +if x then + = 1 +elseif x then + local x +else + local x +end +]] + +TEST [[ +local +for x = 1, 10 do +end + = 1 +]] + +TEST [[ +local x +for = 1, 10 do + = 1 +end +]] + +TEST [[ +local +for x in x do +end + = 1 +]] + +TEST [[ +local +for x in do +end +]] + +TEST [[ +local x +for in x do + = 1 +end +]] + +TEST [[ +local x +for z, y, in x do + = 1 +end +]] + +TEST [[ +local +while do +end +]] + +TEST [[ +local +while x do + = 1 +end +]] + +TEST [[ +local +while x do + local x +end + = 1 +]] + +TEST [[ +local +repeat + = 1 +until true +]] + +TEST [[ +local +repeat + local x +until true + = 1 +]] + +TEST [[ +local +repeat +until +]] + +TEST [[ +local x +repeat + local +until +]] + +TEST [[ +local +function _() + local x +end + = 1 +]] + +TEST [[ +local +return function () + = 1 +end +]] + +TEST [[ +local +local x = function () + = 1 +end +]] + +TEST [[ +local x +local function () + = 1 +end +]] -- cgit v1.2.3