mirror of
https://github.com/Reuh/candran.git
synced 2025-10-27 17:59:30 +00:00
Added suffixable string and table litterals
This commit is contained in:
parent
30a10d6ed9
commit
98a6a87962
6 changed files with 271 additions and 138 deletions
18
README.md
18
README.md
|
|
@ -252,6 +252,24 @@ end
|
|||
|
||||
`if`, `elseif`, `for`, and `while` statements can be writtent without `do`, `then` or `end`, in which case they contain a single statement.
|
||||
|
||||
##### Suffixable string and table litterals
|
||||
_Not in the latest release, install the `candran-scm-1.rockspec` version if you want this feature._
|
||||
```lua
|
||||
"some text":upper() -- same as ("some text"):upper() in Lua
|
||||
"string".upper -- the actual string.upper function. "string"["upper"] also works.
|
||||
-- Also works with calls, for example "string"(), but it isn't really useful for strings.
|
||||
|
||||
{thing = 3}.thing -- 3. Also works with tables!
|
||||
[for i=0,5 do i*i end][3] -- 9. And table comprehensions!
|
||||
|
||||
-- Functions calls have priority:
|
||||
someFunction"thing":upper() -- same as (someFunction("thing")):upper() (i.e., the way it would be parsed by Lua)
|
||||
```
|
||||
|
||||
String litterals, table litterals, and comprehensions can be suffixed with `:` method calls, `.` or `[` indexing, or `(` functions calls, without needing to be enclosed in parantheses.
|
||||
|
||||
*Please note*, that "normal" functions calls have priority over this syntax, in order to maintain Lua compatibility.
|
||||
|
||||
### Preprocessor
|
||||
Before compiling, Candran's preprocessor is run. It execute every line starting with a _#_ (ignoring prefixing whitespace, long strings and comments) as Candran code.
|
||||
For example,
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
#import("lib.lua-parser.parser")
|
||||
|
||||
local candran = {
|
||||
VERSION = "0.6.2"
|
||||
VERSION = "0.7.0-dev"
|
||||
}
|
||||
|
||||
--- Default options.
|
||||
|
|
|
|||
284
candran.lua
284
candran.lua
|
|
@ -629,68 +629,80 @@ end, -- ./compiler/lua53.can:494
|
|||
return lua(t, "_statexpr", "Forin") -- ./compiler/lua53.can:498
|
||||
end, -- ./compiler/lua53.can:498
|
||||
["Call"] = function(t) -- ./compiler/lua53.can:504
|
||||
return lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua53.can:505
|
||||
end, -- ./compiler/lua53.can:505
|
||||
["Invoke"] = function(t) -- ./compiler/lua53.can:509
|
||||
return lua(t[1]) .. ":" .. lua(t[2], "Id") .. "(" .. lua(t, "_lhs", 3) .. ")" -- ./compiler/lua53.can:510
|
||||
end, -- ./compiler/lua53.can:510
|
||||
["_lhs"] = function(t, start, newlines) -- ./compiler/lua53.can:514
|
||||
if start == nil then start = 1 end -- ./compiler/lua53.can:514
|
||||
local r -- ./compiler/lua53.can:515
|
||||
if t[start] then -- ./compiler/lua53.can:516
|
||||
r = lua(t[start]) -- ./compiler/lua53.can:517
|
||||
for i = start + 1, # t, 1 do -- ./compiler/lua53.can:518
|
||||
r = r .. ("," .. (newlines and newline() or " ") .. lua(t[i])) -- ./compiler/lua53.can:519
|
||||
end -- ./compiler/lua53.can:519
|
||||
else -- ./compiler/lua53.can:519
|
||||
r = "" -- ./compiler/lua53.can:522
|
||||
end -- ./compiler/lua53.can:522
|
||||
return r -- ./compiler/lua53.can:524
|
||||
end, -- ./compiler/lua53.can:524
|
||||
["Id"] = function(t) -- ./compiler/lua53.can:527
|
||||
return t[1] -- ./compiler/lua53.can:528
|
||||
end, -- ./compiler/lua53.can:528
|
||||
["Index"] = function(t) -- ./compiler/lua53.can:531
|
||||
return lua(t[1]) .. "[" .. lua(t[2]) .. "]" -- ./compiler/lua53.can:532
|
||||
if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua53.can:505
|
||||
return "(" .. lua(t[1]) .. ")(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua53.can:506
|
||||
else -- ./compiler/lua53.can:506
|
||||
return lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua53.can:508
|
||||
end -- ./compiler/lua53.can:508
|
||||
end, -- ./compiler/lua53.can:508
|
||||
["Invoke"] = function(t) -- ./compiler/lua53.can:513
|
||||
if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua53.can:514
|
||||
return "(" .. lua(t[1]) .. "):" .. lua(t[2], "Id") .. "(" .. lua(t, "_lhs", 3) .. ")" -- ./compiler/lua53.can:515
|
||||
else -- ./compiler/lua53.can:515
|
||||
return lua(t[1]) .. ":" .. lua(t[2], "Id") .. "(" .. lua(t, "_lhs", 3) .. ")" -- ./compiler/lua53.can:517
|
||||
end -- ./compiler/lua53.can:517
|
||||
end, -- ./compiler/lua53.can:517
|
||||
["_lhs"] = function(t, start, newlines) -- ./compiler/lua53.can:522
|
||||
if start == nil then start = 1 end -- ./compiler/lua53.can:522
|
||||
local r -- ./compiler/lua53.can:523
|
||||
if t[start] then -- ./compiler/lua53.can:524
|
||||
r = lua(t[start]) -- ./compiler/lua53.can:525
|
||||
for i = start + 1, # t, 1 do -- ./compiler/lua53.can:526
|
||||
r = r .. ("," .. (newlines and newline() or " ") .. lua(t[i])) -- ./compiler/lua53.can:527
|
||||
end -- ./compiler/lua53.can:527
|
||||
else -- ./compiler/lua53.can:527
|
||||
r = "" -- ./compiler/lua53.can:530
|
||||
end -- ./compiler/lua53.can:530
|
||||
return r -- ./compiler/lua53.can:532
|
||||
end, -- ./compiler/lua53.can:532
|
||||
["_opid"] = { -- ./compiler/lua53.can:536
|
||||
["add"] = "+", -- ./compiler/lua53.can:537
|
||||
["sub"] = "-", -- ./compiler/lua53.can:537
|
||||
["mul"] = "*", -- ./compiler/lua53.can:537
|
||||
["div"] = "/", -- ./compiler/lua53.can:537
|
||||
["idiv"] = "//", -- ./compiler/lua53.can:538
|
||||
["mod"] = "%", -- ./compiler/lua53.can:538
|
||||
["pow"] = "^", -- ./compiler/lua53.can:538
|
||||
["concat"] = "..", -- ./compiler/lua53.can:538
|
||||
["band"] = "&", -- ./compiler/lua53.can:539
|
||||
["bor"] = "|", -- ./compiler/lua53.can:539
|
||||
["bxor"] = "~", -- ./compiler/lua53.can:539
|
||||
["shl"] = "<<", -- ./compiler/lua53.can:539
|
||||
["shr"] = ">>", -- ./compiler/lua53.can:539
|
||||
["eq"] = "==", -- ./compiler/lua53.can:540
|
||||
["ne"] = "~=", -- ./compiler/lua53.can:540
|
||||
["lt"] = "<", -- ./compiler/lua53.can:540
|
||||
["gt"] = ">", -- ./compiler/lua53.can:540
|
||||
["le"] = "<=", -- ./compiler/lua53.can:540
|
||||
["ge"] = ">=", -- ./compiler/lua53.can:540
|
||||
["and"] = "and", -- ./compiler/lua53.can:541
|
||||
["or"] = "or", -- ./compiler/lua53.can:541
|
||||
["unm"] = "-", -- ./compiler/lua53.can:541
|
||||
["len"] = "#", -- ./compiler/lua53.can:541
|
||||
["bnot"] = "~", -- ./compiler/lua53.can:541
|
||||
["not"] = "not" -- ./compiler/lua53.can:541
|
||||
} -- ./compiler/lua53.can:541
|
||||
}, { ["__index"] = function(self, key) -- ./compiler/lua53.can:544
|
||||
error("don't know how to compile a " .. tostring(key) .. " to Lua 5.3") -- ./compiler/lua53.can:545
|
||||
end }) -- ./compiler/lua53.can:545
|
||||
local code = lua(ast) .. newline() -- ./compiler/lua53.can:551
|
||||
return requireStr .. code -- ./compiler/lua53.can:552
|
||||
end -- ./compiler/lua53.can:552
|
||||
end -- ./compiler/lua53.can:552
|
||||
local lua53 = _() or lua53 -- ./compiler/lua53.can:557
|
||||
package["loaded"]["compiler.lua53"] = lua53 or true -- ./compiler/lua53.can:558
|
||||
local function _() -- ./compiler/lua53.can:561
|
||||
local function _() -- ./compiler/lua53.can:563
|
||||
["Id"] = function(t) -- ./compiler/lua53.can:535
|
||||
return t[1] -- ./compiler/lua53.can:536
|
||||
end, -- ./compiler/lua53.can:536
|
||||
["Index"] = function(t) -- ./compiler/lua53.can:539
|
||||
if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua53.can:540
|
||||
return "(" .. lua(t[1]) .. ")[" .. lua(t[2]) .. "]" -- ./compiler/lua53.can:541
|
||||
else -- ./compiler/lua53.can:541
|
||||
return lua(t[1]) .. "[" .. lua(t[2]) .. "]" -- ./compiler/lua53.can:543
|
||||
end -- ./compiler/lua53.can:543
|
||||
end, -- ./compiler/lua53.can:543
|
||||
["_opid"] = { -- ./compiler/lua53.can:548
|
||||
["add"] = "+", -- ./compiler/lua53.can:549
|
||||
["sub"] = "-", -- ./compiler/lua53.can:549
|
||||
["mul"] = "*", -- ./compiler/lua53.can:549
|
||||
["div"] = "/", -- ./compiler/lua53.can:549
|
||||
["idiv"] = "//", -- ./compiler/lua53.can:550
|
||||
["mod"] = "%", -- ./compiler/lua53.can:550
|
||||
["pow"] = "^", -- ./compiler/lua53.can:550
|
||||
["concat"] = "..", -- ./compiler/lua53.can:550
|
||||
["band"] = "&", -- ./compiler/lua53.can:551
|
||||
["bor"] = "|", -- ./compiler/lua53.can:551
|
||||
["bxor"] = "~", -- ./compiler/lua53.can:551
|
||||
["shl"] = "<<", -- ./compiler/lua53.can:551
|
||||
["shr"] = ">>", -- ./compiler/lua53.can:551
|
||||
["eq"] = "==", -- ./compiler/lua53.can:552
|
||||
["ne"] = "~=", -- ./compiler/lua53.can:552
|
||||
["lt"] = "<", -- ./compiler/lua53.can:552
|
||||
["gt"] = ">", -- ./compiler/lua53.can:552
|
||||
["le"] = "<=", -- ./compiler/lua53.can:552
|
||||
["ge"] = ">=", -- ./compiler/lua53.can:552
|
||||
["and"] = "and", -- ./compiler/lua53.can:553
|
||||
["or"] = "or", -- ./compiler/lua53.can:553
|
||||
["unm"] = "-", -- ./compiler/lua53.can:553
|
||||
["len"] = "#", -- ./compiler/lua53.can:553
|
||||
["bnot"] = "~", -- ./compiler/lua53.can:553
|
||||
["not"] = "not" -- ./compiler/lua53.can:553
|
||||
} -- ./compiler/lua53.can:553
|
||||
}, { ["__index"] = function(self, key) -- ./compiler/lua53.can:556
|
||||
error("don't know how to compile a " .. tostring(key) .. " to Lua 5.3") -- ./compiler/lua53.can:557
|
||||
end }) -- ./compiler/lua53.can:557
|
||||
local code = lua(ast) .. newline() -- ./compiler/lua53.can:563
|
||||
return requireStr .. code -- ./compiler/lua53.can:564
|
||||
end -- ./compiler/lua53.can:564
|
||||
end -- ./compiler/lua53.can:564
|
||||
local lua53 = _() or lua53 -- ./compiler/lua53.can:569
|
||||
package["loaded"]["compiler.lua53"] = lua53 or true -- ./compiler/lua53.can:570
|
||||
local function _() -- ./compiler/lua53.can:573
|
||||
local function _() -- ./compiler/lua53.can:575
|
||||
return function(code, ast, options) -- ./compiler/lua53.can:1
|
||||
local lastInputPos = 1 -- last token position in the input code -- ./compiler/lua53.can:3
|
||||
local prevLinePos = 1 -- last token position in the previous line of code in the input code -- ./compiler/lua53.can:4
|
||||
|
|
@ -1188,60 +1200,72 @@ end, -- ./compiler/lua53.can:494
|
|||
return lua(t, "_statexpr", "Forin") -- ./compiler/lua53.can:498
|
||||
end, -- ./compiler/lua53.can:498
|
||||
["Call"] = function(t) -- ./compiler/lua53.can:504
|
||||
return lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua53.can:505
|
||||
end, -- ./compiler/lua53.can:505
|
||||
["Invoke"] = function(t) -- ./compiler/lua53.can:509
|
||||
return lua(t[1]) .. ":" .. lua(t[2], "Id") .. "(" .. lua(t, "_lhs", 3) .. ")" -- ./compiler/lua53.can:510
|
||||
end, -- ./compiler/lua53.can:510
|
||||
["_lhs"] = function(t, start, newlines) -- ./compiler/lua53.can:514
|
||||
if start == nil then start = 1 end -- ./compiler/lua53.can:514
|
||||
local r -- ./compiler/lua53.can:515
|
||||
if t[start] then -- ./compiler/lua53.can:516
|
||||
r = lua(t[start]) -- ./compiler/lua53.can:517
|
||||
for i = start + 1, # t, 1 do -- ./compiler/lua53.can:518
|
||||
r = r .. ("," .. (newlines and newline() or " ") .. lua(t[i])) -- ./compiler/lua53.can:519
|
||||
end -- ./compiler/lua53.can:519
|
||||
else -- ./compiler/lua53.can:519
|
||||
r = "" -- ./compiler/lua53.can:522
|
||||
end -- ./compiler/lua53.can:522
|
||||
return r -- ./compiler/lua53.can:524
|
||||
end, -- ./compiler/lua53.can:524
|
||||
["Id"] = function(t) -- ./compiler/lua53.can:527
|
||||
return t[1] -- ./compiler/lua53.can:528
|
||||
end, -- ./compiler/lua53.can:528
|
||||
["Index"] = function(t) -- ./compiler/lua53.can:531
|
||||
return lua(t[1]) .. "[" .. lua(t[2]) .. "]" -- ./compiler/lua53.can:532
|
||||
if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua53.can:505
|
||||
return "(" .. lua(t[1]) .. ")(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua53.can:506
|
||||
else -- ./compiler/lua53.can:506
|
||||
return lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua53.can:508
|
||||
end -- ./compiler/lua53.can:508
|
||||
end, -- ./compiler/lua53.can:508
|
||||
["Invoke"] = function(t) -- ./compiler/lua53.can:513
|
||||
if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua53.can:514
|
||||
return "(" .. lua(t[1]) .. "):" .. lua(t[2], "Id") .. "(" .. lua(t, "_lhs", 3) .. ")" -- ./compiler/lua53.can:515
|
||||
else -- ./compiler/lua53.can:515
|
||||
return lua(t[1]) .. ":" .. lua(t[2], "Id") .. "(" .. lua(t, "_lhs", 3) .. ")" -- ./compiler/lua53.can:517
|
||||
end -- ./compiler/lua53.can:517
|
||||
end, -- ./compiler/lua53.can:517
|
||||
["_lhs"] = function(t, start, newlines) -- ./compiler/lua53.can:522
|
||||
if start == nil then start = 1 end -- ./compiler/lua53.can:522
|
||||
local r -- ./compiler/lua53.can:523
|
||||
if t[start] then -- ./compiler/lua53.can:524
|
||||
r = lua(t[start]) -- ./compiler/lua53.can:525
|
||||
for i = start + 1, # t, 1 do -- ./compiler/lua53.can:526
|
||||
r = r .. ("," .. (newlines and newline() or " ") .. lua(t[i])) -- ./compiler/lua53.can:527
|
||||
end -- ./compiler/lua53.can:527
|
||||
else -- ./compiler/lua53.can:527
|
||||
r = "" -- ./compiler/lua53.can:530
|
||||
end -- ./compiler/lua53.can:530
|
||||
return r -- ./compiler/lua53.can:532
|
||||
end, -- ./compiler/lua53.can:532
|
||||
["_opid"] = { -- ./compiler/lua53.can:536
|
||||
["add"] = "+", -- ./compiler/lua53.can:537
|
||||
["sub"] = "-", -- ./compiler/lua53.can:537
|
||||
["mul"] = "*", -- ./compiler/lua53.can:537
|
||||
["div"] = "/", -- ./compiler/lua53.can:537
|
||||
["idiv"] = "//", -- ./compiler/lua53.can:538
|
||||
["mod"] = "%", -- ./compiler/lua53.can:538
|
||||
["pow"] = "^", -- ./compiler/lua53.can:538
|
||||
["concat"] = "..", -- ./compiler/lua53.can:538
|
||||
["band"] = "&", -- ./compiler/lua53.can:539
|
||||
["bor"] = "|", -- ./compiler/lua53.can:539
|
||||
["bxor"] = "~", -- ./compiler/lua53.can:539
|
||||
["shl"] = "<<", -- ./compiler/lua53.can:539
|
||||
["shr"] = ">>", -- ./compiler/lua53.can:539
|
||||
["eq"] = "==", -- ./compiler/lua53.can:540
|
||||
["ne"] = "~=", -- ./compiler/lua53.can:540
|
||||
["lt"] = "<", -- ./compiler/lua53.can:540
|
||||
["gt"] = ">", -- ./compiler/lua53.can:540
|
||||
["le"] = "<=", -- ./compiler/lua53.can:540
|
||||
["ge"] = ">=", -- ./compiler/lua53.can:540
|
||||
["and"] = "and", -- ./compiler/lua53.can:541
|
||||
["or"] = "or", -- ./compiler/lua53.can:541
|
||||
["unm"] = "-", -- ./compiler/lua53.can:541
|
||||
["len"] = "#", -- ./compiler/lua53.can:541
|
||||
["bnot"] = "~", -- ./compiler/lua53.can:541
|
||||
["not"] = "not" -- ./compiler/lua53.can:541
|
||||
} -- ./compiler/lua53.can:541
|
||||
}, { ["__index"] = function(self, key) -- ./compiler/lua53.can:544
|
||||
error("don't know how to compile a " .. tostring(key) .. " to Lua 5.3") -- ./compiler/lua53.can:545
|
||||
end }) -- ./compiler/lua53.can:545
|
||||
["Id"] = function(t) -- ./compiler/lua53.can:535
|
||||
return t[1] -- ./compiler/lua53.can:536
|
||||
end, -- ./compiler/lua53.can:536
|
||||
["Index"] = function(t) -- ./compiler/lua53.can:539
|
||||
if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua53.can:540
|
||||
return "(" .. lua(t[1]) .. ")[" .. lua(t[2]) .. "]" -- ./compiler/lua53.can:541
|
||||
else -- ./compiler/lua53.can:541
|
||||
return lua(t[1]) .. "[" .. lua(t[2]) .. "]" -- ./compiler/lua53.can:543
|
||||
end -- ./compiler/lua53.can:543
|
||||
end, -- ./compiler/lua53.can:543
|
||||
["_opid"] = { -- ./compiler/lua53.can:548
|
||||
["add"] = "+", -- ./compiler/lua53.can:549
|
||||
["sub"] = "-", -- ./compiler/lua53.can:549
|
||||
["mul"] = "*", -- ./compiler/lua53.can:549
|
||||
["div"] = "/", -- ./compiler/lua53.can:549
|
||||
["idiv"] = "//", -- ./compiler/lua53.can:550
|
||||
["mod"] = "%", -- ./compiler/lua53.can:550
|
||||
["pow"] = "^", -- ./compiler/lua53.can:550
|
||||
["concat"] = "..", -- ./compiler/lua53.can:550
|
||||
["band"] = "&", -- ./compiler/lua53.can:551
|
||||
["bor"] = "|", -- ./compiler/lua53.can:551
|
||||
["bxor"] = "~", -- ./compiler/lua53.can:551
|
||||
["shl"] = "<<", -- ./compiler/lua53.can:551
|
||||
["shr"] = ">>", -- ./compiler/lua53.can:551
|
||||
["eq"] = "==", -- ./compiler/lua53.can:552
|
||||
["ne"] = "~=", -- ./compiler/lua53.can:552
|
||||
["lt"] = "<", -- ./compiler/lua53.can:552
|
||||
["gt"] = ">", -- ./compiler/lua53.can:552
|
||||
["le"] = "<=", -- ./compiler/lua53.can:552
|
||||
["ge"] = ">=", -- ./compiler/lua53.can:552
|
||||
["and"] = "and", -- ./compiler/lua53.can:553
|
||||
["or"] = "or", -- ./compiler/lua53.can:553
|
||||
["unm"] = "-", -- ./compiler/lua53.can:553
|
||||
["len"] = "#", -- ./compiler/lua53.can:553
|
||||
["bnot"] = "~", -- ./compiler/lua53.can:553
|
||||
["not"] = "not" -- ./compiler/lua53.can:553
|
||||
} -- ./compiler/lua53.can:553
|
||||
}, { ["__index"] = function(self, key) -- ./compiler/lua53.can:556
|
||||
error("don't know how to compile a " .. tostring(key) .. " to Lua 5.3") -- ./compiler/lua53.can:557
|
||||
end }) -- ./compiler/lua53.can:557
|
||||
UNPACK = function(list, i, j) -- ./compiler/luajit.can:1
|
||||
return "unpack(" .. list .. (i and (", " .. i .. (j and (", " .. j) or "")) or "") .. ")" -- ./compiler/luajit.can:2
|
||||
end -- ./compiler/luajit.can:2
|
||||
|
|
@ -1275,11 +1299,11 @@ tags["_opid"]["bnot"] = function(right) -- ./compiler/luajit.can:31
|
|||
addRequire("bit", "bnot", "bnot") -- ./compiler/luajit.can:32
|
||||
return var("bnot") .. "(" .. lua(right) .. ")" -- ./compiler/luajit.can:33
|
||||
end -- ./compiler/luajit.can:33
|
||||
local code = lua(ast) .. newline() -- ./compiler/lua53.can:551
|
||||
return requireStr .. code -- ./compiler/lua53.can:552
|
||||
end -- ./compiler/lua53.can:552
|
||||
end -- ./compiler/lua53.can:552
|
||||
local lua53 = _() or lua53 -- ./compiler/lua53.can:557
|
||||
local code = lua(ast) .. newline() -- ./compiler/lua53.can:563
|
||||
return requireStr .. code -- ./compiler/lua53.can:564
|
||||
end -- ./compiler/lua53.can:564
|
||||
end -- ./compiler/lua53.can:564
|
||||
local lua53 = _() or lua53 -- ./compiler/lua53.can:569
|
||||
return lua53 -- ./compiler/luajit.can:40
|
||||
end -- ./compiler/luajit.can:40
|
||||
local luajit = _() or luajit -- ./compiler/luajit.can:44
|
||||
|
|
@ -2806,16 +2830,16 @@ end, -- ./lib/lua-parser/parser.lua:450
|
|||
["MulExpr"] = chainOp(V("UnaryExpr"), V("MulOp"), "MulExpr"), -- ./lib/lua-parser/parser.lua:519
|
||||
["UnaryExpr"] = V("UnaryOp") * expect(V("UnaryExpr"), "UnaryExpr") / unaryOp + V("PowExpr"), -- ./lib/lua-parser/parser.lua:521
|
||||
["PowExpr"] = V("SimpleExpr") * (V("PowOp") * expect(V("UnaryExpr"), "PowExpr")) ^ - 1 / binaryOp, -- ./lib/lua-parser/parser.lua:522
|
||||
["SimpleExpr"] = tagC("Number", V("Number")) + tagC("String", V("String")) + tagC("Nil", kw("nil")) + tagC("Boolean", kw("false") * Cc(false)) + tagC("Boolean", kw("true") * Cc(true)) + tagC("Dots", sym("...")) + V("FuncDef") + V("Table") + V("ShortFuncDef") + V("SuffixedExpr") + V("TableCompr") + V("StatExpr"), -- ./lib/lua-parser/parser.lua:535
|
||||
["StatExpr"] = (V("IfStat") + V("DoStat") + V("WhileStat") + V("RepeatStat") + V("ForStat")) / statToExpr, -- ./lib/lua-parser/parser.lua:537
|
||||
["FuncCall"] = Cmt(V("SuffixedExpr"), function(s, i, exp) -- ./lib/lua-parser/parser.lua:539
|
||||
return exp["tag"] == "Call" or exp["tag"] == "Invoke", exp -- ./lib/lua-parser/parser.lua:539
|
||||
end), -- ./lib/lua-parser/parser.lua:539
|
||||
["VarExpr"] = Cmt(V("SuffixedExpr"), function(s, i, exp) -- ./lib/lua-parser/parser.lua:540
|
||||
return exp["tag"] == "Id" or exp["tag"] == "Index", exp -- ./lib/lua-parser/parser.lua:540
|
||||
end), -- ./lib/lua-parser/parser.lua:540
|
||||
["SuffixedExpr"] = Cf(V("PrimaryExpr") * (V("Index") + V("Call")) ^ 0, makeIndexOrCall), -- ./lib/lua-parser/parser.lua:542
|
||||
["PrimaryExpr"] = V("SelfId") * (V("SelfCall") + V("SelfIndex")) + V("Id") + tagC("Paren", sym("(") * expect(V("Expr"), "ExprParen") * expect(sym(")"), "CParenExpr")), -- ./lib/lua-parser/parser.lua:545
|
||||
["SimpleExpr"] = tagC("Number", V("Number")) + tagC("Nil", kw("nil")) + tagC("Boolean", kw("false") * Cc(false)) + tagC("Boolean", kw("true") * Cc(true)) + tagC("Dots", sym("...")) + V("FuncDef") + V("ShortFuncDef") + V("SuffixedExpr") + V("StatExpr"), -- ./lib/lua-parser/parser.lua:532
|
||||
["StatExpr"] = (V("IfStat") + V("DoStat") + V("WhileStat") + V("RepeatStat") + V("ForStat")) / statToExpr, -- ./lib/lua-parser/parser.lua:534
|
||||
["FuncCall"] = Cmt(V("SuffixedExpr"), function(s, i, exp) -- ./lib/lua-parser/parser.lua:536
|
||||
return exp["tag"] == "Call" or exp["tag"] == "Invoke", exp -- ./lib/lua-parser/parser.lua:536
|
||||
end), -- ./lib/lua-parser/parser.lua:536
|
||||
["VarExpr"] = Cmt(V("SuffixedExpr"), function(s, i, exp) -- ./lib/lua-parser/parser.lua:537
|
||||
return exp["tag"] == "Id" or exp["tag"] == "Index", exp -- ./lib/lua-parser/parser.lua:537
|
||||
end), -- ./lib/lua-parser/parser.lua:537
|
||||
["SuffixedExpr"] = Cf(V("PrimaryExpr") * (V("Index") + V("Call")) ^ 0, makeIndexOrCall), -- ./lib/lua-parser/parser.lua:539
|
||||
["PrimaryExpr"] = V("SelfId") * (V("SelfCall") + V("SelfIndex")) + V("Id") + tagC("Paren", sym("(") * expect(V("Expr"), "ExprParen") * expect(sym(")"), "CParenExpr")) + tagC("String", V("String")) + V("Table") + V("TableCompr"), -- ./lib/lua-parser/parser.lua:545
|
||||
["Index"] = tagC("DotIndex", sym("." * - P(".")) * expect(V("StrId"), "NameIndex")) + tagC("ArrayIndex", sym("[" * - P(S("=["))) * expect(V("Expr"), "ExprIndex") * expect(sym("]"), "CBracketIndex")), -- ./lib/lua-parser/parser.lua:547
|
||||
["Call"] = tagC("Invoke", Cg(sym(":" * - P(":")) * expect(V("StrId"), "NameMeth") * expect(V("FuncArgs"), "MethArgs"))) + tagC("Call", V("FuncArgs")), -- ./lib/lua-parser/parser.lua:549
|
||||
["SelfIndex"] = tagC("DotIndex", V("StrId")), -- ./lib/lua-parser/parser.lua:550
|
||||
|
|
@ -2905,7 +2929,7 @@ return parser -- ./lib/lua-parser/parser.lua:685
|
|||
end -- ./lib/lua-parser/parser.lua:685
|
||||
local parser = _() or parser -- ./lib/lua-parser/parser.lua:689
|
||||
package["loaded"]["lib.lua-parser.parser"] = parser or true -- ./lib/lua-parser/parser.lua:690
|
||||
local candran = { ["VERSION"] = "0.6.2" } -- candran.can:13
|
||||
local candran = { ["VERSION"] = "0.7.0-dev" } -- candran.can:13
|
||||
candran["default"] = { -- candran.can:17
|
||||
["target"] = "lua53", -- candran.can:18
|
||||
["indentation"] = "", -- candran.can:19
|
||||
|
|
|
|||
|
|
@ -502,12 +502,20 @@ return function(code, ast, options)
|
|||
|
||||
-- Call{ expr expr* }
|
||||
Call = (t)
|
||||
if t[1].tag == "String" or t[1].tag == "Table" then
|
||||
return "("..lua(t[1]) .. ")(" .. lua(t, "_lhs", 2) .. ")"
|
||||
else
|
||||
return lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ")"
|
||||
end
|
||||
end,
|
||||
|
||||
-- Invoke{ expr `String{ <string> } expr* }
|
||||
Invoke = (t)
|
||||
if t[1].tag == "String" or t[1].tag == "Table" then
|
||||
return "("..lua(t[1]).."):"..lua(t[2], "Id").."("..lua(t, "_lhs", 3)..")"
|
||||
else
|
||||
return lua(t[1])..":"..lua(t[2], "Id").."("..lua(t, "_lhs", 3)..")"
|
||||
end
|
||||
end,
|
||||
|
||||
-- lhs --
|
||||
|
|
@ -529,7 +537,11 @@ return function(code, ast, options)
|
|||
end,
|
||||
-- Index{ expr expr }
|
||||
Index = (t)
|
||||
if t[1].tag == "String" or t[1].tag == "Table" then
|
||||
return "("..lua(t[1])..")["..lua(t[2]).."]"
|
||||
else
|
||||
return lua(t[1]).."["..lua(t[2]).."]"
|
||||
end
|
||||
end,
|
||||
|
||||
-- opid --
|
||||
|
|
|
|||
|
|
@ -522,16 +522,13 @@ local G = { V"Lua",
|
|||
PowExpr = V"SimpleExpr" * (V"PowOp" * expect(V"UnaryExpr", "PowExpr"))^-1 / binaryOp;
|
||||
|
||||
SimpleExpr = tagC("Number", V"Number")
|
||||
+ tagC("String", V"String")
|
||||
+ tagC("Nil", kw("nil"))
|
||||
+ tagC("Boolean", kw("false") * Cc(false))
|
||||
+ tagC("Boolean", kw("true") * Cc(true))
|
||||
+ tagC("Dots", sym("..."))
|
||||
+ V"FuncDef"
|
||||
+ V"Table"
|
||||
+ V"ShortFuncDef"
|
||||
+ V"SuffixedExpr"
|
||||
+ V"TableCompr"
|
||||
+ V"StatExpr";
|
||||
|
||||
StatExpr = (V"IfStat" + V"DoStat" + V"WhileStat" + V"RepeatStat" + V"ForStat") / statToExpr;
|
||||
|
|
@ -542,7 +539,10 @@ local G = { V"Lua",
|
|||
SuffixedExpr = Cf(V"PrimaryExpr" * (V"Index" + V"Call")^0, makeIndexOrCall);
|
||||
PrimaryExpr = V"SelfId" * (V"SelfCall" + V"SelfIndex")
|
||||
+ V"Id"
|
||||
+ tagC("Paren", sym("(") * expect(V"Expr", "ExprParen") * expect(sym(")"), "CParenExpr"));
|
||||
+ tagC("Paren", sym("(") * expect(V"Expr", "ExprParen") * expect(sym(")"), "CParenExpr"))
|
||||
+ tagC("String", V"String")
|
||||
+ V"Table"
|
||||
+ V"TableCompr";
|
||||
Index = tagC("DotIndex", sym("." * -P".") * expect(V"StrId", "NameIndex"))
|
||||
+ tagC("ArrayIndex", sym("[" * -P(S"=[")) * expect(V"Expr", "ExprIndex") * expect(sym("]"), "CBracketIndex"));
|
||||
Call = tagC("Invoke", Cg(sym(":" * -P":") * expect(V"StrId", "NameMeth") * expect(V"FuncArgs", "MethArgs")))
|
||||
|
|
|
|||
|
|
@ -518,6 +518,85 @@ while a < 5
|
|||
return a
|
||||
]], 5)
|
||||
|
||||
-- suffixable string litals, table, table comprehension
|
||||
test("suffixable string litteral method", [[
|
||||
return "foo":len()
|
||||
]], 3)
|
||||
test("suffixable string litteral method lua conflict", [[
|
||||
local s = function() return "four" end
|
||||
return s"foo":len()
|
||||
]], 4)
|
||||
test("suffixable string litteral dot index", [[
|
||||
local a = "foo".len
|
||||
return a("foo")
|
||||
]], 3)
|
||||
test("suffixable string litteral dot index lua conflict", [[
|
||||
local s = function() return {len=4} end
|
||||
local a = s"foo".len
|
||||
return a
|
||||
]], 4)
|
||||
test("suffixable string litteral array index", [[
|
||||
local a = "foo"["len"]
|
||||
return a("foo")
|
||||
]], 3)
|
||||
test("suffixable string litteral dot index lua conflict", [[
|
||||
local s = function() return {len=4} end
|
||||
local a = s"foo"["len"]
|
||||
return a
|
||||
]], 4)
|
||||
test("suffixable string litteral call", [[
|
||||
local r, e = pcall(function() "foo"() end)
|
||||
return not r and e:match("attempt to call a string value")
|
||||
]], "attempt to call a string value")
|
||||
test("suffixable string litteral call lua conflict", [[
|
||||
local s = function() return function() return 4 end end
|
||||
return s"foo"()
|
||||
]], 4)
|
||||
|
||||
test("suffixable table litteral method", [[
|
||||
return {a=3,len=function(t) return t.a end}:len()
|
||||
]], 3)
|
||||
test("suffixable table litteral method lua conflict", [[
|
||||
local s = function() return "four" end
|
||||
return s{a=3,len=function(t) return t.a end}:len()
|
||||
]], 4)
|
||||
test("suffixable table litteral dot index", [[
|
||||
return {len=3}.len
|
||||
]], 3)
|
||||
test("suffixable table litteral dot index lua conflict", [[
|
||||
local s = function() return {len=4} end
|
||||
return s{len=3}.len
|
||||
]], 4)
|
||||
test("suffixable table litteral array index", [[
|
||||
return {len=3}["len"]
|
||||
]], 3)
|
||||
test("suffixable table litteral dot index lua conflict", [[
|
||||
local s = function() return {len=4} end
|
||||
return s{len=3}["len"]
|
||||
]], 4)
|
||||
test("suffixable table litteral call", [[
|
||||
local r, e = pcall(function() {}() end)
|
||||
return not r and e:match("attempt to call a table value")
|
||||
]], "attempt to call a table value")
|
||||
test("suffixable table litteral call lua conflict", [[
|
||||
local s = function() return function() return 4 end end
|
||||
return s{}()
|
||||
]], 4)
|
||||
|
||||
test("suffixable table comprehension method", [[
|
||||
return [@len = function() return 3 end]:len()
|
||||
]], 3)
|
||||
test("suffixable table comprehension dot index", [[
|
||||
return [@len = 3].len
|
||||
]], 3)
|
||||
test("suffixable table comprehension array index", [[
|
||||
return [@len=3]["len"]
|
||||
]], 3)
|
||||
test("suffixable table comprehension call", [[
|
||||
local r, e = pcall(function() []() end)
|
||||
return not r and e:match("attempt to call a table value")
|
||||
]], "attempt to call a table value")
|
||||
|
||||
-- results
|
||||
local resultCounter = {}
|
||||
local testCounter = 0
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue