diff --git a/README.md b/README.md index 76bd1bd..805972c 100644 --- a/README.md +++ b/README.md @@ -6,19 +6,12 @@ Unlike Moonscript, Candran tries to stay close to the Lua syntax, and existing L ````lua #import("lib.thing") -- static import -#local DEBUG = false - -#if DEBUG then -# define("log(...)", "print(...)") -- macro: calls to log() will be replaced with print() in compiled code -#else -# define("log(...)", "") -- remove calls to log from the compiled code when DEBUG is true -#end -log("example macro") -- preprocessor macros +#local debug or= false local function calculate(toadd=25) -- default parameters local result = thing.do() result += toadd - #if DEBUG then -- preprocessor conditionals + #if debug then -- preprocessor conditionals print("Did something") #end return result @@ -83,7 +76,7 @@ Candran is released under the MIT License (see ```LICENSE``` for details). #### Quick setup Install Candran automatically using LuaRocks: ```sudo luarocks install candran```. -Or manually install LPegLabel and argparse (```luarocks install lpeglabel```, version 1.5 or above, and ```luarocks install argparse```, version 0.7 or above), download this repository and use Candran through the scripts in ```bin/``` or use it as a library with the self-contained ```candran.lua```. +Or manually install LPegLabel (```luarocks install lpeglabel```, version 1.5 or above), download this repository and use Candran through the scripts in ```bin/``` or use it as a library with the self-contained ```candran.lua```. You can optionally install lua-linenoise (```luarocks install linenoise```, version 0.9 or above) for an improved REPL, and luacheck (```luarocks install luacheck```, version 0.23.0 or above) to be able to use ```cancheck```. Installing Candran using LuaRocks will install linenoise and luacheck by default. @@ -97,7 +90,6 @@ Most editors should be able to use their existing Lua support for Candran code. * [sublime-candran](https://github.com/Reuh/sublime-candran) support the full Candran syntax * [SublimeLinter-cancheck-contrib](https://github.com/Reuh/SublimeLinter-contrib-cancheck) SublimeLinter plugin for Candran using ```cancheck``` * [SublimeLinter-candran-contrib](https://github.com/Reuh/SublimeLinter-contrib-candran) SublimeLinter plugin for Candran using ```canc -parse``` (only checks for syntaxic errors, no linting) -* **VS Code**: [vscode-candran](https://github.com/Reuh/vscode-candran) basic support for the Candran syntax * **Atom**: [language-candran](https://atom.io/packages/language-candran) support the full Candran syntax For linting, if your editor support [luacheck](https://github.com/luarocks/luacheck), you should be able to replace it with ```cancheck``` (in this repository ```bin/cancheck```, or installed automatically if Candran was installed using LuaRocks), which is a wrapper around luacheck that monkey-patch it to support Candran. @@ -450,53 +442,15 @@ Will output ````print("Bonjour")```` or ````print("Hello")```` depending of the The preprocessor has access to the following variables: * ````candran````: the Candran library table. * ````output````: the current preprocessor output string. Can be redefined at any time. If you want to write something in the preprocessor output, it is preferred to use `write(...)` instead of directly modifying `output`. -* ````import(module[, [options])````: a function which import a module. This should be equivalent to using _require(module)_ in the Candran code, except the module will be embedded in the current file. Macros and preprocessor constants defined in the imported file (using `define` and `set`) will be made available in the current file. _options_ is an optional preprocessor arguments table for the imported module (current preprocessor arguments will be inherited). Options specific to this function: +* ````import(module[, [options])````: a function which import a module. This should be equivalent to using _require(module)_ in the Candran code, except the module will be embedded in the current file. _options_ is an optional preprocessor arguments table for the imported module (current preprocessor arguments will be inherited). Options specific to this function: * ```loadLocal``` (default ```true```): ```true``` to automatically load the module into a local variable (i.e. ```local thing = require("module.thing")```) * ```loadPackage``` (default ```true```): ```true``` to automatically load the module into the loaded packages table (so it will be available for following ```require("module")``` calls). * ````include(filename)````: a function which copy the contents of the file _filename_ to the output. * ````write(...)````: write to the preprocessor output. For example, ````#write("hello()")```` will output ````hello()```` in the final file. * ```placeholder(name)```: if the variable _name_ is defined in the preprocessor environement, its content will be inserted here. -* ```define(identifier, replacement)```: define a macro. See below. -* ```set(identifier, value)```: set a preprocessor constant. * each arguments passed to the preprocessor is directly available in the environment. * and every standard Lua library. -#### Macros - -Using `define(identifier, replacement)` in the preprocessor, you can define macros. `identifier` is expected to be string containing Candran/Lua code (representing either a identifier or a function call), and `replacement` can be either a string containing Candran/Lua code or a function. - -There are two types of macros identifiers: variables, which replace every instance of the given identifier with the replacement; and functions, which will replace every call to this function with the replacement, also replacing its arguments. The `...` will be replaced with every remaining argument. Macros can not be recursive. - -If `replacement` is a string, the macro will be replaced with this string, replacing the macros arguments in the string. If `replacement` is a function, the function will be called every time the macro is encoutered, with the macro arguments passed as strings, and is expected to return a string that will be used as a replacement. - -If `replacement` is the empty empty, the macro will simply be removed from the compiled code. - -```lua --- Variable macro -#define("x", 42) -print(x) -- 42 - --- Function macros -#define("f(x)", "print(x)") -f(42) -- replaced with print(42) - -#define("log(s, ...)", "print(s..": ", ...)") -log("network", "error") -- network: error - -#define("debug()", "") -debug() -- not present in complied code - -#define("_assert(what, err)", function(what, err) -# return "if "..what.." then error("..err..") end" -#end) -_assert(5 = 2, "failed") -- replaced with if 5 = 2 then error("failed") end -``` - -Candran provide some predefined macros by default: -* `__STR__(expr)`: returns a string litteral representing the expression (e.g., `__STR__(5 + 2)` expands to `"5 + 2"`) -* `__CONSTEXPR__(expr)`: calculate the result of the expression in the preprocessor, and returns a representation of the returned value, i.e. precalculate an expression at compile time -You can disable these built-in macros using the `builtInMacros` compiler option. - Compile targets --------------- Candran is based on the Lua 5.4 syntax, but can be compiled to Lua 5.4, Lua 5.3, Lua 5.2, LuaJIT, and Lua 5.1 compatible code. @@ -528,41 +482,23 @@ The library can be used standalone through the ```canc``` (for compiling Candran Preprocess and compile each _filename_ Candran files, and creates the assiociated ```.lua``` files in the same directories. - _options_ is of type ````--no-map-lines -p --include module -d VAR 5````. + _options_ is of type ````-somearg -anotherarg thing=somestring other=5````, which will generate a Lua table ```{ somearg = true, anotherarg = true, thing = "somestring", other = 5 }```. - You can choose to use another directory where files should be written using the `--destination` or `-d` option: ```--destination destinationDirectory```. + You can choose to use another directory where files should be written using the ```dest=destinationDirectory``` argument. - You can choose the output filename using `--output` or `-o` option: `--output filename`. By default, compiled files have the same name as their input file, but with a ```.lua``` extension. + You can choose the output filename using ```out=filename```. By default, compiled files have the same name as their input file, but with a ```.lua``` extension. - ```canc``` can write to the standard output instead of creating files using the ```--print``` or `-p` argument. + ```canc``` can write to the standard output instead of creating files using the ```-print``` argument. - You can choose to run only the preprocessor or compile using the ```--preprocess``` and ```--compile``` flags. + You can choose to run only the preprocessor or compile using the ```-preprocess``` and ```-compile``` flags. - You can choose to only parse the file and check it for syntaxic errors using the ```--parse``` flag. Errors will be printed to stderr in a similar format to ```luac -p```. + You can choose to only parse the file and check it for syntaxic errors using the ```-parse``` flag. Errors will be printed to stderr in a similar format to ```luac -p```. - The ```--ast``` flag is also available for debugging, and will disable preprocessing, compiling and file writing, and instead directly dump the AST generated from the input file(s) to stdout. + The ```-ast``` flag is also available for debugging, and will disable preprocessing, compiling and file writing, and instead directly dump the AST generated from the input file(s) to stdout. Instead of providing filenames, you can use ```-``` to read from standard input. - You can change the compiler target using `--target` or `-t`: `--target luajit`. - - You can change the identation and newline string using `--indentation` and `--newline`: `--identation luajit`. - - You can change Candran's built-in variable prefix using `--variable-prefix`: `--variable-prefix __CAN_`. - - You can disable line mapping (error rewriting will not work) using `--no-map-lines`. - - You can disable built-in macros using `--no-builtin-macros`. - - You can define preprocessor constants using `--define` or `-D`: `--define VAR 5`. `VAR` will be available and set to 5 in the preprocessor. If you specify no value, it defaults to true. - - You can statically import modules using `--import` or `-I`: `--import module`. The module will be imported in compiled files using `#import("module",{loadLocal=false})`. - - You can disable error rewriting using `--no-rewrite-errors`. - - You can change the chunkname using `--chunkname`: `--chunkname filename`. This will change the filenames are reported in errors. By default, try to use the current file name, or stdin when using `-`. - - Use the ```-h``` or ```--help``` option to display the help text. + Use the ```-h``` or ```-help``` option to display a short help text. Example uses: @@ -570,15 +506,15 @@ The library can be used standalone through the ```canc``` (for compiling Candran preprocess and compile _foo.can_ and write the result in _foo.lua_. - * ````canc --indentation " " foo.can```` + * ````canc indentation=" " foo.can```` preprocess and compile _foo.can_ with 2-space indentation (readable code!) and write the result in _foo.lua_. - * ````canc foo.can -d verbose --print | lua```` + * ````canc foo.can -verbose -print | lua```` - preprocess _foo.can_ with _verbose_ set to _true_ in the preprocessor, compile it and execute it. + preprocess _foo.can_ with _verbose_ set to _true_, compile it and execute it. - * ````canc --parse foo.can```` + * ````canc -parse foo.can```` checks foo.can for syntaxic errors. @@ -598,9 +534,7 @@ The library can be used standalone through the ```canc``` (for compiling Candran Instead of providing a filename, you can use ```-``` to read from standard input. - Use similar options as `canc`. - - Use the ```-h``` or ```-help``` option to display the help text. + Use the ```-h``` or ```-help``` option to display a short help text. * ```cancheck``` @@ -617,7 +551,7 @@ local f = io.open("foo.can") -- read the file foo.can local contents = f:read("*a") f:close() -local compiled = candran.make(contents, { DEBUG = true }) -- compile foo.can with DEBUG set to true +local compiled = candran.make(contents, { debug = true }) -- compile foo.can with debug set to true load(compiled)() -- execute! @@ -633,8 +567,8 @@ The table returned by _require("candran")_ gives you access to: ##### Compiler & preprocessor * ````candran.VERSION````: Candran's version string (e.g. `"0.10.0"`). -* ````candran.preprocess(code[, options])````: return the Candran code _code_, `macros` table. The code is preprocessed with the _options_ options table; `macros` is indented to be passed to `candran.compile` to apply the defined macros. In case of error, returns nil, error. -* ````candran.compile(code[, options[, macros]])````: return the Candran code compiled to Lua with the _options_ option table and the macros `macros` (table returned by the preprocessor); or nil, err in case of error. +* ````candran.preprocess(code[, options])````: return the Candran code _code_, preprocessed with the _options_ options table; or nil, err in case of error. +* ````candran.compile(code[, options])````: return the Candran code compiled to Lua with the _options_ option table; or nil, err in case of error. * ````candran.make(code[, options])````: return the Candran code, preprocessed and compiled with the _options_ options table; or nil, err in case of error. ##### Code loading helpers @@ -685,16 +619,13 @@ at the top of your main Lua file. If a Candran file is found when you call ```re You can give arbitrary options to the compiler and preprocessor, but Candran already provide and uses these with their associated default values: ```lua -target = "lua53" -- compiler target. "lua54", "lua53", "lua52", "luajit" or "lua51" (default is automatically selected based on the Lua version used). +target = "lua53" -- compiler target. "lua53", "lua52", "luajit" or "lua51" (default is automatically selected based on the Lua version used). indentation = "" -- character(s) used for indentation in the compiled file. newline = "\n" -- character(s) used for newlines in the compiled file. variablePrefix = "__CAN_" -- Prefix used when Candran needs to set a local variable to provide some functionality (example: to load LuaJIT's bit lib when using bitwise operators). mapLines = true -- if true, compiled files will contain comments at the end of each line indicating the associated line and source file. Needed for error rewriting. chunkname = "nil" -- the chunkname used when running code using the helper functions and writing the line origin comments. Candran will try to set it to the original filename if it knows it. rewriteErrors = true -- true to enable error rewriting when loading code using the helper functions. Will wrap the whole code in a xpcall(). -builtInMacros = true -- false to disable built-in macros __*__ -preprocessorEnv = {} -- environment to merge with the preprocessor environement -import = {} -- list of modules to automatically import in compiled files (using #import("module",{loadLocal=false})) ``` You can change the defaults used for these variables in the table `candran.default`. diff --git a/bin/can b/bin/can index 6b62a3f..cad0270 100644 --- a/bin/can +++ b/bin/can @@ -1,31 +1,28 @@ #!/usr/bin/env lua local candran = require("candran").setup() -local util = require("candran.util") -local argparse = require("argparse") -local unpack = unpack or table.unpack +local cmdline = require("candran.cmdline") --- Parse args -- +local args = cmdline(arg) -local parser = argparse() - :name "can" - :description("Candran "..candran.VERSION.." interpreter by Reuh.") - :epilog "For more info, see https://github.com/Reuh/candran" - -parser:argument("filename", "Candran file to run. Use - to read from standard input. Start the REPL if no filename given.") - :args "?" - -util.cli.addCandranOptions(parser) - -local args = parser:parse() - -local options = util.cli.makeCandranOptions(args) - --- Run -- +if args.help or args.h then + print("Candran "..candran.VERSION.." interpreter by Reuh") + print("Usage: "..arg[0].." [options] filename") + print("Specify no options to start the REPL.") + print("Use - instead of a filename to read from the standard input.") + print("Interpreter options:") + print(" -help or -h print this text") + print("Default options:") + for opt, val in pairs(candran.default) do + if type(val) == "string" then val = val:gsub("\n", "\\n") end + print((" %s=%q"):format(opt, val)) + end + return +end -- stdin -if args.filename == "-" then - local f, err = candran.load(io.read("*a"), "stdin", nil, options) +if arg[#arg] == "-" then + local f, err = candran.load(io.read("*a"), "stdin", nil, args) if not f then io.stderr:write("can: "..err.."\n") os.exit(1) @@ -36,8 +33,8 @@ if args.filename == "-" then os.exit(1) end -- file -elseif args.filename then - local f, err = candran.loadfile(args.filename, nil, options) +elseif #args >= 1 then + local f, err = candran.loadfile(args[1], nil, args) if not f then io.stderr:write("can: "..err.."\n") os.exit(1) @@ -50,8 +47,6 @@ elseif args.filename then end -- REPL else - candran.default = util.merge(candran.default, options) - -- Setup linenoise local s, l = pcall(require, "linenoise") if not s then -- pure Lua compatibility thingy @@ -118,22 +113,6 @@ else print("Candran " .. candran.VERSION .. ", targeting " .. candran.default.target) candran.setup() - -- check errors in static import - -- note: static imports will be run every line, as preprocessors macros and constants aren't kept between compilations... - do - local r, e = candran.load("local _", "stdin") - if not r then - print("In static import: "..e) - candran.default.import = {} - else - r, e = pcall(r) - if not r then - print("In static import: "..e) - candran.default.import = {} - end - end - end - -- REPL loop local multiline = false -- true if wait for another line local buffer @@ -173,15 +152,15 @@ else end -- exec - local r, e = candran.load(buffer, "stdin") - if not r then - if e:match("expected '[end})]+' to close") then + local t = { pcall(candran.load, buffer, "stdin") } + if t[1] == false then + if t[2]:match("expected '[end})]+' to close") then multiline = true else - print(e) + print(t[2]) end else - local t = { pcall(r) } + t = { pcall(t[2]) } if t[1] == false then print(t[2]) elseif #t > 1 then diff --git a/bin/canc b/bin/canc index 35fb36c..b87cb8f 100644 --- a/bin/canc +++ b/bin/canc @@ -1,63 +1,48 @@ #!/usr/bin/env lua local candran = require("candran") +local cmdline = require("candran.cmdline") local parse = require("candran.can-parser.parser").parse local pp = require("candran.can-parser.pp") -local util = require("candran.util") -local argparse = require("argparse") --- Parse args -- +local args = cmdline(arg) -local parser = argparse() - :name "canc" - :description("Candran "..candran.VERSION.." compiler by Reuh.") - :epilog "For more info, see https://github.com/Reuh/candran" +if #arg < 1 or args.help or args.h then + print("Candran "..candran.VERSION.." compiler by Reuh") + print("Usage: "..arg[0].." [options] filenames...") + print("Use - instead of filenames to read from the standard input. The output file will be named stdin.lua by default.") + print("Compiler options:") + print(" dest=\"directory\" where compiled files should be written") + print(" out=\"name.lua\" output filename. By default, will use the same name as the input file with a .lua extension.") + print(" -print write to the standard output instead of creating files") + print(" -preprocess only run the preprocessor") + print(" -compile only run the compiler") + print(" -parse only parse the file and prints errors to stdout") + print(" -ast (for debugging purposes) only parse the files and dump the AST to stdout") + print(" -help or -h print this text") + print("Default options:") + for opt, val in pairs(candran.default) do + if type(val) == "string" then val = val:gsub("\n", "\\n") end + print((" %s=%q"):format(opt, val)) + end + return +end -parser:argument("filename", "Candran files to compile. Use - to read from standard input; the output file will then be named stdin.lua by default.") - :args "+" +if arg[#arg] == "-" then + table.insert(args, io.stdin) +end -parser:group("Output options", - parser:option("-d --destination") - :description "Where compiled files should be written" - :argname "directory", - - parser:option("-o --output") - :description "Output filename. (default: same name as the input file with a .lua extension)" - :argname "filename", - - parser:flag("-p --print") - :description "Write to the standard output instead of creating files", - - parser:flag("--preprocess") - :description "Only run the preprocessor", - - parser:flag("--compile") - :description "Only run the compiler", - - parser:flag("--parse") - :description "Only parse the file and prints syntax errors to stdout", - - parser:flag("--ast") - :description"(for debugging purposes) Only parse the files and dump the AST to stdout" -) - -util.cli.addCandranOptions(parser) - -local args = parser:parse() - --- Compile -- - -for _, file in ipairs(args.filename) do +for _, file in ipairs(args) do -- Read local dest, input - if file == "-" then - dest = args.output or "stdin.lua" + if file == io.stdin then + dest = args.out or "stdin.lua" input = io.read("*a") args.chunkname = "stdin" else - dest = args.output or (file:gsub("%.can$", "")..".lua") + dest = args.out or (file:gsub("%.can$", "")..".lua") local inputFile, err = io.open(file, "r") if not inputFile then @@ -84,10 +69,8 @@ for _, file in ipairs(args.filename) do end -- Compile and output - local options = util.cli.makeCandranOptions(args) - - if args.destination then - dest = args.destination .. "/" .. dest + if args.dest then + dest = args.dest .. "/" .. dest end if not args.print then @@ -96,7 +79,7 @@ for _, file in ipairs(args.filename) do local out = input if args.preprocess then - local r, err = candran.preprocess(out, options) + local r, err = candran.preprocess(out, args) if not r then io.stderr:write("canc: "..err.."\n") os.exit(1) @@ -104,7 +87,7 @@ for _, file in ipairs(args.filename) do out = r end if args.compile then - local r, err = candran.compile(out, options) + local r, err = candran.compile(out, args) if not r then io.stderr:write("canc: "..err.."\n") os.exit(1) @@ -112,7 +95,7 @@ for _, file in ipairs(args.filename) do out = r end if args.compile == nil and args.preprocess == nil then - local r, err = candran.make(input, options) + local r, err = candran.make(input, args) if not r then io.stderr:write("canc: "..err.."\n") os.exit(1) diff --git a/bin/cancheck b/bin/cancheck index 1d3950f..d9d3dcc 100644 --- a/bin/cancheck +++ b/bin/cancheck @@ -181,7 +181,6 @@ local oldRunner = runner.new function runner.new(opts) -- Disable max line length checking (it is compiled code...) opts.max_line_length = false - opts.ignore = { "4[23]1/__CAN_.*" } return oldRunner(opts) end diff --git a/candran.can b/candran.can index 78a7be4..57f115d 100644 --- a/candran.can +++ b/candran.can @@ -1,10 +1,5 @@ -local candran = { - VERSION = "1.0.0" -} -package.loaded["candran"] = candran - #import("candran.util") -#import("candran.serpent") +#import("candran.cmdline") #import("compiler.lua54") #import("compiler.lua53") @@ -19,6 +14,11 @@ package.loaded["candran"] = candran local unpack = unpack or table.unpack +local candran = { + VERSION = "0.14.0" +} +package.loaded["candran"] = candran + --- Default options. candran.default = { target = "lua54", @@ -27,10 +27,7 @@ candran.default = { variablePrefix = "__CAN_", mapLines = true, chunkname = "nil", - rewriteErrors = true, - builtInMacros = true, - preprocessorEnv = {}, - import = {} + rewriteErrors = true } -- Autodetect version @@ -50,20 +47,10 @@ end -- @tparam input string input code -- @tparam options table arguments for the preprocessor. They will be inserted into the preprocessor environement. -- @treturn[1] output string output code --- @treturn[1] macros registered macros -- @treturn[2] nil nil if error -- @treturn[2] error string error message -function candran.preprocess(input, options={}, _env) +function candran.preprocess(input, options={}) options = util.merge(candran.default, options) - local macros = { - functions = {}, - variables = {} - } - - -- add auto imports - for _, mod in ipairs(options.import) do - input =.. "#import(%q, {loadLocal=false})\n":format(mod) - end -- generate preprocessor code local preprocessor = "" @@ -98,8 +85,7 @@ function candran.preprocess(input, options={}, _env) preprocessor ..= "return output" -- make preprocessor environement - local exportenv = {} - local env = util.merge(_G, options.preprocessorEnv) + local env = util.merge(_G, options) --- Candran library table env.candran = candran --- Current preprocessor output @@ -118,10 +104,7 @@ function candran.preprocess(input, options={}, _env) if not f then error("can't open the module file to import") end margs = util.merge(options, { chunkname = filepath, loadLocal = true, loadPackage = true }, margs) - margs.import = {} -- no need for recursive import - local modcontent, modmacros, modenv = assert(candran.preprocess(f:read("*a"), margs)) - macros = util.recmerge(macros, modmacros) - for k, v in pairs(modenv) do env[k] = v end + local modcontent = assert(candran.preprocess(f:read("*a"), margs)) f:close() -- get module name (ex: module name of path.to.module is module) @@ -157,48 +140,6 @@ function candran.preprocess(input, options={}, _env) env.write(env[name]) end end - env.define = function(identifier, replacement) - -- parse identifier - local iast, ierr = parser.parsemacroidentifier(identifier, options.chunkname) - if not iast then - return error("in macro identifier: %s":format(tostring(ierr))) - end - -- parse replacement value - if type(replacement) == "string" then - local rast, rerr = parser.parse(replacement, options.chunkname) - if not rast then - return error("in macro replacement: %s":format(tostring(rerr))) - end - -- when giving a single value as a replacement, bypass the implicit push - if #rast == 1 and rast[1].tag == "Push" and rast[1].implicit then - rast = rast[1][1] - end - replacement = rast - elseif type(replacement) ~= "function" then - error("bad argument #2 to 'define' (string or function expected)") - end - -- add macros - if iast.tag == "MacroFunction" then - macros.functions[iast[1][1]] = { args = iast[2], replacement = replacement } - elseif iast.tag == "Id" then - macros.variables[iast[1]] = replacement - else - error("invalid macro type %s":format(tostring(iast.tag))) - end - end - env.set = function(identifier, value) - exportenv[identifier] = value - env[identifier] = value - end - - -- default macros - if options.builtInMacros then - env.define("__STR__(x)", function(x) return ("%q"):format(x) end) - local s = require("candran.serpent") - env.define("__CONSTEXPR__(expr)", function(expr) - return s.block(assert(candran.load(expr))(), {fatal = true}) - end) - end -- compile & load preprocessor local preprocess, err = candran.compile(preprocessor, options) @@ -217,17 +158,16 @@ function candran.preprocess(input, options={}, _env) return nil, "in preprocessor: "..output end - return output, macros, exportenv + return output end --- Run the compiler -- @tparam input string input code -- @tparam options table options for the compiler --- @tparam macros table defined macros, as returned by the preprocessor -- @treturn[1] output string output code -- @treturn[2] nil nil if error -- @treturn[2] error string error message -function candran.compile(input, options={}, macros) +function candran.compile(input, options={}) options = util.merge(candran.default, options) local ast, errmsg = parser.parse(input, options.chunkname) @@ -236,7 +176,7 @@ function candran.compile(input, options={}, macros) return nil, errmsg end - return require("compiler."..options.target)(input, ast, options, macros) + return require("compiler."..options.target)(input, ast, options) end --- Preprocess & compile code @@ -248,7 +188,7 @@ end function candran.make(code, options) local r, err = candran.preprocess(code, options) if r then - r, err = candran.compile(r, options, err) + r, err = candran.compile(r, options) if r then return r end @@ -263,7 +203,7 @@ local codeCache = {} function candran.loadfile(filepath, env, options) local f, err = io.open(filepath) if not f then - return nil, "cannot open %s":format(tostring(err)) + return nil, "cannot open %s":format(err) end local content = f:read("*a") f:close() @@ -326,7 +266,6 @@ end --- Candran error message handler. -- Use it in xpcall to rewrite stacktraces to display Candran source file lines instead of compiled Lua lines. function candran.messageHandler(message, noTraceback) - message = tostring(message) if not noTraceback and not message:match("\nstack traceback:\n") then message = debug.traceback(message, 2) end @@ -382,7 +321,7 @@ function candran.searcher(modpath) if r then return r(modpath, filepath) else - error("error loading candran module '%s' from file '%s':\n\t%s":format(modpath, filepath, tostring(s)), 0) + error("error loading candran module '%s' from file '%s':\n\t%s":format(modpath, filepath, s), 0) end end, filepath end diff --git a/candran.lua b/candran.lua index f3945ad..51a26ad 100644 --- a/candran.lua +++ b/candran.lua @@ -1,2225 +1,1852 @@ -local candran = { ["VERSION"] = "1.0.0" } -- candran.can:2 -package["loaded"]["candran"] = candran -- candran.can:4 -local function _() -- candran.can:7 -local candran = require("candran") -- ./candran/util.can:1 -local util = {} -- ./candran/util.can:2 -util["search"] = function(modpath, exts) -- ./candran/util.can:4 -if exts == nil then exts = {} end -- ./candran/util.can:4 -for _, ext in ipairs(exts) do -- ./candran/util.can:5 -for path in package["path"]:gmatch("[^;]+") do -- ./candran/util.can:6 -local fpath = path:gsub("%.lua", "." .. ext):gsub("%?", (modpath:gsub("%.", "/"))) -- ./candran/util.can:7 -local f = io["open"](fpath) -- ./candran/util.can:8 -if f then -- ./candran/util.can:9 -f:close() -- ./candran/util.can:10 -return fpath -- ./candran/util.can:11 -end -- ./candran/util.can:11 -end -- ./candran/util.can:11 -end -- ./candran/util.can:11 -end -- ./candran/util.can:11 -util["load"] = function(str, name, env) -- ./candran/util.can:17 -if _VERSION == "Lua 5.1" then -- ./candran/util.can:18 -local fn, err = loadstring(str, name) -- ./candran/util.can:19 -if not fn then -- ./candran/util.can:20 -return fn, err -- ./candran/util.can:20 -end -- ./candran/util.can:20 -return env ~= nil and setfenv(fn, env) or fn -- ./candran/util.can:21 -else -- ./candran/util.can:21 -if env then -- ./candran/util.can:23 -return load(str, name, nil, env) -- ./candran/util.can:24 -else -- ./candran/util.can:24 -return load(str, name) -- ./candran/util.can:26 -end -- ./candran/util.can:26 -end -- ./candran/util.can:26 -end -- ./candran/util.can:26 -util["recmerge"] = function(...) -- ./candran/util.can:31 -local r = {} -- ./candran/util.can:32 -for _, t in ipairs({ ... }) do -- ./candran/util.can:33 -for k, v in pairs(t) do -- ./candran/util.can:34 -if type(v) == "table" then -- ./candran/util.can:35 -r[k] = util["merge"](v, r[k]) -- ./candran/util.can:36 -else -- ./candran/util.can:36 -r[k] = v -- ./candran/util.can:38 -end -- ./candran/util.can:38 -end -- ./candran/util.can:38 -end -- ./candran/util.can:38 -return r -- ./candran/util.can:42 -end -- ./candran/util.can:42 -util["merge"] = function(...) -- ./candran/util.can:45 -local r = {} -- ./candran/util.can:46 -for _, t in ipairs({ ... }) do -- ./candran/util.can:47 -for k, v in pairs(t) do -- ./candran/util.can:48 -r[k] = v -- ./candran/util.can:49 -end -- ./candran/util.can:49 -end -- ./candran/util.can:49 -return r -- ./candran/util.can:52 -end -- ./candran/util.can:52 -util["cli"] = { -- ./candran/util.can:55 -["addCandranOptions"] = function(parser) -- ./candran/util.can:57 -parser:group("Compiler options", parser:option("-t --target"):description("Target Lua version: lua54, lua53, lua52, luajit or lua51"):default(candran["default"]["target"]), parser:option("--indentation"):description("Character(s) used for indentation in the compiled file"):default(candran["default"]["indentation"]), parser:option("--newline"):description("Character(s) used for newlines in the compiled file"):default(candran["default"]["newline"]), parser:option("--variable-prefix"):description("Prefix used when Candran needs to set a local variable to provide some functionality"):default(candran["default"]["variablePrefix"]), parser:flag("--no-map-lines"):description("Do not add comments at the end of each line indicating the associated source line and file (error rewriting will not work)")) -- ./candran/util.can:76 -parser:group("Preprocessor options", parser:flag("--no-builtin-macros"):description("Disable built-in macros"), parser:option("-D --define"):description("Define a preprocessor constant"):args("1-2"):argname({ -- ./candran/util.can:86 -"name", -- ./candran/util.can:86 -"value" -- ./candran/util.can:86 -}):count("*"), parser:option("-I --import"):description("Statically import a module into the compiled file"):argname("module"):count("*")) -- ./candran/util.can:92 -parser:option("--chunkname"):description("Chunkname used when running the code") -- ./candran/util.can:96 -parser:flag("--no-rewrite-errors"):description("Disable error rewriting when running the code") -- ./candran/util.can:99 -end, -- ./candran/util.can:99 -["makeCandranOptions"] = function(args) -- ./candran/util.can:103 -local preprocessorEnv = {} -- ./candran/util.can:104 -for _, o in ipairs(args["define"]) do -- ./candran/util.can:105 -preprocessorEnv[o[1]] = tonumber(o[2]) or o[2] or true -- ./candran/util.can:106 -end -- ./candran/util.can:106 -local options = { -- ./candran/util.can:109 -["target"] = args["target"], -- ./candran/util.can:110 -["indentation"] = args["indentation"], -- ./candran/util.can:111 -["newline"] = args["newline"], -- ./candran/util.can:112 -["variablePrefix"] = args["variable_prefix"], -- ./candran/util.can:113 -["mapLines"] = not args["no_map_lines"], -- ./candran/util.can:114 -["chunkname"] = args["chunkname"], -- ./candran/util.can:115 -["rewriteErrors"] = not args["no_rewrite_errors"], -- ./candran/util.can:116 -["builtInMacros"] = not args["no_builtin_macros"], -- ./candran/util.can:117 -["preprocessorEnv"] = preprocessorEnv, -- ./candran/util.can:118 -["import"] = args["import"] -- ./candran/util.can:119 -} -- ./candran/util.can:119 -return options -- ./candran/util.can:121 -end -- ./candran/util.can:121 -} -- ./candran/util.can:121 -return util -- ./candran/util.can:125 -end -- ./candran/util.can:125 -local util = _() or util -- ./candran/util.can:129 -package["loaded"]["candran.util"] = util or true -- ./candran/util.can:130 -local function _() -- ./candran/util.can:133 -local n, v = "serpent", "0.302" -- ./candran/serpent.lua:24 -local c, d = "Paul Kulchenko", "Lua serializer and pretty printer" -- ./candran/serpent.lua:25 -local snum = { -- ./candran/serpent.lua:26 -[tostring(1 / 0)] = "1/0 --[[math.huge]]", -- ./candran/serpent.lua:26 -[tostring(- 1 / 0)] = "-1/0 --[[-math.huge]]", -- ./candran/serpent.lua:26 -[tostring(0 / 0)] = "0/0" -- ./candran/serpent.lua:26 -} -- ./candran/serpent.lua:26 -local badtype = { -- ./candran/serpent.lua:27 -["thread"] = true, -- ./candran/serpent.lua:27 -["userdata"] = true, -- ./candran/serpent.lua:27 -["cdata"] = true -- ./candran/serpent.lua:27 -} -- ./candran/serpent.lua:27 -local getmetatable = debug and debug["getmetatable"] or getmetatable -- ./candran/serpent.lua:28 -local pairs = function(t) -- ./candran/serpent.lua:29 -return next, t -- ./candran/serpent.lua:29 -end -- ./candran/serpent.lua:29 -local keyword, globals, G = {}, {}, (_G or _ENV) -- ./candran/serpent.lua:30 -for _, k in ipairs({ -- ./candran/serpent.lua:31 -"and", -- ./candran/serpent.lua:31 -"break", -- ./candran/serpent.lua:31 -"do", -- ./candran/serpent.lua:31 -"else", -- ./candran/serpent.lua:31 -"elseif", -- ./candran/serpent.lua:31 -"end", -- ./candran/serpent.lua:31 -"false", -- ./candran/serpent.lua:31 -"for", -- ./candran/serpent.lua:32 -"function", -- ./candran/serpent.lua:32 -"goto", -- ./candran/serpent.lua:32 -"if", -- ./candran/serpent.lua:32 -"in", -- ./candran/serpent.lua:32 -"local", -- ./candran/serpent.lua:32 -"nil", -- ./candran/serpent.lua:32 -"not", -- ./candran/serpent.lua:32 -"or", -- ./candran/serpent.lua:32 -"repeat", -- ./candran/serpent.lua:32 -"return", -- ./candran/serpent.lua:33 -"then", -- ./candran/serpent.lua:33 -"true", -- ./candran/serpent.lua:33 -"until", -- ./candran/serpent.lua:33 -"while" -- ./candran/serpent.lua:33 -}) do -- ./candran/serpent.lua:33 -keyword[k] = true -- ./candran/serpent.lua:33 -end -- ./candran/serpent.lua:33 -for k, v in pairs(G) do -- ./candran/serpent.lua:34 -globals[v] = k -- ./candran/serpent.lua:34 -end -- ./candran/serpent.lua:34 -for _, g in ipairs({ -- ./candran/serpent.lua:35 -"coroutine", -- ./candran/serpent.lua:35 -"debug", -- ./candran/serpent.lua:35 -"io", -- ./candran/serpent.lua:35 -"math", -- ./candran/serpent.lua:35 -"string", -- ./candran/serpent.lua:35 -"table", -- ./candran/serpent.lua:35 -"os" -- ./candran/serpent.lua:35 -}) do -- ./candran/serpent.lua:35 -for k, v in pairs(type(G[g]) == "table" and G[g] or {}) do -- ./candran/serpent.lua:36 -globals[v] = g .. "." .. k -- ./candran/serpent.lua:36 -end -- ./candran/serpent.lua:36 -end -- ./candran/serpent.lua:36 -local function s(t, opts) -- ./candran/serpent.lua:38 -local name, indent, fatal, maxnum = opts["name"], opts["indent"], opts["fatal"], opts["maxnum"] -- ./candran/serpent.lua:39 -local sparse, custom, huge = opts["sparse"], opts["custom"], not opts["nohuge"] -- ./candran/serpent.lua:40 -local space, maxl = (opts["compact"] and "" or " "), (opts["maxlevel"] or math["huge"]) -- ./candran/serpent.lua:41 -local maxlen, metatostring = tonumber(opts["maxlength"]), opts["metatostring"] -- ./candran/serpent.lua:42 -local iname, comm = "_" .. (name or ""), opts["comment"] and (tonumber(opts["comment"]) or math["huge"]) -- ./candran/serpent.lua:43 -local numformat = opts["numformat"] or "%.17g" -- ./candran/serpent.lua:44 -local seen, sref, syms, symn = {}, { "local " .. iname .. "={}" }, {}, 0 -- ./candran/serpent.lua:45 -local function gensym(val) -- ./candran/serpent.lua:46 -return "_" .. (tostring(tostring(val)):gsub("[^%w]", ""):gsub("(%d%w+)", function(s) -- ./candran/serpent.lua:48 -if not syms[s] then -- ./candran/serpent.lua:48 -symn = symn + 1 -- ./candran/serpent.lua:48 -syms[s] = symn -- ./candran/serpent.lua:48 -end -- ./candran/serpent.lua:48 -return tostring(syms[s]) -- ./candran/serpent.lua:48 -end)) -- ./candran/serpent.lua:48 -end -- ./candran/serpent.lua:48 -local function safestr(s) -- ./candran/serpent.lua:49 -return type(s) == "number" and tostring(huge and snum[tostring(s)] or numformat:format(s)) or type(s) ~= "string" and tostring(s) or ("%q"):format(s):gsub("\ -", "n"):gsub("\26", "\\026") -- ./candran/serpent.lua:51 -end -- ./candran/serpent.lua:51 -local function comment(s, l) -- ./candran/serpent.lua:52 -return comm and (l or 0) < comm and " --[[" .. select(2, pcall(tostring, s)) .. "]]" or "" -- ./candran/serpent.lua:52 -end -- ./candran/serpent.lua:52 -local function globerr(s, l) -- ./candran/serpent.lua:53 -return globals[s] and globals[s] .. comment(s, l) or not fatal and safestr(select(2, pcall(tostring, s))) or error("Can't serialize " .. tostring(s)) -- ./candran/serpent.lua:54 -end -- ./candran/serpent.lua:54 -local function safename(path, name) -- ./candran/serpent.lua:55 -local n = name == nil and "" or name -- ./candran/serpent.lua:56 -local plain = type(n) == "string" and n:match("^[%l%u_][%w_]*$") and not keyword[n] -- ./candran/serpent.lua:57 -local safe = plain and n or "[" .. safestr(n) .. "]" -- ./candran/serpent.lua:58 -return (path or "") .. (plain and path and "." or "") .. safe, safe -- ./candran/serpent.lua:59 -end -- ./candran/serpent.lua:59 -local alphanumsort = type(opts["sortkeys"]) == "function" and opts["sortkeys"] or function(k, o, n) -- ./candran/serpent.lua:60 -local maxn, to = tonumber(n) or 12, { -- ./candran/serpent.lua:61 -["number"] = "a", -- ./candran/serpent.lua:61 -["string"] = "b" -- ./candran/serpent.lua:61 -} -- ./candran/serpent.lua:61 -local function padnum(d) -- ./candran/serpent.lua:62 -return ("%0" .. tostring(maxn) .. "d"):format(tonumber(d)) -- ./candran/serpent.lua:62 -end -- ./candran/serpent.lua:62 -table["sort"](k, function(a, b) -- ./candran/serpent.lua:63 -return (k[a] ~= nil and 0 or to[type(a)] or "z") .. (tostring(a):gsub("%d+", padnum)) < (k[b] ~= nil and 0 or to[type(b)] or "z") .. (tostring(b):gsub("%d+", padnum)) -- ./candran/serpent.lua:66 -end) -- ./candran/serpent.lua:66 -end -- ./candran/serpent.lua:66 -local function val2str(t, name, indent, insref, path, plainindex, level) -- ./candran/serpent.lua:67 -local ttype, level, mt = type(t), (level or 0), getmetatable(t) -- ./candran/serpent.lua:68 -local spath, sname = safename(path, name) -- ./candran/serpent.lua:69 -local tag = plainindex and ((type(name) == "number") and "" or name .. space .. "=" .. space) or (name ~= nil and sname .. space .. "=" .. space or "") -- ./candran/serpent.lua:72 -if seen[t] then -- ./candran/serpent.lua:73 -sref[# sref + 1] = spath .. space .. "=" .. space .. seen[t] -- ./candran/serpent.lua:74 -return tag .. "nil" .. comment("ref", level) -- ./candran/serpent.lua:75 -end -- ./candran/serpent.lua:75 -if type(mt) == "table" and metatostring ~= false then -- ./candran/serpent.lua:77 -local to, tr = pcall(function() -- ./candran/serpent.lua:78 -return mt["__tostring"](t) -- ./candran/serpent.lua:78 -end) -- ./candran/serpent.lua:78 -local so, sr = pcall(function() -- ./candran/serpent.lua:79 -return mt["__serialize"](t) -- ./candran/serpent.lua:79 -end) -- ./candran/serpent.lua:79 -if (to or so) then -- ./candran/serpent.lua:80 -seen[t] = insref or spath -- ./candran/serpent.lua:81 -t = so and sr or tr -- ./candran/serpent.lua:82 -ttype = type(t) -- ./candran/serpent.lua:83 -end -- ./candran/serpent.lua:83 -end -- ./candran/serpent.lua:83 -if ttype == "table" then -- ./candran/serpent.lua:86 -if level >= maxl then -- ./candran/serpent.lua:87 -return tag .. "{}" .. comment("maxlvl", level) -- ./candran/serpent.lua:87 -end -- ./candran/serpent.lua:87 -seen[t] = insref or spath -- ./candran/serpent.lua:88 -if next(t) == nil then -- ./candran/serpent.lua:89 -return tag .. "{}" .. comment(t, level) -- ./candran/serpent.lua:89 -end -- ./candran/serpent.lua:89 -if maxlen and maxlen < 0 then -- ./candran/serpent.lua:90 -return tag .. "{}" .. comment("maxlen", level) -- ./candran/serpent.lua:90 -end -- ./candran/serpent.lua:90 -local maxn, o, out = math["min"](# t, maxnum or # t), {}, {} -- ./candran/serpent.lua:91 -for key = 1, maxn do -- ./candran/serpent.lua:92 -o[key] = key -- ./candran/serpent.lua:92 -end -- ./candran/serpent.lua:92 -if not maxnum or # o < maxnum then -- ./candran/serpent.lua:93 -local n = # o -- ./candran/serpent.lua:94 -for key in pairs(t) do -- ./candran/serpent.lua:95 -if o[key] ~= key then -- ./candran/serpent.lua:95 -n = n + 1 -- ./candran/serpent.lua:95 -o[n] = key -- ./candran/serpent.lua:95 -end -- ./candran/serpent.lua:95 -end -- ./candran/serpent.lua:95 -end -- ./candran/serpent.lua:95 -if maxnum and # o > maxnum then -- ./candran/serpent.lua:96 -o[maxnum + 1] = nil -- ./candran/serpent.lua:96 -end -- ./candran/serpent.lua:96 -if opts["sortkeys"] and # o > maxn then -- ./candran/serpent.lua:97 -alphanumsort(o, t, opts["sortkeys"]) -- ./candran/serpent.lua:97 -end -- ./candran/serpent.lua:97 -local sparse = sparse and # o > maxn -- ./candran/serpent.lua:98 -for n, key in ipairs(o) do -- ./candran/serpent.lua:99 -local value, ktype, plainindex = t[key], type(key), n <= maxn and not sparse -- ./candran/serpent.lua:100 -if opts["valignore"] and opts["valignore"][value] or opts["keyallow"] and not opts["keyallow"][key] or opts["keyignore"] and opts["keyignore"][key] or opts["valtypeignore"] and opts["valtypeignore"][type(value)] or sparse and value == nil then -- ./candran/serpent.lua:105 - -- ./candran/serpent.lua:106 -elseif ktype == "table" or ktype == "function" or badtype[ktype] then -- ./candran/serpent.lua:106 -if not seen[key] and not globals[key] then -- ./candran/serpent.lua:107 -sref[# sref + 1] = "placeholder" -- ./candran/serpent.lua:108 -local sname = safename(iname, gensym(key)) -- ./candran/serpent.lua:109 -sref[# sref] = val2str(key, sname, indent, sname, iname, true) -- ./candran/serpent.lua:110 -end -- ./candran/serpent.lua:110 -sref[# sref + 1] = "placeholder" -- ./candran/serpent.lua:111 -local path = seen[t] .. "[" .. tostring(seen[key] or globals[key] or gensym(key)) .. "]" -- ./candran/serpent.lua:112 -sref[# sref] = path .. space .. "=" .. space .. tostring(seen[value] or val2str(value, nil, indent, path)) -- ./candran/serpent.lua:113 -else -- ./candran/serpent.lua:113 -out[# out + 1] = val2str(value, key, indent, nil, seen[t], plainindex, level + 1) -- ./candran/serpent.lua:115 -if maxlen then -- ./candran/serpent.lua:116 -maxlen = maxlen - # out[# out] -- ./candran/serpent.lua:117 -if maxlen < 0 then -- ./candran/serpent.lua:118 -break -- ./candran/serpent.lua:118 -end -- ./candran/serpent.lua:118 -end -- ./candran/serpent.lua:118 -end -- ./candran/serpent.lua:118 -end -- ./candran/serpent.lua:118 -local prefix = string["rep"](indent or "", level) -- ./candran/serpent.lua:122 -local head = indent and "{\ -" .. prefix .. indent or "{" -- ./candran/serpent.lua:123 -local body = table["concat"](out, "," .. (indent and "\ -" .. prefix .. indent or space)) -- ./candran/serpent.lua:124 -local tail = indent and "\ -" .. prefix .. "}" or "}" -- ./candran/serpent.lua:125 -return (custom and custom(tag, head, body, tail, level) or tag .. head .. body .. tail) .. comment(t, level) -- ./candran/serpent.lua:126 -elseif badtype[ttype] then -- ./candran/serpent.lua:127 -seen[t] = insref or spath -- ./candran/serpent.lua:128 -return tag .. globerr(t, level) -- ./candran/serpent.lua:129 -elseif ttype == "function" then -- ./candran/serpent.lua:130 -seen[t] = insref or spath -- ./candran/serpent.lua:131 -if opts["nocode"] then -- ./candran/serpent.lua:132 -return tag .. "function() --[[..skipped..]] end" .. comment(t, level) -- ./candran/serpent.lua:132 -end -- ./candran/serpent.lua:132 -local ok, res = pcall(string["dump"], t) -- ./candran/serpent.lua:133 -local func = ok and "((loadstring or load)(" .. safestr(res) .. ",'@serialized'))" .. comment(t, level) -- ./candran/serpent.lua:134 -return tag .. (func or globerr(t, level)) -- ./candran/serpent.lua:135 -else -- ./candran/serpent.lua:135 -return tag .. safestr(t) -- ./candran/serpent.lua:136 -end -- ./candran/serpent.lua:136 -end -- ./candran/serpent.lua:136 -local sepr = indent and "\ -" or ";" .. space -- ./candran/serpent.lua:138 -local body = val2str(t, name, indent) -- ./candran/serpent.lua:139 -local tail = # sref > 1 and table["concat"](sref, sepr) .. sepr or "" -- ./candran/serpent.lua:140 -local warn = opts["comment"] and # sref > 1 and space .. "--[[incomplete output with shared/self-references skipped]]" or "" -- ./candran/serpent.lua:141 -return not name and body .. warn or "do local " .. body .. sepr .. tail .. "return " .. name .. sepr .. "end" -- ./candran/serpent.lua:142 -end -- ./candran/serpent.lua:142 -local function deserialize(data, opts) -- ./candran/serpent.lua:145 -local env = (opts and opts["safe"] == false) and G or setmetatable({}, { -- ./candran/serpent.lua:147 -["__index"] = function(t, k) -- ./candran/serpent.lua:148 -return t -- ./candran/serpent.lua:148 -end, -- ./candran/serpent.lua:148 -["__call"] = function(t, ...) -- ./candran/serpent.lua:149 -error("cannot call functions") -- ./candran/serpent.lua:149 -end -- ./candran/serpent.lua:149 -}) -- ./candran/serpent.lua:149 -local f, res = (loadstring or load)("return " .. data, nil, nil, env) -- ./candran/serpent.lua:151 -if not f then -- ./candran/serpent.lua:152 -f, res = (loadstring or load)(data, nil, nil, env) -- ./candran/serpent.lua:152 -end -- ./candran/serpent.lua:152 -if not f then -- ./candran/serpent.lua:153 -return f, res -- ./candran/serpent.lua:153 -end -- ./candran/serpent.lua:153 -if setfenv then -- ./candran/serpent.lua:154 -setfenv(f, env) -- ./candran/serpent.lua:154 -end -- ./candran/serpent.lua:154 -return pcall(f) -- ./candran/serpent.lua:155 -end -- ./candran/serpent.lua:155 -local function merge(a, b) -- ./candran/serpent.lua:158 -if b then -- ./candran/serpent.lua:158 -for k, v in pairs(b) do -- ./candran/serpent.lua:158 -a[k] = v -- ./candran/serpent.lua:158 -end -- ./candran/serpent.lua:158 -end -- ./candran/serpent.lua:158 -return a -- ./candran/serpent.lua:158 -end -- ./candran/serpent.lua:158 -return { -- ./candran/serpent.lua:159 -["_NAME"] = n, -- ./candran/serpent.lua:159 -["_COPYRIGHT"] = c, -- ./candran/serpent.lua:159 -["_DESCRIPTION"] = d, -- ./candran/serpent.lua:159 -["_VERSION"] = v, -- ./candran/serpent.lua:159 -["serialize"] = s, -- ./candran/serpent.lua:159 -["load"] = deserialize, -- ./candran/serpent.lua:160 -["dump"] = function(a, opts) -- ./candran/serpent.lua:161 -return s(a, merge({ -- ./candran/serpent.lua:161 -["name"] = "_", -- ./candran/serpent.lua:161 -["compact"] = true, -- ./candran/serpent.lua:161 -["sparse"] = true -- ./candran/serpent.lua:161 -}, opts)) -- ./candran/serpent.lua:161 -end, -- ./candran/serpent.lua:161 -["line"] = function(a, opts) -- ./candran/serpent.lua:162 -return s(a, merge({ -- ./candran/serpent.lua:162 -["sortkeys"] = true, -- ./candran/serpent.lua:162 -["comment"] = true -- ./candran/serpent.lua:162 -}, opts)) -- ./candran/serpent.lua:162 -end, -- ./candran/serpent.lua:162 -["block"] = function(a, opts) -- ./candran/serpent.lua:163 -return s(a, merge({ -- ./candran/serpent.lua:163 -["indent"] = " ", -- ./candran/serpent.lua:163 -["sortkeys"] = true, -- ./candran/serpent.lua:163 -["comment"] = true -- ./candran/serpent.lua:163 -}, opts)) -- ./candran/serpent.lua:163 -end -- ./candran/serpent.lua:163 -} -- ./candran/serpent.lua:163 -end -- ./candran/serpent.lua:163 -local serpent = _() or serpent -- ./candran/serpent.lua:167 -package["loaded"]["candran.serpent"] = serpent or true -- ./candran/serpent.lua:168 -local function _() -- ./candran/serpent.lua:172 -local util = require("candran.util") -- ./compiler/lua54.can:1 -local targetName = "Lua 5.4" -- ./compiler/lua54.can:3 -local unpack = unpack or table["unpack"] -- ./compiler/lua54.can:5 -return function(code, ast, options, macros) -- ./compiler/lua54.can:7 -if macros == nil then macros = { -- ./compiler/lua54.can:7 -["functions"] = {}, -- ./compiler/lua54.can:7 -["variables"] = {} -- ./compiler/lua54.can:7 -} end -- ./compiler/lua54.can:7 -local lastInputPos = 1 -- ./compiler/lua54.can:9 -local prevLinePos = 1 -- ./compiler/lua54.can:10 -local lastSource = options["chunkname"] or "nil" -- ./compiler/lua54.can:11 -local lastLine = 1 -- ./compiler/lua54.can:12 -local indentLevel = 0 -- ./compiler/lua54.can:15 -local function newline() -- ./compiler/lua54.can:17 -local r = options["newline"] .. string["rep"](options["indentation"], indentLevel) -- ./compiler/lua54.can:18 -if options["mapLines"] then -- ./compiler/lua54.can:19 -local sub = code:sub(lastInputPos) -- ./compiler/lua54.can:20 +local function _() -- candran.can:2 +local util = {} -- ./candran/util.can:1 +util["search"] = function(modpath, exts) -- ./candran/util.can:3 +if exts == nil then exts = {} end -- ./candran/util.can:3 +for _, ext in ipairs(exts) do -- ./candran/util.can:4 +for path in package["path"]:gmatch("[^;]+") do -- ./candran/util.can:5 +local fpath = path:gsub("%.lua", "." .. ext):gsub("%?", (modpath:gsub("%.", "/"))) -- ./candran/util.can:6 +local f = io["open"](fpath) -- ./candran/util.can:7 +if f then -- ./candran/util.can:8 +f:close() -- ./candran/util.can:9 +return fpath -- ./candran/util.can:10 +end -- ./candran/util.can:10 +end -- ./candran/util.can:10 +end -- ./candran/util.can:10 +end -- ./candran/util.can:10 +util["load"] = function(str, name, env) -- ./candran/util.can:16 +if _VERSION == "Lua 5.1" then -- ./candran/util.can:17 +local fn, err = loadstring(str, name) -- ./candran/util.can:18 +if not fn then -- ./candran/util.can:19 +return fn, err -- ./candran/util.can:19 +end -- ./candran/util.can:19 +return env ~= nil and setfenv(fn, env) or fn -- ./candran/util.can:20 +else -- ./candran/util.can:20 +if env then -- ./candran/util.can:22 +return load(str, name, nil, env) -- ./candran/util.can:23 +else -- ./candran/util.can:23 +return load(str, name) -- ./candran/util.can:25 +end -- ./candran/util.can:25 +end -- ./candran/util.can:25 +end -- ./candran/util.can:25 +util["merge"] = function(...) -- ./candran/util.can:30 +local r = {} -- ./candran/util.can:31 +for _, t in ipairs({ ... }) do -- ./candran/util.can:32 +for k, v in pairs(t) do -- ./candran/util.can:33 +r[k] = v -- ./candran/util.can:34 +end -- ./candran/util.can:34 +end -- ./candran/util.can:34 +return r -- ./candran/util.can:37 +end -- ./candran/util.can:37 +return util -- ./candran/util.can:40 +end -- ./candran/util.can:40 +local util = _() or util -- ./candran/util.can:44 +package["loaded"]["candran.util"] = util or true -- ./candran/util.can:45 +local function _() -- ./candran/util.can:48 +local ipairs, pairs, setfenv, tonumber, loadstring, type = ipairs, pairs, setfenv, tonumber, loadstring, type -- ./candran/cmdline.lua:5 +local tinsert, tconcat = table["insert"], table["concat"] -- ./candran/cmdline.lua:6 +local function commonerror(msg) -- ./candran/cmdline.lua:8 +return nil, ("[cmdline]: " .. msg) -- ./candran/cmdline.lua:9 +end -- ./candran/cmdline.lua:9 +local function argerror(msg, numarg) -- ./candran/cmdline.lua:12 +msg = msg and (": " .. msg) or "" -- ./candran/cmdline.lua:13 +return nil, ("[cmdline]: bad argument #" .. numarg .. msg) -- ./candran/cmdline.lua:14 +end -- ./candran/cmdline.lua:14 +local function iderror(numarg) -- ./candran/cmdline.lua:17 +return argerror("ID not valid", numarg) -- ./candran/cmdline.lua:18 +end -- ./candran/cmdline.lua:18 +local function idcheck(id) -- ./candran/cmdline.lua:21 +return id:match("^[%a_][%w_]*$") and true -- ./candran/cmdline.lua:22 +end -- ./candran/cmdline.lua:22 +return function(t_in, options, params) -- ./candran/cmdline.lua:73 +local t_out = {} -- ./candran/cmdline.lua:74 +for i, v in ipairs(t_in) do -- ./candran/cmdline.lua:75 +local prefix, command = v:sub(1, 1), v:sub(2) -- ./candran/cmdline.lua:76 +if prefix == "$" then -- ./candran/cmdline.lua:77 +tinsert(t_out, command) -- ./candran/cmdline.lua:78 +elseif prefix == "-" then -- ./candran/cmdline.lua:79 +for id in command:gmatch("[^,;]+") do -- ./candran/cmdline.lua:80 +if not idcheck(id) then -- ./candran/cmdline.lua:81 +return iderror(i) -- ./candran/cmdline.lua:81 +end -- ./candran/cmdline.lua:81 +t_out[id] = true -- ./candran/cmdline.lua:82 +end -- ./candran/cmdline.lua:82 +elseif prefix == "!" then -- ./candran/cmdline.lua:84 +local f, err = loadstring(command) -- ./candran/cmdline.lua:85 +if not f then -- ./candran/cmdline.lua:86 +return argerror(err, i) -- ./candran/cmdline.lua:86 +end -- ./candran/cmdline.lua:86 +setfenv(f, t_out)() -- ./candran/cmdline.lua:87 +elseif v:find("=") then -- ./candran/cmdline.lua:88 +local ids, val = v:match("^([^=]+)%=(.*)") -- ./candran/cmdline.lua:89 +if not ids then -- ./candran/cmdline.lua:90 +return argerror("invalid assignment syntax", i) -- ./candran/cmdline.lua:90 +end -- ./candran/cmdline.lua:90 +if val == "false" then -- ./candran/cmdline.lua:91 +val = false -- ./candran/cmdline.lua:92 +elseif val == "true" then -- ./candran/cmdline.lua:93 +val = true -- ./candran/cmdline.lua:94 +else -- ./candran/cmdline.lua:94 +val = val:sub(1, 1) == "$" and val:sub(2) or tonumber(val) or val -- ./candran/cmdline.lua:96 +end -- ./candran/cmdline.lua:96 +for id in ids:gmatch("[^,;]+") do -- ./candran/cmdline.lua:98 +if not idcheck(id) then -- ./candran/cmdline.lua:99 +return iderror(i) -- ./candran/cmdline.lua:99 +end -- ./candran/cmdline.lua:99 +t_out[id] = val -- ./candran/cmdline.lua:100 +end -- ./candran/cmdline.lua:100 +else -- ./candran/cmdline.lua:100 +tinsert(t_out, v) -- ./candran/cmdline.lua:103 +end -- ./candran/cmdline.lua:103 +end -- ./candran/cmdline.lua:103 +if options then -- ./candran/cmdline.lua:106 +local lookup, unknown = {}, {} -- ./candran/cmdline.lua:107 +for _, v in ipairs(options) do -- ./candran/cmdline.lua:108 +lookup[v] = true -- ./candran/cmdline.lua:108 +end -- ./candran/cmdline.lua:108 +for k, _ in pairs(t_out) do -- ./candran/cmdline.lua:109 +if lookup[k] == nil and type(k) == "string" then -- ./candran/cmdline.lua:110 +tinsert(unknown, k) -- ./candran/cmdline.lua:110 +end -- ./candran/cmdline.lua:110 +end -- ./candran/cmdline.lua:110 +if # unknown > 0 then -- ./candran/cmdline.lua:112 +return commonerror("unknown options: " .. tconcat(unknown, ", ")) -- ./candran/cmdline.lua:113 +end -- ./candran/cmdline.lua:113 +end -- ./candran/cmdline.lua:113 +if params then -- ./candran/cmdline.lua:116 +local missing = {} -- ./candran/cmdline.lua:117 +for _, v in ipairs(params) do -- ./candran/cmdline.lua:118 +if t_out[v] == nil then -- ./candran/cmdline.lua:119 +tinsert(missing, v) -- ./candran/cmdline.lua:119 +end -- ./candran/cmdline.lua:119 +end -- ./candran/cmdline.lua:119 +if # missing > 0 then -- ./candran/cmdline.lua:121 +return commonerror("missing parameters: " .. tconcat(missing, ", ")) -- ./candran/cmdline.lua:122 +end -- ./candran/cmdline.lua:122 +end -- ./candran/cmdline.lua:122 +return t_out -- ./candran/cmdline.lua:125 +end -- ./candran/cmdline.lua:125 +end -- ./candran/cmdline.lua:125 +local cmdline = _() or cmdline -- ./candran/cmdline.lua:130 +package["loaded"]["candran.cmdline"] = cmdline or true -- ./candran/cmdline.lua:131 +local function _() -- ./candran/cmdline.lua:135 +local targetName = "Lua 5.4" -- ./compiler/lua54.can:1 +return function(code, ast, options) -- ./compiler/lua54.can:3 +local lastInputPos = 1 -- ./compiler/lua54.can:5 +local prevLinePos = 1 -- ./compiler/lua54.can:6 +local lastSource = options["chunkname"] or "nil" -- ./compiler/lua54.can:7 +local lastLine = 1 -- ./compiler/lua54.can:8 +local indentLevel = 0 -- ./compiler/lua54.can:11 +local function newline() -- ./compiler/lua54.can:13 +local r = options["newline"] .. string["rep"](options["indentation"], indentLevel) -- ./compiler/lua54.can:14 +if options["mapLines"] then -- ./compiler/lua54.can:15 +local sub = code:sub(lastInputPos) -- ./compiler/lua54.can:16 local source, line = sub:sub(1, sub:find("\ ")):match(".*%-%- (.-)%:(%d+)\ -") -- ./compiler/lua54.can:21 -if source and line then -- ./compiler/lua54.can:23 -lastSource = source -- ./compiler/lua54.can:24 -lastLine = tonumber(line) -- ./compiler/lua54.can:25 -else -- ./compiler/lua54.can:25 +") -- ./compiler/lua54.can:17 +if source and line then -- ./compiler/lua54.can:19 +lastSource = source -- ./compiler/lua54.can:20 +lastLine = tonumber(line) -- ./compiler/lua54.can:21 +else -- ./compiler/lua54.can:21 for _ in code:sub(prevLinePos, lastInputPos):gmatch("\ -") do -- ./compiler/lua54.can:27 -lastLine = lastLine + (1) -- ./compiler/lua54.can:28 -end -- ./compiler/lua54.can:28 -end -- ./compiler/lua54.can:28 -prevLinePos = lastInputPos -- ./compiler/lua54.can:32 -r = " -- " .. lastSource .. ":" .. lastLine .. r -- ./compiler/lua54.can:34 -end -- ./compiler/lua54.can:34 -return r -- ./compiler/lua54.can:36 -end -- ./compiler/lua54.can:36 -local function indent() -- ./compiler/lua54.can:39 -indentLevel = indentLevel + (1) -- ./compiler/lua54.can:40 -return newline() -- ./compiler/lua54.can:41 -end -- ./compiler/lua54.can:41 -local function unindent() -- ./compiler/lua54.can:44 -indentLevel = indentLevel - (1) -- ./compiler/lua54.can:45 -return newline() -- ./compiler/lua54.can:46 -end -- ./compiler/lua54.can:46 -local states = { -- ./compiler/lua54.can:51 -["push"] = {}, -- ./compiler/lua54.can:52 -["destructuring"] = {}, -- ./compiler/lua54.can:53 -["scope"] = {}, -- ./compiler/lua54.can:54 -["macroargs"] = {} -- ./compiler/lua54.can:55 -} -- ./compiler/lua54.can:55 -local function push(name, state) -- ./compiler/lua54.can:58 -table["insert"](states[name], state) -- ./compiler/lua54.can:59 +") do -- ./compiler/lua54.can:23 +lastLine = lastLine + (1) -- ./compiler/lua54.can:24 +end -- ./compiler/lua54.can:24 +end -- ./compiler/lua54.can:24 +prevLinePos = lastInputPos -- ./compiler/lua54.can:28 +r = " -- " .. lastSource .. ":" .. lastLine .. r -- ./compiler/lua54.can:30 +end -- ./compiler/lua54.can:30 +return r -- ./compiler/lua54.can:32 +end -- ./compiler/lua54.can:32 +local function indent() -- ./compiler/lua54.can:35 +indentLevel = indentLevel + (1) -- ./compiler/lua54.can:36 +return newline() -- ./compiler/lua54.can:37 +end -- ./compiler/lua54.can:37 +local function unindent() -- ./compiler/lua54.can:40 +indentLevel = indentLevel - (1) -- ./compiler/lua54.can:41 +return newline() -- ./compiler/lua54.can:42 +end -- ./compiler/lua54.can:42 +local states = { -- ./compiler/lua54.can:47 +["push"] = {}, -- ./compiler/lua54.can:48 +["destructuring"] = {}, -- ./compiler/lua54.can:49 +["scope"] = {} -- ./compiler/lua54.can:50 +} -- ./compiler/lua54.can:50 +local function push(name, state) -- ./compiler/lua54.can:53 +table["insert"](states[name], state) -- ./compiler/lua54.can:54 +return "" -- ./compiler/lua54.can:55 +end -- ./compiler/lua54.can:55 +local function pop(name) -- ./compiler/lua54.can:58 +table["remove"](states[name]) -- ./compiler/lua54.can:59 return "" -- ./compiler/lua54.can:60 end -- ./compiler/lua54.can:60 -local function pop(name) -- ./compiler/lua54.can:63 -table["remove"](states[name]) -- ./compiler/lua54.can:64 +local function set(name, state) -- ./compiler/lua54.can:63 +states[name][# states[name]] = state -- ./compiler/lua54.can:64 return "" -- ./compiler/lua54.can:65 end -- ./compiler/lua54.can:65 -local function set(name, state) -- ./compiler/lua54.can:68 -states[name][# states[name]] = state -- ./compiler/lua54.can:69 -return "" -- ./compiler/lua54.can:70 -end -- ./compiler/lua54.can:70 -local function peek(name) -- ./compiler/lua54.can:73 -return states[name][# states[name]] -- ./compiler/lua54.can:74 -end -- ./compiler/lua54.can:74 -local function var(name) -- ./compiler/lua54.can:79 -return options["variablePrefix"] .. name -- ./compiler/lua54.can:80 -end -- ./compiler/lua54.can:80 -local function tmp() -- ./compiler/lua54.can:84 -local scope = peek("scope") -- ./compiler/lua54.can:85 -local var = ("%s_%s"):format(options["variablePrefix"], # scope) -- ./compiler/lua54.can:86 -table["insert"](scope, var) -- ./compiler/lua54.can:87 -return var -- ./compiler/lua54.can:88 -end -- ./compiler/lua54.can:88 -local nomacro = { -- ./compiler/lua54.can:92 -["variables"] = {}, -- ./compiler/lua54.can:92 -["functions"] = {} -- ./compiler/lua54.can:92 -} -- ./compiler/lua54.can:92 -local required = {} -- ./compiler/lua54.can:95 -local requireStr = "" -- ./compiler/lua54.can:96 -local function addRequire(mod, name, field) -- ./compiler/lua54.can:98 -local req = ("require(%q)%s"):format(mod, field and "." .. field or "") -- ./compiler/lua54.can:99 -if not required[req] then -- ./compiler/lua54.can:100 -requireStr = requireStr .. (("local %s = %s%s"):format(var(name), req, options["newline"])) -- ./compiler/lua54.can:101 -required[req] = true -- ./compiler/lua54.can:102 -end -- ./compiler/lua54.can:102 -end -- ./compiler/lua54.can:102 -local loop = { -- ./compiler/lua54.can:107 -"While", -- ./compiler/lua54.can:107 -"Repeat", -- ./compiler/lua54.can:107 -"Fornum", -- ./compiler/lua54.can:107 -"Forin", -- ./compiler/lua54.can:107 -"WhileExpr", -- ./compiler/lua54.can:107 -"RepeatExpr", -- ./compiler/lua54.can:107 -"FornumExpr", -- ./compiler/lua54.can:107 -"ForinExpr" -- ./compiler/lua54.can:107 -} -- ./compiler/lua54.can:107 -local func = { -- ./compiler/lua54.can:108 -"Function", -- ./compiler/lua54.can:108 -"TableCompr", -- ./compiler/lua54.can:108 -"DoExpr", -- ./compiler/lua54.can:108 -"WhileExpr", -- ./compiler/lua54.can:108 -"RepeatExpr", -- ./compiler/lua54.can:108 -"IfExpr", -- ./compiler/lua54.can:108 -"FornumExpr", -- ./compiler/lua54.can:108 -"ForinExpr" -- ./compiler/lua54.can:108 -} -- ./compiler/lua54.can:108 -local function any(list, tags, nofollow) -- ./compiler/lua54.can:112 -if nofollow == nil then nofollow = {} end -- ./compiler/lua54.can:112 -local tagsCheck = {} -- ./compiler/lua54.can:113 -for _, tag in ipairs(tags) do -- ./compiler/lua54.can:114 -tagsCheck[tag] = true -- ./compiler/lua54.can:115 -end -- ./compiler/lua54.can:115 -local nofollowCheck = {} -- ./compiler/lua54.can:117 -for _, tag in ipairs(nofollow) do -- ./compiler/lua54.can:118 -nofollowCheck[tag] = true -- ./compiler/lua54.can:119 -end -- ./compiler/lua54.can:119 -for _, node in ipairs(list) do -- ./compiler/lua54.can:121 -if type(node) == "table" then -- ./compiler/lua54.can:122 -if tagsCheck[node["tag"]] then -- ./compiler/lua54.can:123 -return node -- ./compiler/lua54.can:124 +local function peek(name) -- ./compiler/lua54.can:68 +return states[name][# states[name]] -- ./compiler/lua54.can:69 +end -- ./compiler/lua54.can:69 +local function var(name) -- ./compiler/lua54.can:74 +return options["variablePrefix"] .. name -- ./compiler/lua54.can:75 +end -- ./compiler/lua54.can:75 +local function tmp() -- ./compiler/lua54.can:79 +local scope = peek("scope") -- ./compiler/lua54.can:80 +local var = ("%s_%s"):format(options["variablePrefix"], # scope) -- ./compiler/lua54.can:81 +table["insert"](scope, var) -- ./compiler/lua54.can:82 +return var -- ./compiler/lua54.can:83 +end -- ./compiler/lua54.can:83 +local required = {} -- ./compiler/lua54.can:87 +local requireStr = "" -- ./compiler/lua54.can:88 +local function addRequire(mod, name, field) -- ./compiler/lua54.can:90 +local req = ("require(%q)%s"):format(mod, field and "." .. field or "") -- ./compiler/lua54.can:91 +if not required[req] then -- ./compiler/lua54.can:92 +requireStr = requireStr .. (("local %s = %s%s"):format(var(name), req, options["newline"])) -- ./compiler/lua54.can:93 +required[req] = true -- ./compiler/lua54.can:94 +end -- ./compiler/lua54.can:94 +end -- ./compiler/lua54.can:94 +local loop = { -- ./compiler/lua54.can:99 +"While", -- ./compiler/lua54.can:99 +"Repeat", -- ./compiler/lua54.can:99 +"Fornum", -- ./compiler/lua54.can:99 +"Forin", -- ./compiler/lua54.can:99 +"WhileExpr", -- ./compiler/lua54.can:99 +"RepeatExpr", -- ./compiler/lua54.can:99 +"FornumExpr", -- ./compiler/lua54.can:99 +"ForinExpr" -- ./compiler/lua54.can:99 +} -- ./compiler/lua54.can:99 +local func = { -- ./compiler/lua54.can:100 +"Function", -- ./compiler/lua54.can:100 +"TableCompr", -- ./compiler/lua54.can:100 +"DoExpr", -- ./compiler/lua54.can:100 +"WhileExpr", -- ./compiler/lua54.can:100 +"RepeatExpr", -- ./compiler/lua54.can:100 +"IfExpr", -- ./compiler/lua54.can:100 +"FornumExpr", -- ./compiler/lua54.can:100 +"ForinExpr" -- ./compiler/lua54.can:100 +} -- ./compiler/lua54.can:100 +local function any(list, tags, nofollow) -- ./compiler/lua54.can:104 +if nofollow == nil then nofollow = {} end -- ./compiler/lua54.can:104 +local tagsCheck = {} -- ./compiler/lua54.can:105 +for _, tag in ipairs(tags) do -- ./compiler/lua54.can:106 +tagsCheck[tag] = true -- ./compiler/lua54.can:107 +end -- ./compiler/lua54.can:107 +local nofollowCheck = {} -- ./compiler/lua54.can:109 +for _, tag in ipairs(nofollow) do -- ./compiler/lua54.can:110 +nofollowCheck[tag] = true -- ./compiler/lua54.can:111 +end -- ./compiler/lua54.can:111 +for _, node in ipairs(list) do -- ./compiler/lua54.can:113 +if type(node) == "table" then -- ./compiler/lua54.can:114 +if tagsCheck[node["tag"]] then -- ./compiler/lua54.can:115 +return node -- ./compiler/lua54.can:116 +end -- ./compiler/lua54.can:116 +if not nofollowCheck[node["tag"]] then -- ./compiler/lua54.can:118 +local r = any(node, tags, nofollow) -- ./compiler/lua54.can:119 +if r then -- ./compiler/lua54.can:120 +return r -- ./compiler/lua54.can:120 +end -- ./compiler/lua54.can:120 +end -- ./compiler/lua54.can:120 +end -- ./compiler/lua54.can:120 +end -- ./compiler/lua54.can:120 +return nil -- ./compiler/lua54.can:124 end -- ./compiler/lua54.can:124 -if not nofollowCheck[node["tag"]] then -- ./compiler/lua54.can:126 -local r = any(node, tags, nofollow) -- ./compiler/lua54.can:127 -if r then -- ./compiler/lua54.can:128 -return r -- ./compiler/lua54.can:128 -end -- ./compiler/lua54.can:128 -end -- ./compiler/lua54.can:128 -end -- ./compiler/lua54.can:128 -end -- ./compiler/lua54.can:128 -return nil -- ./compiler/lua54.can:132 +local function search(list, tags, nofollow) -- ./compiler/lua54.can:129 +if nofollow == nil then nofollow = {} end -- ./compiler/lua54.can:129 +local tagsCheck = {} -- ./compiler/lua54.can:130 +for _, tag in ipairs(tags) do -- ./compiler/lua54.can:131 +tagsCheck[tag] = true -- ./compiler/lua54.can:132 end -- ./compiler/lua54.can:132 -local function search(list, tags, nofollow) -- ./compiler/lua54.can:137 -if nofollow == nil then nofollow = {} end -- ./compiler/lua54.can:137 -local tagsCheck = {} -- ./compiler/lua54.can:138 -for _, tag in ipairs(tags) do -- ./compiler/lua54.can:139 -tagsCheck[tag] = true -- ./compiler/lua54.can:140 -end -- ./compiler/lua54.can:140 -local nofollowCheck = {} -- ./compiler/lua54.can:142 -for _, tag in ipairs(nofollow) do -- ./compiler/lua54.can:143 -nofollowCheck[tag] = true -- ./compiler/lua54.can:144 -end -- ./compiler/lua54.can:144 -local found = {} -- ./compiler/lua54.can:146 -for _, node in ipairs(list) do -- ./compiler/lua54.can:147 -if type(node) == "table" then -- ./compiler/lua54.can:148 -if not nofollowCheck[node["tag"]] then -- ./compiler/lua54.can:149 -for _, n in ipairs(search(node, tags, nofollow)) do -- ./compiler/lua54.can:150 -table["insert"](found, n) -- ./compiler/lua54.can:151 +local nofollowCheck = {} -- ./compiler/lua54.can:134 +for _, tag in ipairs(nofollow) do -- ./compiler/lua54.can:135 +nofollowCheck[tag] = true -- ./compiler/lua54.can:136 +end -- ./compiler/lua54.can:136 +local found = {} -- ./compiler/lua54.can:138 +for _, node in ipairs(list) do -- ./compiler/lua54.can:139 +if type(node) == "table" then -- ./compiler/lua54.can:140 +if not nofollowCheck[node["tag"]] then -- ./compiler/lua54.can:141 +for _, n in ipairs(search(node, tags, nofollow)) do -- ./compiler/lua54.can:142 +table["insert"](found, n) -- ./compiler/lua54.can:143 +end -- ./compiler/lua54.can:143 +end -- ./compiler/lua54.can:143 +if tagsCheck[node["tag"]] then -- ./compiler/lua54.can:146 +table["insert"](found, node) -- ./compiler/lua54.can:147 +end -- ./compiler/lua54.can:147 +end -- ./compiler/lua54.can:147 +end -- ./compiler/lua54.can:147 +return found -- ./compiler/lua54.can:151 end -- ./compiler/lua54.can:151 -end -- ./compiler/lua54.can:151 -if tagsCheck[node["tag"]] then -- ./compiler/lua54.can:154 -table["insert"](found, node) -- ./compiler/lua54.can:155 -end -- ./compiler/lua54.can:155 -end -- ./compiler/lua54.can:155 -end -- ./compiler/lua54.can:155 -return found -- ./compiler/lua54.can:159 -end -- ./compiler/lua54.can:159 -local function all(list, tags) -- ./compiler/lua54.can:163 -for _, node in ipairs(list) do -- ./compiler/lua54.can:164 -local ok = false -- ./compiler/lua54.can:165 -for _, tag in ipairs(tags) do -- ./compiler/lua54.can:166 -if node["tag"] == tag then -- ./compiler/lua54.can:167 -ok = true -- ./compiler/lua54.can:168 -break -- ./compiler/lua54.can:169 -end -- ./compiler/lua54.can:169 -end -- ./compiler/lua54.can:169 -if not ok then -- ./compiler/lua54.can:172 -return false -- ./compiler/lua54.can:173 -end -- ./compiler/lua54.can:173 -end -- ./compiler/lua54.can:173 -return true -- ./compiler/lua54.can:176 +local function all(list, tags) -- ./compiler/lua54.can:155 +for _, node in ipairs(list) do -- ./compiler/lua54.can:156 +local ok = false -- ./compiler/lua54.can:157 +for _, tag in ipairs(tags) do -- ./compiler/lua54.can:158 +if node["tag"] == tag then -- ./compiler/lua54.can:159 +ok = true -- ./compiler/lua54.can:160 +break -- ./compiler/lua54.can:161 +end -- ./compiler/lua54.can:161 +end -- ./compiler/lua54.can:161 +if not ok then -- ./compiler/lua54.can:164 +return false -- ./compiler/lua54.can:165 +end -- ./compiler/lua54.can:165 +end -- ./compiler/lua54.can:165 +return true -- ./compiler/lua54.can:168 +end -- ./compiler/lua54.can:168 +local tags -- ./compiler/lua54.can:172 +local function lua(ast, forceTag, ...) -- ./compiler/lua54.can:174 +if options["mapLines"] and ast["pos"] then -- ./compiler/lua54.can:175 +lastInputPos = ast["pos"] -- ./compiler/lua54.can:176 end -- ./compiler/lua54.can:176 -local tags -- ./compiler/lua54.can:180 -local function lua(ast, forceTag, ...) -- ./compiler/lua54.can:182 -if options["mapLines"] and ast["pos"] then -- ./compiler/lua54.can:183 -lastInputPos = ast["pos"] -- ./compiler/lua54.can:184 -end -- ./compiler/lua54.can:184 -return tags[forceTag or ast["tag"]](ast, ...) -- ./compiler/lua54.can:186 +return tags[forceTag or ast["tag"]](ast, ...) -- ./compiler/lua54.can:178 +end -- ./compiler/lua54.can:178 +local UNPACK = function(list, i, j) -- ./compiler/lua54.can:182 +return "table.unpack(" .. list .. (i and (", " .. i .. (j and (", " .. j) or "")) or "") .. ")" -- ./compiler/lua54.can:183 +end -- ./compiler/lua54.can:183 +local APPEND = function(t, toAppend) -- ./compiler/lua54.can:185 +return "do" .. indent() .. "local " .. var("a") .. " = table.pack(" .. toAppend .. ")" .. newline() .. "table.move(" .. var("a") .. ", 1, " .. var("a") .. ".n, #" .. t .. "+1, " .. t .. ")" .. unindent() .. "end" -- ./compiler/lua54.can:186 end -- ./compiler/lua54.can:186 -local UNPACK = function(list, i, j) -- ./compiler/lua54.can:190 -return "table.unpack(" .. list .. (i and (", " .. i .. (j and (", " .. j) or "")) or "") .. ")" -- ./compiler/lua54.can:191 -end -- ./compiler/lua54.can:191 -local APPEND = function(t, toAppend) -- ./compiler/lua54.can:193 -return "do" .. indent() .. "local " .. var("a") .. " = table.pack(" .. toAppend .. ")" .. newline() .. "table.move(" .. var("a") .. ", 1, " .. var("a") .. ".n, #" .. t .. "+1, " .. t .. ")" .. unindent() .. "end" -- ./compiler/lua54.can:194 -end -- ./compiler/lua54.can:194 -local CONTINUE_START = function() -- ./compiler/lua54.can:196 -return "do" .. indent() -- ./compiler/lua54.can:197 -end -- ./compiler/lua54.can:197 -local CONTINUE_STOP = function() -- ./compiler/lua54.can:199 -return unindent() .. "end" .. newline() .. "::" .. var("continue") .. "::" -- ./compiler/lua54.can:200 -end -- ./compiler/lua54.can:200 -local DESTRUCTURING_ASSIGN = function(destructured, newlineAfter, noLocal) -- ./compiler/lua54.can:202 -if newlineAfter == nil then newlineAfter = false end -- ./compiler/lua54.can:202 -if noLocal == nil then noLocal = false end -- ./compiler/lua54.can:202 -local vars = {} -- ./compiler/lua54.can:203 -local values = {} -- ./compiler/lua54.can:204 -for _, list in ipairs(destructured) do -- ./compiler/lua54.can:205 -for _, v in ipairs(list) do -- ./compiler/lua54.can:206 -local var, val -- ./compiler/lua54.can:207 -if v["tag"] == "Id" or v["tag"] == "AttributeId" then -- ./compiler/lua54.can:208 -var = v -- ./compiler/lua54.can:209 +local CONTINUE_START = function() -- ./compiler/lua54.can:188 +return "do" .. indent() -- ./compiler/lua54.can:189 +end -- ./compiler/lua54.can:189 +local CONTINUE_STOP = function() -- ./compiler/lua54.can:191 +return unindent() .. "end" .. newline() .. "::" .. var("continue") .. "::" -- ./compiler/lua54.can:192 +end -- ./compiler/lua54.can:192 +local DESTRUCTURING_ASSIGN = function(destructured, newlineAfter, noLocal) -- ./compiler/lua54.can:194 +if newlineAfter == nil then newlineAfter = false end -- ./compiler/lua54.can:194 +if noLocal == nil then noLocal = false end -- ./compiler/lua54.can:194 +local vars = {} -- ./compiler/lua54.can:195 +local values = {} -- ./compiler/lua54.can:196 +for _, list in ipairs(destructured) do -- ./compiler/lua54.can:197 +for _, v in ipairs(list) do -- ./compiler/lua54.can:198 +local var, val -- ./compiler/lua54.can:199 +if v["tag"] == "Id" or v["tag"] == "AttributeId" then -- ./compiler/lua54.can:200 +var = v -- ./compiler/lua54.can:201 +val = { -- ./compiler/lua54.can:202 +["tag"] = "Index", -- ./compiler/lua54.can:202 +{ -- ./compiler/lua54.can:202 +["tag"] = "Id", -- ./compiler/lua54.can:202 +list["id"] -- ./compiler/lua54.can:202 +}, -- ./compiler/lua54.can:202 +{ -- ./compiler/lua54.can:202 +["tag"] = "String", -- ./compiler/lua54.can:202 +v[1] -- ./compiler/lua54.can:202 +} -- ./compiler/lua54.can:202 +} -- ./compiler/lua54.can:202 +elseif v["tag"] == "Pair" then -- ./compiler/lua54.can:203 +var = v[2] -- ./compiler/lua54.can:204 +val = { -- ./compiler/lua54.can:205 +["tag"] = "Index", -- ./compiler/lua54.can:205 +{ -- ./compiler/lua54.can:205 +["tag"] = "Id", -- ./compiler/lua54.can:205 +list["id"] -- ./compiler/lua54.can:205 +}, -- ./compiler/lua54.can:205 +v[1] -- ./compiler/lua54.can:205 +} -- ./compiler/lua54.can:205 +else -- ./compiler/lua54.can:205 +error("unknown destructuring element type: " .. tostring(v["tag"])) -- ./compiler/lua54.can:207 +end -- ./compiler/lua54.can:207 +if destructured["rightOp"] and destructured["leftOp"] then -- ./compiler/lua54.can:209 val = { -- ./compiler/lua54.can:210 -["tag"] = "Index", -- ./compiler/lua54.can:210 +["tag"] = "Op", -- ./compiler/lua54.can:210 +destructured["rightOp"], -- ./compiler/lua54.can:210 +var, -- ./compiler/lua54.can:210 { -- ./compiler/lua54.can:210 -["tag"] = "Id", -- ./compiler/lua54.can:210 -list["id"] -- ./compiler/lua54.can:210 -}, -- ./compiler/lua54.can:210 -{ -- ./compiler/lua54.can:210 -["tag"] = "String", -- ./compiler/lua54.can:210 -v[1] -- ./compiler/lua54.can:210 +["tag"] = "Op", -- ./compiler/lua54.can:210 +destructured["leftOp"], -- ./compiler/lua54.can:210 +val, -- ./compiler/lua54.can:210 +var -- ./compiler/lua54.can:210 } -- ./compiler/lua54.can:210 } -- ./compiler/lua54.can:210 -elseif v["tag"] == "Pair" then -- ./compiler/lua54.can:211 -var = v[2] -- ./compiler/lua54.can:212 -val = { -- ./compiler/lua54.can:213 -["tag"] = "Index", -- ./compiler/lua54.can:213 -{ -- ./compiler/lua54.can:213 -["tag"] = "Id", -- ./compiler/lua54.can:213 -list["id"] -- ./compiler/lua54.can:213 -}, -- ./compiler/lua54.can:213 -v[1] -- ./compiler/lua54.can:213 -} -- ./compiler/lua54.can:213 -else -- ./compiler/lua54.can:213 -error("unknown destructuring element type: " .. tostring(v["tag"])) -- ./compiler/lua54.can:215 -end -- ./compiler/lua54.can:215 -if destructured["rightOp"] and destructured["leftOp"] then -- ./compiler/lua54.can:217 -val = { -- ./compiler/lua54.can:218 -["tag"] = "Op", -- ./compiler/lua54.can:218 -destructured["rightOp"], -- ./compiler/lua54.can:218 -var, -- ./compiler/lua54.can:218 -{ -- ./compiler/lua54.can:218 -["tag"] = "Op", -- ./compiler/lua54.can:218 -destructured["leftOp"], -- ./compiler/lua54.can:218 -val, -- ./compiler/lua54.can:218 -var -- ./compiler/lua54.can:218 -} -- ./compiler/lua54.can:218 -} -- ./compiler/lua54.can:218 -elseif destructured["rightOp"] then -- ./compiler/lua54.can:219 -val = { -- ./compiler/lua54.can:220 -["tag"] = "Op", -- ./compiler/lua54.can:220 -destructured["rightOp"], -- ./compiler/lua54.can:220 -var, -- ./compiler/lua54.can:220 -val -- ./compiler/lua54.can:220 -} -- ./compiler/lua54.can:220 -elseif destructured["leftOp"] then -- ./compiler/lua54.can:221 -val = { -- ./compiler/lua54.can:222 -["tag"] = "Op", -- ./compiler/lua54.can:222 -destructured["leftOp"], -- ./compiler/lua54.can:222 -val, -- ./compiler/lua54.can:222 -var -- ./compiler/lua54.can:222 -} -- ./compiler/lua54.can:222 -end -- ./compiler/lua54.can:222 -table["insert"](vars, lua(var)) -- ./compiler/lua54.can:224 -table["insert"](values, lua(val)) -- ./compiler/lua54.can:225 +elseif destructured["rightOp"] then -- ./compiler/lua54.can:211 +val = { -- ./compiler/lua54.can:212 +["tag"] = "Op", -- ./compiler/lua54.can:212 +destructured["rightOp"], -- ./compiler/lua54.can:212 +var, -- ./compiler/lua54.can:212 +val -- ./compiler/lua54.can:212 +} -- ./compiler/lua54.can:212 +elseif destructured["leftOp"] then -- ./compiler/lua54.can:213 +val = { -- ./compiler/lua54.can:214 +["tag"] = "Op", -- ./compiler/lua54.can:214 +destructured["leftOp"], -- ./compiler/lua54.can:214 +val, -- ./compiler/lua54.can:214 +var -- ./compiler/lua54.can:214 +} -- ./compiler/lua54.can:214 +end -- ./compiler/lua54.can:214 +table["insert"](vars, lua(var)) -- ./compiler/lua54.can:216 +table["insert"](values, lua(val)) -- ./compiler/lua54.can:217 +end -- ./compiler/lua54.can:217 +end -- ./compiler/lua54.can:217 +if # vars > 0 then -- ./compiler/lua54.can:220 +local decl = noLocal and "" or "local " -- ./compiler/lua54.can:221 +if newlineAfter then -- ./compiler/lua54.can:222 +return decl .. table["concat"](vars, ", ") .. " = " .. table["concat"](values, ", ") .. newline() -- ./compiler/lua54.can:223 +else -- ./compiler/lua54.can:223 +return newline() .. decl .. table["concat"](vars, ", ") .. " = " .. table["concat"](values, ", ") -- ./compiler/lua54.can:225 end -- ./compiler/lua54.can:225 -end -- ./compiler/lua54.can:225 -if # vars > 0 then -- ./compiler/lua54.can:228 -local decl = noLocal and "" or "local " -- ./compiler/lua54.can:229 -if newlineAfter then -- ./compiler/lua54.can:230 -return decl .. table["concat"](vars, ", ") .. " = " .. table["concat"](values, ", ") .. newline() -- ./compiler/lua54.can:231 -else -- ./compiler/lua54.can:231 -return newline() .. decl .. table["concat"](vars, ", ") .. " = " .. table["concat"](values, ", ") -- ./compiler/lua54.can:233 -end -- ./compiler/lua54.can:233 -else -- ./compiler/lua54.can:233 -return "" -- ./compiler/lua54.can:236 -end -- ./compiler/lua54.can:236 -end -- ./compiler/lua54.can:236 -tags = setmetatable({ -- ./compiler/lua54.can:241 -["Block"] = function(t) -- ./compiler/lua54.can:243 -local hasPush = peek("push") == nil and any(t, { "Push" }, func) -- ./compiler/lua54.can:244 -if hasPush and hasPush == t[# t] then -- ./compiler/lua54.can:245 -hasPush["tag"] = "Return" -- ./compiler/lua54.can:246 -hasPush = false -- ./compiler/lua54.can:247 -end -- ./compiler/lua54.can:247 -local r = push("scope", {}) -- ./compiler/lua54.can:249 -if hasPush then -- ./compiler/lua54.can:250 -r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:251 -end -- ./compiler/lua54.can:251 -for i = 1, # t - 1, 1 do -- ./compiler/lua54.can:253 -r = r .. (lua(t[i]) .. newline()) -- ./compiler/lua54.can:254 -end -- ./compiler/lua54.can:254 -if t[# t] then -- ./compiler/lua54.can:256 -r = r .. (lua(t[# t])) -- ./compiler/lua54.can:257 -end -- ./compiler/lua54.can:257 -if hasPush and (t[# t] and t[# t]["tag"] ~= "Return") then -- ./compiler/lua54.can:259 -r = r .. (newline() .. "return " .. UNPACK(var("push")) .. pop("push")) -- ./compiler/lua54.can:260 -end -- ./compiler/lua54.can:260 -return r .. pop("scope") -- ./compiler/lua54.can:262 -end, -- ./compiler/lua54.can:262 -["Do"] = function(t) -- ./compiler/lua54.can:268 -return "do" .. indent() .. lua(t, "Block") .. unindent() .. "end" -- ./compiler/lua54.can:269 -end, -- ./compiler/lua54.can:269 -["Set"] = function(t) -- ./compiler/lua54.can:272 -local expr = t[# t] -- ./compiler/lua54.can:274 -local vars, values = {}, {} -- ./compiler/lua54.can:275 -local destructuringVars, destructuringValues = {}, {} -- ./compiler/lua54.can:276 -for i, n in ipairs(t[1]) do -- ./compiler/lua54.can:277 -if n["tag"] == "DestructuringId" then -- ./compiler/lua54.can:278 -table["insert"](destructuringVars, n) -- ./compiler/lua54.can:279 -table["insert"](destructuringValues, expr[i]) -- ./compiler/lua54.can:280 -else -- ./compiler/lua54.can:280 -table["insert"](vars, n) -- ./compiler/lua54.can:282 -table["insert"](values, expr[i]) -- ./compiler/lua54.can:283 -end -- ./compiler/lua54.can:283 -end -- ./compiler/lua54.can:283 -if # t == 2 or # t == 3 then -- ./compiler/lua54.can:287 -local r = "" -- ./compiler/lua54.can:288 -if # vars > 0 then -- ./compiler/lua54.can:289 -r = lua(vars, "_lhs") .. " = " .. lua(values, "_lhs") -- ./compiler/lua54.can:290 -end -- ./compiler/lua54.can:290 -if # destructuringVars > 0 then -- ./compiler/lua54.can:292 -local destructured = {} -- ./compiler/lua54.can:293 -r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:294 -return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:295 -end -- ./compiler/lua54.can:295 -return r -- ./compiler/lua54.can:297 -elseif # t == 4 then -- ./compiler/lua54.can:298 -if t[3] == "=" then -- ./compiler/lua54.can:299 -local r = "" -- ./compiler/lua54.can:300 -if # vars > 0 then -- ./compiler/lua54.can:301 -r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:302 -t[2], -- ./compiler/lua54.can:302 -vars[1], -- ./compiler/lua54.can:302 -{ -- ./compiler/lua54.can:302 -["tag"] = "Paren", -- ./compiler/lua54.can:302 -values[1] -- ./compiler/lua54.can:302 -} -- ./compiler/lua54.can:302 -}, "Op")) -- ./compiler/lua54.can:302 -for i = 2, math["min"](# t[4], # vars), 1 do -- ./compiler/lua54.can:303 -r = r .. (", " .. lua({ -- ./compiler/lua54.can:304 -t[2], -- ./compiler/lua54.can:304 -vars[i], -- ./compiler/lua54.can:304 -{ -- ./compiler/lua54.can:304 -["tag"] = "Paren", -- ./compiler/lua54.can:304 -values[i] -- ./compiler/lua54.can:304 -} -- ./compiler/lua54.can:304 -}, "Op")) -- ./compiler/lua54.can:304 -end -- ./compiler/lua54.can:304 -end -- ./compiler/lua54.can:304 -if # destructuringVars > 0 then -- ./compiler/lua54.can:307 -local destructured = { ["rightOp"] = t[2] } -- ./compiler/lua54.can:308 -r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:309 -return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:310 +else -- ./compiler/lua54.can:225 +return "" -- ./compiler/lua54.can:228 +end -- ./compiler/lua54.can:228 +end -- ./compiler/lua54.can:228 +tags = setmetatable({ -- ./compiler/lua54.can:233 +["Block"] = function(t) -- ./compiler/lua54.can:235 +local hasPush = peek("push") == nil and any(t, { "Push" }, func) -- ./compiler/lua54.can:236 +if hasPush and hasPush == t[# t] then -- ./compiler/lua54.can:237 +hasPush["tag"] = "Return" -- ./compiler/lua54.can:238 +hasPush = false -- ./compiler/lua54.can:239 +end -- ./compiler/lua54.can:239 +local r = push("scope", {}) -- ./compiler/lua54.can:241 +if hasPush then -- ./compiler/lua54.can:242 +r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:243 +end -- ./compiler/lua54.can:243 +for i = 1, # t - 1, 1 do -- ./compiler/lua54.can:245 +r = r .. (lua(t[i]) .. newline()) -- ./compiler/lua54.can:246 +end -- ./compiler/lua54.can:246 +if t[# t] then -- ./compiler/lua54.can:248 +r = r .. (lua(t[# t])) -- ./compiler/lua54.can:249 +end -- ./compiler/lua54.can:249 +if hasPush and (t[# t] and t[# t]["tag"] ~= "Return") then -- ./compiler/lua54.can:251 +r = r .. (newline() .. "return " .. UNPACK(var("push")) .. pop("push")) -- ./compiler/lua54.can:252 +end -- ./compiler/lua54.can:252 +return r .. pop("scope") -- ./compiler/lua54.can:254 +end, -- ./compiler/lua54.can:254 +["Do"] = function(t) -- ./compiler/lua54.can:260 +return "do" .. indent() .. lua(t, "Block") .. unindent() .. "end" -- ./compiler/lua54.can:261 +end, -- ./compiler/lua54.can:261 +["Set"] = function(t) -- ./compiler/lua54.can:264 +local expr = t[# t] -- ./compiler/lua54.can:266 +local vars, values = {}, {} -- ./compiler/lua54.can:267 +local destructuringVars, destructuringValues = {}, {} -- ./compiler/lua54.can:268 +for i, n in ipairs(t[1]) do -- ./compiler/lua54.can:269 +if n["tag"] == "DestructuringId" then -- ./compiler/lua54.can:270 +table["insert"](destructuringVars, n) -- ./compiler/lua54.can:271 +table["insert"](destructuringValues, expr[i]) -- ./compiler/lua54.can:272 +else -- ./compiler/lua54.can:272 +table["insert"](vars, n) -- ./compiler/lua54.can:274 +table["insert"](values, expr[i]) -- ./compiler/lua54.can:275 +end -- ./compiler/lua54.can:275 +end -- ./compiler/lua54.can:275 +if # t == 2 or # t == 3 then -- ./compiler/lua54.can:279 +local r = "" -- ./compiler/lua54.can:280 +if # vars > 0 then -- ./compiler/lua54.can:281 +r = lua(vars, "_lhs") .. " = " .. lua(values, "_lhs") -- ./compiler/lua54.can:282 +end -- ./compiler/lua54.can:282 +if # destructuringVars > 0 then -- ./compiler/lua54.can:284 +local destructured = {} -- ./compiler/lua54.can:285 +r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:286 +return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:287 +end -- ./compiler/lua54.can:287 +return r -- ./compiler/lua54.can:289 +elseif # t == 4 then -- ./compiler/lua54.can:290 +if t[3] == "=" then -- ./compiler/lua54.can:291 +local r = "" -- ./compiler/lua54.can:292 +if # vars > 0 then -- ./compiler/lua54.can:293 +r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:294 +t[2], -- ./compiler/lua54.can:294 +vars[1], -- ./compiler/lua54.can:294 +{ -- ./compiler/lua54.can:294 +["tag"] = "Paren", -- ./compiler/lua54.can:294 +values[1] -- ./compiler/lua54.can:294 +} -- ./compiler/lua54.can:294 +}, "Op")) -- ./compiler/lua54.can:294 +for i = 2, math["min"](# t[4], # vars), 1 do -- ./compiler/lua54.can:295 +r = r .. (", " .. lua({ -- ./compiler/lua54.can:296 +t[2], -- ./compiler/lua54.can:296 +vars[i], -- ./compiler/lua54.can:296 +{ -- ./compiler/lua54.can:296 +["tag"] = "Paren", -- ./compiler/lua54.can:296 +values[i] -- ./compiler/lua54.can:296 +} -- ./compiler/lua54.can:296 +}, "Op")) -- ./compiler/lua54.can:296 +end -- ./compiler/lua54.can:296 +end -- ./compiler/lua54.can:296 +if # destructuringVars > 0 then -- ./compiler/lua54.can:299 +local destructured = { ["rightOp"] = t[2] } -- ./compiler/lua54.can:300 +r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:301 +return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:302 +end -- ./compiler/lua54.can:302 +return r -- ./compiler/lua54.can:304 +else -- ./compiler/lua54.can:304 +local r = "" -- ./compiler/lua54.can:306 +if # vars > 0 then -- ./compiler/lua54.can:307 +r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:308 +t[3], -- ./compiler/lua54.can:308 +{ -- ./compiler/lua54.can:308 +["tag"] = "Paren", -- ./compiler/lua54.can:308 +values[1] -- ./compiler/lua54.can:308 +}, -- ./compiler/lua54.can:308 +vars[1] -- ./compiler/lua54.can:308 +}, "Op")) -- ./compiler/lua54.can:308 +for i = 2, math["min"](# t[4], # t[1]), 1 do -- ./compiler/lua54.can:309 +r = r .. (", " .. lua({ -- ./compiler/lua54.can:310 +t[3], -- ./compiler/lua54.can:310 +{ -- ./compiler/lua54.can:310 +["tag"] = "Paren", -- ./compiler/lua54.can:310 +values[i] -- ./compiler/lua54.can:310 +}, -- ./compiler/lua54.can:310 +vars[i] -- ./compiler/lua54.can:310 +}, "Op")) -- ./compiler/lua54.can:310 end -- ./compiler/lua54.can:310 -return r -- ./compiler/lua54.can:312 -else -- ./compiler/lua54.can:312 -local r = "" -- ./compiler/lua54.can:314 -if # vars > 0 then -- ./compiler/lua54.can:315 -r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:316 -t[3], -- ./compiler/lua54.can:316 -{ -- ./compiler/lua54.can:316 -["tag"] = "Paren", -- ./compiler/lua54.can:316 -values[1] -- ./compiler/lua54.can:316 -}, -- ./compiler/lua54.can:316 -vars[1] -- ./compiler/lua54.can:316 -}, "Op")) -- ./compiler/lua54.can:316 -for i = 2, math["min"](# t[4], # t[1]), 1 do -- ./compiler/lua54.can:317 -r = r .. (", " .. lua({ -- ./compiler/lua54.can:318 -t[3], -- ./compiler/lua54.can:318 -{ -- ./compiler/lua54.can:318 -["tag"] = "Paren", -- ./compiler/lua54.can:318 -values[i] -- ./compiler/lua54.can:318 -}, -- ./compiler/lua54.can:318 -vars[i] -- ./compiler/lua54.can:318 -}, "Op")) -- ./compiler/lua54.can:318 +end -- ./compiler/lua54.can:310 +if # destructuringVars > 0 then -- ./compiler/lua54.can:313 +local destructured = { ["leftOp"] = t[3] } -- ./compiler/lua54.can:314 +r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:315 +return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:316 +end -- ./compiler/lua54.can:316 +return r -- ./compiler/lua54.can:318 end -- ./compiler/lua54.can:318 -end -- ./compiler/lua54.can:318 -if # destructuringVars > 0 then -- ./compiler/lua54.can:321 -local destructured = { ["leftOp"] = t[3] } -- ./compiler/lua54.can:322 -r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:323 -return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:324 -end -- ./compiler/lua54.can:324 -return r -- ./compiler/lua54.can:326 -end -- ./compiler/lua54.can:326 -else -- ./compiler/lua54.can:326 -local r = "" -- ./compiler/lua54.can:329 -if # vars > 0 then -- ./compiler/lua54.can:330 -r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:331 -t[2], -- ./compiler/lua54.can:331 -vars[1], -- ./compiler/lua54.can:331 -{ -- ./compiler/lua54.can:331 -["tag"] = "Op", -- ./compiler/lua54.can:331 -t[4], -- ./compiler/lua54.can:331 -{ -- ./compiler/lua54.can:331 -["tag"] = "Paren", -- ./compiler/lua54.can:331 -values[1] -- ./compiler/lua54.can:331 -}, -- ./compiler/lua54.can:331 -vars[1] -- ./compiler/lua54.can:331 -} -- ./compiler/lua54.can:331 -}, "Op")) -- ./compiler/lua54.can:331 -for i = 2, math["min"](# t[5], # t[1]), 1 do -- ./compiler/lua54.can:332 -r = r .. (", " .. lua({ -- ./compiler/lua54.can:333 -t[2], -- ./compiler/lua54.can:333 -vars[i], -- ./compiler/lua54.can:333 -{ -- ./compiler/lua54.can:333 -["tag"] = "Op", -- ./compiler/lua54.can:333 -t[4], -- ./compiler/lua54.can:333 -{ -- ./compiler/lua54.can:333 -["tag"] = "Paren", -- ./compiler/lua54.can:333 -values[i] -- ./compiler/lua54.can:333 -}, -- ./compiler/lua54.can:333 -vars[i] -- ./compiler/lua54.can:333 -} -- ./compiler/lua54.can:333 -}, "Op")) -- ./compiler/lua54.can:333 +else -- ./compiler/lua54.can:318 +local r = "" -- ./compiler/lua54.can:321 +if # vars > 0 then -- ./compiler/lua54.can:322 +r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:323 +t[2], -- ./compiler/lua54.can:323 +vars[1], -- ./compiler/lua54.can:323 +{ -- ./compiler/lua54.can:323 +["tag"] = "Op", -- ./compiler/lua54.can:323 +t[4], -- ./compiler/lua54.can:323 +{ -- ./compiler/lua54.can:323 +["tag"] = "Paren", -- ./compiler/lua54.can:323 +values[1] -- ./compiler/lua54.can:323 +}, -- ./compiler/lua54.can:323 +vars[1] -- ./compiler/lua54.can:323 +} -- ./compiler/lua54.can:323 +}, "Op")) -- ./compiler/lua54.can:323 +for i = 2, math["min"](# t[5], # t[1]), 1 do -- ./compiler/lua54.can:324 +r = r .. (", " .. lua({ -- ./compiler/lua54.can:325 +t[2], -- ./compiler/lua54.can:325 +vars[i], -- ./compiler/lua54.can:325 +{ -- ./compiler/lua54.can:325 +["tag"] = "Op", -- ./compiler/lua54.can:325 +t[4], -- ./compiler/lua54.can:325 +{ -- ./compiler/lua54.can:325 +["tag"] = "Paren", -- ./compiler/lua54.can:325 +values[i] -- ./compiler/lua54.can:325 +}, -- ./compiler/lua54.can:325 +vars[i] -- ./compiler/lua54.can:325 +} -- ./compiler/lua54.can:325 +}, "Op")) -- ./compiler/lua54.can:325 +end -- ./compiler/lua54.can:325 +end -- ./compiler/lua54.can:325 +if # destructuringVars > 0 then -- ./compiler/lua54.can:328 +local destructured = { -- ./compiler/lua54.can:329 +["rightOp"] = t[2], -- ./compiler/lua54.can:329 +["leftOp"] = t[4] -- ./compiler/lua54.can:329 +} -- ./compiler/lua54.can:329 +r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:330 +return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:331 +end -- ./compiler/lua54.can:331 +return r -- ./compiler/lua54.can:333 end -- ./compiler/lua54.can:333 -end -- ./compiler/lua54.can:333 -if # destructuringVars > 0 then -- ./compiler/lua54.can:336 -local destructured = { -- ./compiler/lua54.can:337 -["rightOp"] = t[2], -- ./compiler/lua54.can:337 -["leftOp"] = t[4] -- ./compiler/lua54.can:337 -} -- ./compiler/lua54.can:337 -r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:338 -return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:339 -end -- ./compiler/lua54.can:339 -return r -- ./compiler/lua54.can:341 -end -- ./compiler/lua54.can:341 -end, -- ./compiler/lua54.can:341 -["While"] = function(t) -- ./compiler/lua54.can:345 -local r = "" -- ./compiler/lua54.can:346 -local hasContinue = any(t[2], { "Continue" }, loop) -- ./compiler/lua54.can:347 -local lets = search({ t[1] }, { "LetExpr" }) -- ./compiler/lua54.can:348 -if # lets > 0 then -- ./compiler/lua54.can:349 -r = r .. ("do" .. indent()) -- ./compiler/lua54.can:350 -for _, l in ipairs(lets) do -- ./compiler/lua54.can:351 -r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:352 +end, -- ./compiler/lua54.can:333 +["While"] = function(t) -- ./compiler/lua54.can:337 +local r = "" -- ./compiler/lua54.can:338 +local hasContinue = any(t[2], { "Continue" }, loop) -- ./compiler/lua54.can:339 +local lets = search({ t[1] }, { "LetExpr" }) -- ./compiler/lua54.can:340 +if # lets > 0 then -- ./compiler/lua54.can:341 +r = r .. ("do" .. indent()) -- ./compiler/lua54.can:342 +for _, l in ipairs(lets) do -- ./compiler/lua54.can:343 +r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:344 +end -- ./compiler/lua54.can:344 +end -- ./compiler/lua54.can:344 +r = r .. ("while " .. lua(t[1]) .. " do" .. indent()) -- ./compiler/lua54.can:347 +if # lets > 0 then -- ./compiler/lua54.can:348 +r = r .. ("do" .. indent()) -- ./compiler/lua54.can:349 +end -- ./compiler/lua54.can:349 +if hasContinue then -- ./compiler/lua54.can:351 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:352 end -- ./compiler/lua54.can:352 -end -- ./compiler/lua54.can:352 -r = r .. ("while " .. lua(t[1]) .. " do" .. indent()) -- ./compiler/lua54.can:355 -if # lets > 0 then -- ./compiler/lua54.can:356 -r = r .. ("do" .. indent()) -- ./compiler/lua54.can:357 -end -- ./compiler/lua54.can:357 -if hasContinue then -- ./compiler/lua54.can:359 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:360 -end -- ./compiler/lua54.can:360 -r = r .. (lua(t[2])) -- ./compiler/lua54.can:362 -if hasContinue then -- ./compiler/lua54.can:363 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:364 -end -- ./compiler/lua54.can:364 -r = r .. (unindent() .. "end") -- ./compiler/lua54.can:366 -if # lets > 0 then -- ./compiler/lua54.can:367 -for _, l in ipairs(lets) do -- ./compiler/lua54.can:368 -r = r .. (newline() .. lua(l, "Set")) -- ./compiler/lua54.can:369 -end -- ./compiler/lua54.can:369 -r = r .. (unindent() .. "end" .. unindent() .. "end") -- ./compiler/lua54.can:371 -end -- ./compiler/lua54.can:371 -return r -- ./compiler/lua54.can:373 -end, -- ./compiler/lua54.can:373 -["Repeat"] = function(t) -- ./compiler/lua54.can:376 -local hasContinue = any(t[1], { "Continue" }, loop) -- ./compiler/lua54.can:377 -local r = "repeat" .. indent() -- ./compiler/lua54.can:378 -if hasContinue then -- ./compiler/lua54.can:379 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:380 -end -- ./compiler/lua54.can:380 -r = r .. (lua(t[1])) -- ./compiler/lua54.can:382 -if hasContinue then -- ./compiler/lua54.can:383 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:384 -end -- ./compiler/lua54.can:384 -r = r .. (unindent() .. "until " .. lua(t[2])) -- ./compiler/lua54.can:386 -return r -- ./compiler/lua54.can:387 -end, -- ./compiler/lua54.can:387 -["If"] = function(t) -- ./compiler/lua54.can:390 -local r = "" -- ./compiler/lua54.can:391 -local toClose = 0 -- ./compiler/lua54.can:392 -local lets = search({ t[1] }, { "LetExpr" }) -- ./compiler/lua54.can:393 -if # lets > 0 then -- ./compiler/lua54.can:394 -r = r .. ("do" .. indent()) -- ./compiler/lua54.can:395 -toClose = toClose + (1) -- ./compiler/lua54.can:396 -for _, l in ipairs(lets) do -- ./compiler/lua54.can:397 -r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:398 -end -- ./compiler/lua54.can:398 -end -- ./compiler/lua54.can:398 -r = r .. ("if " .. lua(t[1]) .. " then" .. indent() .. lua(t[2]) .. unindent()) -- ./compiler/lua54.can:401 -for i = 3, # t - 1, 2 do -- ./compiler/lua54.can:402 -lets = search({ t[i] }, { "LetExpr" }) -- ./compiler/lua54.can:403 -if # lets > 0 then -- ./compiler/lua54.can:404 -r = r .. ("else" .. indent()) -- ./compiler/lua54.can:405 -toClose = toClose + (1) -- ./compiler/lua54.can:406 -for _, l in ipairs(lets) do -- ./compiler/lua54.can:407 -r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:408 +r = r .. (lua(t[2])) -- ./compiler/lua54.can:354 +if hasContinue then -- ./compiler/lua54.can:355 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:356 +end -- ./compiler/lua54.can:356 +r = r .. (unindent() .. "end") -- ./compiler/lua54.can:358 +if # lets > 0 then -- ./compiler/lua54.can:359 +for _, l in ipairs(lets) do -- ./compiler/lua54.can:360 +r = r .. (newline() .. lua(l, "Set")) -- ./compiler/lua54.can:361 +end -- ./compiler/lua54.can:361 +r = r .. (unindent() .. "end" .. unindent() .. "end") -- ./compiler/lua54.can:363 +end -- ./compiler/lua54.can:363 +return r -- ./compiler/lua54.can:365 +end, -- ./compiler/lua54.can:365 +["Repeat"] = function(t) -- ./compiler/lua54.can:368 +local hasContinue = any(t[1], { "Continue" }, loop) -- ./compiler/lua54.can:369 +local r = "repeat" .. indent() -- ./compiler/lua54.can:370 +if hasContinue then -- ./compiler/lua54.can:371 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:372 +end -- ./compiler/lua54.can:372 +r = r .. (lua(t[1])) -- ./compiler/lua54.can:374 +if hasContinue then -- ./compiler/lua54.can:375 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:376 +end -- ./compiler/lua54.can:376 +r = r .. (unindent() .. "until " .. lua(t[2])) -- ./compiler/lua54.can:378 +return r -- ./compiler/lua54.can:379 +end, -- ./compiler/lua54.can:379 +["If"] = function(t) -- ./compiler/lua54.can:382 +local r = "" -- ./compiler/lua54.can:383 +local toClose = 0 -- ./compiler/lua54.can:384 +local lets = search({ t[1] }, { "LetExpr" }) -- ./compiler/lua54.can:385 +if # lets > 0 then -- ./compiler/lua54.can:386 +r = r .. ("do" .. indent()) -- ./compiler/lua54.can:387 +toClose = toClose + (1) -- ./compiler/lua54.can:388 +for _, l in ipairs(lets) do -- ./compiler/lua54.can:389 +r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:390 +end -- ./compiler/lua54.can:390 +end -- ./compiler/lua54.can:390 +r = r .. ("if " .. lua(t[1]) .. " then" .. indent() .. lua(t[2]) .. unindent()) -- ./compiler/lua54.can:393 +for i = 3, # t - 1, 2 do -- ./compiler/lua54.can:394 +lets = search({ t[i] }, { "LetExpr" }) -- ./compiler/lua54.can:395 +if # lets > 0 then -- ./compiler/lua54.can:396 +r = r .. ("else" .. indent()) -- ./compiler/lua54.can:397 +toClose = toClose + (1) -- ./compiler/lua54.can:398 +for _, l in ipairs(lets) do -- ./compiler/lua54.can:399 +r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:400 +end -- ./compiler/lua54.can:400 +else -- ./compiler/lua54.can:400 +r = r .. ("else") -- ./compiler/lua54.can:403 +end -- ./compiler/lua54.can:403 +r = r .. ("if " .. lua(t[i]) .. " then" .. indent() .. lua(t[i + 1]) .. unindent()) -- ./compiler/lua54.can:405 +end -- ./compiler/lua54.can:405 +if # t % 2 == 1 then -- ./compiler/lua54.can:407 +r = r .. ("else" .. indent() .. lua(t[# t]) .. unindent()) -- ./compiler/lua54.can:408 end -- ./compiler/lua54.can:408 -else -- ./compiler/lua54.can:408 -r = r .. ("else") -- ./compiler/lua54.can:411 -end -- ./compiler/lua54.can:411 -r = r .. ("if " .. lua(t[i]) .. " then" .. indent() .. lua(t[i + 1]) .. unindent()) -- ./compiler/lua54.can:413 -end -- ./compiler/lua54.can:413 -if # t % 2 == 1 then -- ./compiler/lua54.can:415 -r = r .. ("else" .. indent() .. lua(t[# t]) .. unindent()) -- ./compiler/lua54.can:416 -end -- ./compiler/lua54.can:416 -r = r .. ("end") -- ./compiler/lua54.can:418 -for i = 1, toClose do -- ./compiler/lua54.can:419 -r = r .. (unindent() .. "end") -- ./compiler/lua54.can:420 -end -- ./compiler/lua54.can:420 -return r -- ./compiler/lua54.can:422 -end, -- ./compiler/lua54.can:422 -["Fornum"] = function(t) -- ./compiler/lua54.can:425 -local r = "for " .. lua(t[1]) .. " = " .. lua(t[2]) .. ", " .. lua(t[3]) -- ./compiler/lua54.can:426 -if # t == 5 then -- ./compiler/lua54.can:427 -local hasContinue = any(t[5], { "Continue" }, loop) -- ./compiler/lua54.can:428 -r = r .. (", " .. lua(t[4]) .. " do" .. indent()) -- ./compiler/lua54.can:429 -if hasContinue then -- ./compiler/lua54.can:430 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:431 -end -- ./compiler/lua54.can:431 -r = r .. (lua(t[5])) -- ./compiler/lua54.can:433 -if hasContinue then -- ./compiler/lua54.can:434 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:435 -end -- ./compiler/lua54.can:435 -return r .. unindent() .. "end" -- ./compiler/lua54.can:437 -else -- ./compiler/lua54.can:437 -local hasContinue = any(t[4], { "Continue" }, loop) -- ./compiler/lua54.can:439 -r = r .. (" do" .. indent()) -- ./compiler/lua54.can:440 -if hasContinue then -- ./compiler/lua54.can:441 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:442 -end -- ./compiler/lua54.can:442 -r = r .. (lua(t[4])) -- ./compiler/lua54.can:444 -if hasContinue then -- ./compiler/lua54.can:445 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:446 -end -- ./compiler/lua54.can:446 -return r .. unindent() .. "end" -- ./compiler/lua54.can:448 -end -- ./compiler/lua54.can:448 -end, -- ./compiler/lua54.can:448 -["Forin"] = function(t) -- ./compiler/lua54.can:452 -local destructured = {} -- ./compiler/lua54.can:453 -local hasContinue = any(t[3], { "Continue" }, loop) -- ./compiler/lua54.can:454 -local r = "for " .. push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") .. " in " .. lua(t[2], "_lhs") .. " do" .. indent() -- ./compiler/lua54.can:455 -if hasContinue then -- ./compiler/lua54.can:456 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:457 -end -- ./compiler/lua54.can:457 -r = r .. (DESTRUCTURING_ASSIGN(destructured, true) .. lua(t[3])) -- ./compiler/lua54.can:459 -if hasContinue then -- ./compiler/lua54.can:460 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:461 -end -- ./compiler/lua54.can:461 -return r .. unindent() .. "end" -- ./compiler/lua54.can:463 -end, -- ./compiler/lua54.can:463 -["Local"] = function(t) -- ./compiler/lua54.can:466 -local destructured = {} -- ./compiler/lua54.can:467 -local r = "local " .. push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") -- ./compiler/lua54.can:468 -if t[2][1] then -- ./compiler/lua54.can:469 -r = r .. (" = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:470 -end -- ./compiler/lua54.can:470 -return r .. DESTRUCTURING_ASSIGN(destructured) -- ./compiler/lua54.can:472 -end, -- ./compiler/lua54.can:472 -["Let"] = function(t) -- ./compiler/lua54.can:475 -local destructured = {} -- ./compiler/lua54.can:476 -local nameList = push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") -- ./compiler/lua54.can:477 -local r = "local " .. nameList -- ./compiler/lua54.can:478 -if t[2][1] then -- ./compiler/lua54.can:479 -if all(t[2], { -- ./compiler/lua54.can:480 -"Nil", -- ./compiler/lua54.can:480 -"Dots", -- ./compiler/lua54.can:480 -"Boolean", -- ./compiler/lua54.can:480 -"Number", -- ./compiler/lua54.can:480 -"String" -- ./compiler/lua54.can:480 -}) then -- ./compiler/lua54.can:480 -r = r .. (" = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:481 -else -- ./compiler/lua54.can:481 -r = r .. (newline() .. nameList .. " = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:483 -end -- ./compiler/lua54.can:483 -end -- ./compiler/lua54.can:483 -return r .. DESTRUCTURING_ASSIGN(destructured) -- ./compiler/lua54.can:486 +r = r .. ("end") -- ./compiler/lua54.can:410 +for i = 1, toClose do -- ./compiler/lua54.can:411 +r = r .. (unindent() .. "end") -- ./compiler/lua54.can:412 +end -- ./compiler/lua54.can:412 +return r -- ./compiler/lua54.can:414 +end, -- ./compiler/lua54.can:414 +["Fornum"] = function(t) -- ./compiler/lua54.can:417 +local r = "for " .. lua(t[1]) .. " = " .. lua(t[2]) .. ", " .. lua(t[3]) -- ./compiler/lua54.can:418 +if # t == 5 then -- ./compiler/lua54.can:419 +local hasContinue = any(t[5], { "Continue" }, loop) -- ./compiler/lua54.can:420 +r = r .. (", " .. lua(t[4]) .. " do" .. indent()) -- ./compiler/lua54.can:421 +if hasContinue then -- ./compiler/lua54.can:422 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:423 +end -- ./compiler/lua54.can:423 +r = r .. (lua(t[5])) -- ./compiler/lua54.can:425 +if hasContinue then -- ./compiler/lua54.can:426 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:427 +end -- ./compiler/lua54.can:427 +return r .. unindent() .. "end" -- ./compiler/lua54.can:429 +else -- ./compiler/lua54.can:429 +local hasContinue = any(t[4], { "Continue" }, loop) -- ./compiler/lua54.can:431 +r = r .. (" do" .. indent()) -- ./compiler/lua54.can:432 +if hasContinue then -- ./compiler/lua54.can:433 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:434 +end -- ./compiler/lua54.can:434 +r = r .. (lua(t[4])) -- ./compiler/lua54.can:436 +if hasContinue then -- ./compiler/lua54.can:437 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:438 +end -- ./compiler/lua54.can:438 +return r .. unindent() .. "end" -- ./compiler/lua54.can:440 +end -- ./compiler/lua54.can:440 +end, -- ./compiler/lua54.can:440 +["Forin"] = function(t) -- ./compiler/lua54.can:444 +local destructured = {} -- ./compiler/lua54.can:445 +local hasContinue = any(t[3], { "Continue" }, loop) -- ./compiler/lua54.can:446 +local r = "for " .. push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") .. " in " .. lua(t[2], "_lhs") .. " do" .. indent() -- ./compiler/lua54.can:447 +if hasContinue then -- ./compiler/lua54.can:448 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:449 +end -- ./compiler/lua54.can:449 +r = r .. (DESTRUCTURING_ASSIGN(destructured, true) .. lua(t[3])) -- ./compiler/lua54.can:451 +if hasContinue then -- ./compiler/lua54.can:452 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:453 +end -- ./compiler/lua54.can:453 +return r .. unindent() .. "end" -- ./compiler/lua54.can:455 +end, -- ./compiler/lua54.can:455 +["Local"] = function(t) -- ./compiler/lua54.can:458 +local destructured = {} -- ./compiler/lua54.can:459 +local r = "local " .. push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") -- ./compiler/lua54.can:460 +if t[2][1] then -- ./compiler/lua54.can:461 +r = r .. (" = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:462 +end -- ./compiler/lua54.can:462 +return r .. DESTRUCTURING_ASSIGN(destructured) -- ./compiler/lua54.can:464 +end, -- ./compiler/lua54.can:464 +["Let"] = function(t) -- ./compiler/lua54.can:467 +local destructured = {} -- ./compiler/lua54.can:468 +local nameList = push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") -- ./compiler/lua54.can:469 +local r = "local " .. nameList -- ./compiler/lua54.can:470 +if t[2][1] then -- ./compiler/lua54.can:471 +if all(t[2], { -- ./compiler/lua54.can:472 +"Nil", -- ./compiler/lua54.can:472 +"Dots", -- ./compiler/lua54.can:472 +"Boolean", -- ./compiler/lua54.can:472 +"Number", -- ./compiler/lua54.can:472 +"String" -- ./compiler/lua54.can:472 +}) then -- ./compiler/lua54.can:472 +r = r .. (" = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:473 +else -- ./compiler/lua54.can:473 +r = r .. (newline() .. nameList .. " = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:475 +end -- ./compiler/lua54.can:475 +end -- ./compiler/lua54.can:475 +return r .. DESTRUCTURING_ASSIGN(destructured) -- ./compiler/lua54.can:478 +end, -- ./compiler/lua54.can:478 +["Localrec"] = function(t) -- ./compiler/lua54.can:481 +return "local function " .. lua(t[1][1]) .. lua(t[2][1], "_functionWithoutKeyword") -- ./compiler/lua54.can:482 +end, -- ./compiler/lua54.can:482 +["Goto"] = function(t) -- ./compiler/lua54.can:485 +return "goto " .. lua(t, "Id") -- ./compiler/lua54.can:486 end, -- ./compiler/lua54.can:486 -["Localrec"] = function(t) -- ./compiler/lua54.can:489 -return "local function " .. lua(t[1][1]) .. lua(t[2][1], "_functionWithoutKeyword") -- ./compiler/lua54.can:490 +["Label"] = function(t) -- ./compiler/lua54.can:489 +return "::" .. lua(t, "Id") .. "::" -- ./compiler/lua54.can:490 end, -- ./compiler/lua54.can:490 -["Goto"] = function(t) -- ./compiler/lua54.can:493 -return "goto " .. lua(t, "Id") -- ./compiler/lua54.can:494 -end, -- ./compiler/lua54.can:494 -["Label"] = function(t) -- ./compiler/lua54.can:497 -return "::" .. lua(t, "Id") .. "::" -- ./compiler/lua54.can:498 -end, -- ./compiler/lua54.can:498 -["Return"] = function(t) -- ./compiler/lua54.can:501 -local push = peek("push") -- ./compiler/lua54.can:502 -if push then -- ./compiler/lua54.can:503 -local r = "" -- ./compiler/lua54.can:504 -for _, val in ipairs(t) do -- ./compiler/lua54.can:505 -r = r .. (push .. "[#" .. push .. "+1] = " .. lua(val) .. newline()) -- ./compiler/lua54.can:506 -end -- ./compiler/lua54.can:506 -return r .. "return " .. UNPACK(push) -- ./compiler/lua54.can:508 -else -- ./compiler/lua54.can:508 -return "return " .. lua(t, "_lhs") -- ./compiler/lua54.can:510 +["Return"] = function(t) -- ./compiler/lua54.can:493 +local push = peek("push") -- ./compiler/lua54.can:494 +if push then -- ./compiler/lua54.can:495 +local r = "" -- ./compiler/lua54.can:496 +for _, val in ipairs(t) do -- ./compiler/lua54.can:497 +r = r .. (push .. "[#" .. push .. "+1] = " .. lua(val) .. newline()) -- ./compiler/lua54.can:498 +end -- ./compiler/lua54.can:498 +return r .. "return " .. UNPACK(push) -- ./compiler/lua54.can:500 +else -- ./compiler/lua54.can:500 +return "return " .. lua(t, "_lhs") -- ./compiler/lua54.can:502 +end -- ./compiler/lua54.can:502 +end, -- ./compiler/lua54.can:502 +["Push"] = function(t) -- ./compiler/lua54.can:506 +local var = assert(peek("push"), "no context given for push") -- ./compiler/lua54.can:507 +r = "" -- ./compiler/lua54.can:508 +for i = 1, # t - 1, 1 do -- ./compiler/lua54.can:509 +r = r .. (var .. "[#" .. var .. "+1] = " .. lua(t[i]) .. newline()) -- ./compiler/lua54.can:510 end -- ./compiler/lua54.can:510 -end, -- ./compiler/lua54.can:510 -["Push"] = function(t) -- ./compiler/lua54.can:514 -local var = assert(peek("push"), "no context given for push") -- ./compiler/lua54.can:515 -r = "" -- ./compiler/lua54.can:516 -for i = 1, # t - 1, 1 do -- ./compiler/lua54.can:517 -r = r .. (var .. "[#" .. var .. "+1] = " .. lua(t[i]) .. newline()) -- ./compiler/lua54.can:518 -end -- ./compiler/lua54.can:518 -if t[# t] then -- ./compiler/lua54.can:520 -if t[# t]["tag"] == "Call" then -- ./compiler/lua54.can:521 -r = r .. (APPEND(var, lua(t[# t]))) -- ./compiler/lua54.can:522 -else -- ./compiler/lua54.can:522 -r = r .. (var .. "[#" .. var .. "+1] = " .. lua(t[# t])) -- ./compiler/lua54.can:524 -end -- ./compiler/lua54.can:524 -end -- ./compiler/lua54.can:524 -return r -- ./compiler/lua54.can:527 +if t[# t] then -- ./compiler/lua54.can:512 +if t[# t]["tag"] == "Call" then -- ./compiler/lua54.can:513 +r = r .. (APPEND(var, lua(t[# t]))) -- ./compiler/lua54.can:514 +else -- ./compiler/lua54.can:514 +r = r .. (var .. "[#" .. var .. "+1] = " .. lua(t[# t])) -- ./compiler/lua54.can:516 +end -- ./compiler/lua54.can:516 +end -- ./compiler/lua54.can:516 +return r -- ./compiler/lua54.can:519 +end, -- ./compiler/lua54.can:519 +["Break"] = function() -- ./compiler/lua54.can:522 +return "break" -- ./compiler/lua54.can:523 +end, -- ./compiler/lua54.can:523 +["Continue"] = function() -- ./compiler/lua54.can:526 +return "goto " .. var("continue") -- ./compiler/lua54.can:527 end, -- ./compiler/lua54.can:527 -["Break"] = function() -- ./compiler/lua54.can:530 -return "break" -- ./compiler/lua54.can:531 -end, -- ./compiler/lua54.can:531 -["Continue"] = function() -- ./compiler/lua54.can:534 -return "goto " .. var("continue") -- ./compiler/lua54.can:535 +["Nil"] = function() -- ./compiler/lua54.can:534 +return "nil" -- ./compiler/lua54.can:535 end, -- ./compiler/lua54.can:535 -["Nil"] = function() -- ./compiler/lua54.can:542 -return "nil" -- ./compiler/lua54.can:543 +["Dots"] = function() -- ./compiler/lua54.can:538 +return "..." -- ./compiler/lua54.can:539 +end, -- ./compiler/lua54.can:539 +["Boolean"] = function(t) -- ./compiler/lua54.can:542 +return tostring(t[1]) -- ./compiler/lua54.can:543 end, -- ./compiler/lua54.can:543 -["Dots"] = function() -- ./compiler/lua54.can:546 -local macroargs = peek("macroargs") -- ./compiler/lua54.can:547 -if macroargs and not nomacro["variables"]["..."] and macroargs["..."] then -- ./compiler/lua54.can:548 -nomacro["variables"]["..."] = true -- ./compiler/lua54.can:549 -local r = lua(macroargs["..."], "_lhs") -- ./compiler/lua54.can:550 -nomacro["variables"]["..."] = nil -- ./compiler/lua54.can:551 -return r -- ./compiler/lua54.can:552 -else -- ./compiler/lua54.can:552 -return "..." -- ./compiler/lua54.can:554 -end -- ./compiler/lua54.can:554 -end, -- ./compiler/lua54.can:554 -["Boolean"] = function(t) -- ./compiler/lua54.can:558 -return tostring(t[1]) -- ./compiler/lua54.can:559 -end, -- ./compiler/lua54.can:559 -["Number"] = function(t) -- ./compiler/lua54.can:562 -return tostring(t[1]) -- ./compiler/lua54.can:563 -end, -- ./compiler/lua54.can:563 -["String"] = function(t) -- ./compiler/lua54.can:566 -return ("%q"):format(t[1]) -- ./compiler/lua54.can:567 -end, -- ./compiler/lua54.can:567 -["_functionWithoutKeyword"] = function(t) -- ./compiler/lua54.can:570 -local r = "(" -- ./compiler/lua54.can:571 -local decl = {} -- ./compiler/lua54.can:572 -if t[1][1] then -- ./compiler/lua54.can:573 -if t[1][1]["tag"] == "ParPair" then -- ./compiler/lua54.can:574 -local id = lua(t[1][1][1]) -- ./compiler/lua54.can:575 -indentLevel = indentLevel + (1) -- ./compiler/lua54.can:576 -table["insert"](decl, "if " .. id .. " == nil then " .. id .. " = " .. lua(t[1][1][2]) .. " end") -- ./compiler/lua54.can:577 -indentLevel = indentLevel - (1) -- ./compiler/lua54.can:578 -r = r .. (id) -- ./compiler/lua54.can:579 -else -- ./compiler/lua54.can:579 -r = r .. (lua(t[1][1])) -- ./compiler/lua54.can:581 +["Number"] = function(t) -- ./compiler/lua54.can:546 +return tostring(t[1]) -- ./compiler/lua54.can:547 +end, -- ./compiler/lua54.can:547 +["String"] = function(t) -- ./compiler/lua54.can:550 +return ("%q"):format(t[1]) -- ./compiler/lua54.can:551 +end, -- ./compiler/lua54.can:551 +["_functionWithoutKeyword"] = function(t) -- ./compiler/lua54.can:554 +local r = "(" -- ./compiler/lua54.can:555 +local decl = {} -- ./compiler/lua54.can:556 +if t[1][1] then -- ./compiler/lua54.can:557 +if t[1][1]["tag"] == "ParPair" then -- ./compiler/lua54.can:558 +local id = lua(t[1][1][1]) -- ./compiler/lua54.can:559 +indentLevel = indentLevel + (1) -- ./compiler/lua54.can:560 +table["insert"](decl, "if " .. id .. " == nil then " .. id .. " = " .. lua(t[1][1][2]) .. " end") -- ./compiler/lua54.can:561 +indentLevel = indentLevel - (1) -- ./compiler/lua54.can:562 +r = r .. (id) -- ./compiler/lua54.can:563 +else -- ./compiler/lua54.can:563 +r = r .. (lua(t[1][1])) -- ./compiler/lua54.can:565 +end -- ./compiler/lua54.can:565 +for i = 2, # t[1], 1 do -- ./compiler/lua54.can:567 +if t[1][i]["tag"] == "ParPair" then -- ./compiler/lua54.can:568 +local id = lua(t[1][i][1]) -- ./compiler/lua54.can:569 +indentLevel = indentLevel + (1) -- ./compiler/lua54.can:570 +table["insert"](decl, "if " .. id .. " == nil then " .. id .. " = " .. lua(t[1][i][2]) .. " end") -- ./compiler/lua54.can:571 +indentLevel = indentLevel - (1) -- ./compiler/lua54.can:572 +r = r .. (", " .. id) -- ./compiler/lua54.can:573 +else -- ./compiler/lua54.can:573 +r = r .. (", " .. lua(t[1][i])) -- ./compiler/lua54.can:575 +end -- ./compiler/lua54.can:575 +end -- ./compiler/lua54.can:575 +end -- ./compiler/lua54.can:575 +r = r .. (")" .. indent()) -- ./compiler/lua54.can:579 +for _, d in ipairs(decl) do -- ./compiler/lua54.can:580 +r = r .. (d .. newline()) -- ./compiler/lua54.can:581 end -- ./compiler/lua54.can:581 -for i = 2, # t[1], 1 do -- ./compiler/lua54.can:583 -if t[1][i]["tag"] == "ParPair" then -- ./compiler/lua54.can:584 -local id = lua(t[1][i][1]) -- ./compiler/lua54.can:585 -indentLevel = indentLevel + (1) -- ./compiler/lua54.can:586 -table["insert"](decl, "if " .. id .. " == nil then " .. id .. " = " .. lua(t[1][i][2]) .. " end") -- ./compiler/lua54.can:587 -indentLevel = indentLevel - (1) -- ./compiler/lua54.can:588 -r = r .. (", " .. id) -- ./compiler/lua54.can:589 -else -- ./compiler/lua54.can:589 -r = r .. (", " .. lua(t[1][i])) -- ./compiler/lua54.can:591 -end -- ./compiler/lua54.can:591 -end -- ./compiler/lua54.can:591 -end -- ./compiler/lua54.can:591 -r = r .. (")" .. indent()) -- ./compiler/lua54.can:595 -for _, d in ipairs(decl) do -- ./compiler/lua54.can:596 -r = r .. (d .. newline()) -- ./compiler/lua54.can:597 -end -- ./compiler/lua54.can:597 -if t[2][# t[2]] and t[2][# t[2]]["tag"] == "Push" then -- ./compiler/lua54.can:599 -t[2][# t[2]]["tag"] = "Return" -- ./compiler/lua54.can:600 -end -- ./compiler/lua54.can:600 -local hasPush = any(t[2], { "Push" }, func) -- ./compiler/lua54.can:602 -if hasPush then -- ./compiler/lua54.can:603 -r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:604 -else -- ./compiler/lua54.can:604 -push("push", false) -- ./compiler/lua54.can:606 -end -- ./compiler/lua54.can:606 -r = r .. (lua(t[2])) -- ./compiler/lua54.can:608 -if hasPush and (t[2][# t[2]] and t[2][# t[2]]["tag"] ~= "Return") then -- ./compiler/lua54.can:609 -r = r .. (newline() .. "return " .. UNPACK(var("push"))) -- ./compiler/lua54.can:610 -end -- ./compiler/lua54.can:610 -pop("push") -- ./compiler/lua54.can:612 -return r .. unindent() .. "end" -- ./compiler/lua54.can:613 -end, -- ./compiler/lua54.can:613 -["Function"] = function(t) -- ./compiler/lua54.can:615 -return "function" .. lua(t, "_functionWithoutKeyword") -- ./compiler/lua54.can:616 -end, -- ./compiler/lua54.can:616 -["Pair"] = function(t) -- ./compiler/lua54.can:619 -return "[" .. lua(t[1]) .. "] = " .. lua(t[2]) -- ./compiler/lua54.can:620 -end, -- ./compiler/lua54.can:620 -["Table"] = function(t) -- ./compiler/lua54.can:622 -if # t == 0 then -- ./compiler/lua54.can:623 -return "{}" -- ./compiler/lua54.can:624 -elseif # t == 1 then -- ./compiler/lua54.can:625 -return "{ " .. lua(t, "_lhs") .. " }" -- ./compiler/lua54.can:626 +if t[2][# t[2]] and t[2][# t[2]]["tag"] == "Push" then -- ./compiler/lua54.can:583 +t[2][# t[2]]["tag"] = "Return" -- ./compiler/lua54.can:584 +end -- ./compiler/lua54.can:584 +local hasPush = any(t[2], { "Push" }, func) -- ./compiler/lua54.can:586 +if hasPush then -- ./compiler/lua54.can:587 +r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:588 +else -- ./compiler/lua54.can:588 +push("push", false) -- ./compiler/lua54.can:590 +end -- ./compiler/lua54.can:590 +r = r .. (lua(t[2])) -- ./compiler/lua54.can:592 +if hasPush and (t[2][# t[2]] and t[2][# t[2]]["tag"] ~= "Return") then -- ./compiler/lua54.can:593 +r = r .. (newline() .. "return " .. UNPACK(var("push"))) -- ./compiler/lua54.can:594 +end -- ./compiler/lua54.can:594 +pop("push") -- ./compiler/lua54.can:596 +return r .. unindent() .. "end" -- ./compiler/lua54.can:597 +end, -- ./compiler/lua54.can:597 +["Function"] = function(t) -- ./compiler/lua54.can:599 +return "function" .. lua(t, "_functionWithoutKeyword") -- ./compiler/lua54.can:600 +end, -- ./compiler/lua54.can:600 +["Pair"] = function(t) -- ./compiler/lua54.can:603 +return "[" .. lua(t[1]) .. "] = " .. lua(t[2]) -- ./compiler/lua54.can:604 +end, -- ./compiler/lua54.can:604 +["Table"] = function(t) -- ./compiler/lua54.can:606 +if # t == 0 then -- ./compiler/lua54.can:607 +return "{}" -- ./compiler/lua54.can:608 +elseif # t == 1 then -- ./compiler/lua54.can:609 +return "{ " .. lua(t, "_lhs") .. " }" -- ./compiler/lua54.can:610 +else -- ./compiler/lua54.can:610 +return "{" .. indent() .. lua(t, "_lhs", nil, true) .. unindent() .. "}" -- ./compiler/lua54.can:612 +end -- ./compiler/lua54.can:612 +end, -- ./compiler/lua54.can:612 +["TableCompr"] = function(t) -- ./compiler/lua54.can:616 +return push("push", "self") .. "(function()" .. indent() .. "local self = {}" .. newline() .. lua(t[1]) .. newline() .. "return self" .. unindent() .. "end)()" .. pop("push") -- ./compiler/lua54.can:617 +end, -- ./compiler/lua54.can:617 +["Op"] = function(t) -- ./compiler/lua54.can:620 +local r -- ./compiler/lua54.can:621 +if # t == 2 then -- ./compiler/lua54.can:622 +if type(tags["_opid"][t[1]]) == "string" then -- ./compiler/lua54.can:623 +r = tags["_opid"][t[1]] .. " " .. lua(t[2]) -- ./compiler/lua54.can:624 +else -- ./compiler/lua54.can:624 +r = tags["_opid"][t[1]](t[2]) -- ./compiler/lua54.can:626 +end -- ./compiler/lua54.can:626 else -- ./compiler/lua54.can:626 -return "{" .. indent() .. lua(t, "_lhs", nil, true) .. unindent() .. "}" -- ./compiler/lua54.can:628 -end -- ./compiler/lua54.can:628 -end, -- ./compiler/lua54.can:628 -["TableCompr"] = function(t) -- ./compiler/lua54.can:632 -return push("push", "self") .. "(function()" .. indent() .. "local self = {}" .. newline() .. lua(t[1]) .. newline() .. "return self" .. unindent() .. "end)()" .. pop("push") -- ./compiler/lua54.can:633 -end, -- ./compiler/lua54.can:633 -["Op"] = function(t) -- ./compiler/lua54.can:636 -local r -- ./compiler/lua54.can:637 -if # t == 2 then -- ./compiler/lua54.can:638 -if type(tags["_opid"][t[1]]) == "string" then -- ./compiler/lua54.can:639 -r = tags["_opid"][t[1]] .. " " .. lua(t[2]) -- ./compiler/lua54.can:640 -else -- ./compiler/lua54.can:640 -r = tags["_opid"][t[1]](t[2]) -- ./compiler/lua54.can:642 -end -- ./compiler/lua54.can:642 -else -- ./compiler/lua54.can:642 -if type(tags["_opid"][t[1]]) == "string" then -- ./compiler/lua54.can:645 -r = lua(t[2]) .. " " .. tags["_opid"][t[1]] .. " " .. lua(t[3]) -- ./compiler/lua54.can:646 -else -- ./compiler/lua54.can:646 -r = tags["_opid"][t[1]](t[2], t[3]) -- ./compiler/lua54.can:648 -end -- ./compiler/lua54.can:648 -end -- ./compiler/lua54.can:648 -return r -- ./compiler/lua54.can:651 -end, -- ./compiler/lua54.can:651 -["Paren"] = function(t) -- ./compiler/lua54.can:654 -return "(" .. lua(t[1]) .. ")" -- ./compiler/lua54.can:655 -end, -- ./compiler/lua54.can:655 -["MethodStub"] = function(t) -- ./compiler/lua54.can:658 -return "(function()" .. indent() .. "local " .. var("object") .. " = " .. lua(t[1]) .. newline() .. "local " .. var("method") .. " = " .. var("object") .. "." .. lua(t[2], "Id") .. newline() .. "if " .. var("method") .. " == nil then return nil end" .. newline() .. "return function(...) return " .. var("method") .. "(" .. var("object") .. ", ...) end" .. unindent() .. "end)()" -- ./compiler/lua54.can:664 -end, -- ./compiler/lua54.can:664 -["SafeMethodStub"] = function(t) -- ./compiler/lua54.can:667 -return "(function()" .. indent() .. "local " .. var("object") .. " = " .. lua(t[1]) .. newline() .. "if " .. var("object") .. " == nil then return nil end" .. newline() .. "local " .. var("method") .. " = " .. var("object") .. "." .. lua(t[2], "Id") .. newline() .. "if " .. var("method") .. " == nil then return nil end" .. newline() .. "return function(...) return " .. var("method") .. "(" .. var("object") .. ", ...) end" .. unindent() .. "end)()" -- ./compiler/lua54.can:674 -end, -- ./compiler/lua54.can:674 -["LetExpr"] = function(t) -- ./compiler/lua54.can:681 -return lua(t[1][1]) -- ./compiler/lua54.can:682 -end, -- ./compiler/lua54.can:682 -["_statexpr"] = function(t, stat) -- ./compiler/lua54.can:686 -local hasPush = any(t, { "Push" }, func) -- ./compiler/lua54.can:687 -local r = "(function()" .. indent() -- ./compiler/lua54.can:688 -if hasPush then -- ./compiler/lua54.can:689 -r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:690 -else -- ./compiler/lua54.can:690 -push("push", false) -- ./compiler/lua54.can:692 -end -- ./compiler/lua54.can:692 -r = r .. (lua(t, stat)) -- ./compiler/lua54.can:694 -if hasPush then -- ./compiler/lua54.can:695 -r = r .. (newline() .. "return " .. UNPACK(var("push"))) -- ./compiler/lua54.can:696 -end -- ./compiler/lua54.can:696 -pop("push") -- ./compiler/lua54.can:698 -r = r .. (unindent() .. "end)()") -- ./compiler/lua54.can:699 -return r -- ./compiler/lua54.can:700 -end, -- ./compiler/lua54.can:700 -["DoExpr"] = function(t) -- ./compiler/lua54.can:703 -if t[# t]["tag"] == "Push" then -- ./compiler/lua54.can:704 -t[# t]["tag"] = "Return" -- ./compiler/lua54.can:705 -end -- ./compiler/lua54.can:705 -return lua(t, "_statexpr", "Do") -- ./compiler/lua54.can:707 -end, -- ./compiler/lua54.can:707 -["WhileExpr"] = function(t) -- ./compiler/lua54.can:710 -return lua(t, "_statexpr", "While") -- ./compiler/lua54.can:711 -end, -- ./compiler/lua54.can:711 -["RepeatExpr"] = function(t) -- ./compiler/lua54.can:714 -return lua(t, "_statexpr", "Repeat") -- ./compiler/lua54.can:715 -end, -- ./compiler/lua54.can:715 -["IfExpr"] = function(t) -- ./compiler/lua54.can:718 -for i = 2, # t do -- ./compiler/lua54.can:719 -local block = t[i] -- ./compiler/lua54.can:720 -if block[# block] and block[# block]["tag"] == "Push" then -- ./compiler/lua54.can:721 -block[# block]["tag"] = "Return" -- ./compiler/lua54.can:722 -end -- ./compiler/lua54.can:722 -end -- ./compiler/lua54.can:722 -return lua(t, "_statexpr", "If") -- ./compiler/lua54.can:725 -end, -- ./compiler/lua54.can:725 -["FornumExpr"] = function(t) -- ./compiler/lua54.can:728 -return lua(t, "_statexpr", "Fornum") -- ./compiler/lua54.can:729 -end, -- ./compiler/lua54.can:729 -["ForinExpr"] = function(t) -- ./compiler/lua54.can:732 -return lua(t, "_statexpr", "Forin") -- ./compiler/lua54.can:733 +if type(tags["_opid"][t[1]]) == "string" then -- ./compiler/lua54.can:629 +r = lua(t[2]) .. " " .. tags["_opid"][t[1]] .. " " .. lua(t[3]) -- ./compiler/lua54.can:630 +else -- ./compiler/lua54.can:630 +r = tags["_opid"][t[1]](t[2], t[3]) -- ./compiler/lua54.can:632 +end -- ./compiler/lua54.can:632 +end -- ./compiler/lua54.can:632 +return r -- ./compiler/lua54.can:635 +end, -- ./compiler/lua54.can:635 +["Paren"] = function(t) -- ./compiler/lua54.can:638 +return "(" .. lua(t[1]) .. ")" -- ./compiler/lua54.can:639 +end, -- ./compiler/lua54.can:639 +["MethodStub"] = function(t) -- ./compiler/lua54.can:642 +return "(function()" .. indent() .. "local " .. var("object") .. " = " .. lua(t[1]) .. newline() .. "local " .. var("method") .. " = " .. var("object") .. "." .. lua(t[2], "Id") .. newline() .. "if " .. var("method") .. " == nil then return nil end" .. newline() .. "return function(...) return " .. var("method") .. "(" .. var("object") .. ", ...) end" .. unindent() .. "end)()" -- ./compiler/lua54.can:648 +end, -- ./compiler/lua54.can:648 +["SafeMethodStub"] = function(t) -- ./compiler/lua54.can:651 +return "(function()" .. indent() .. "local " .. var("object") .. " = " .. lua(t[1]) .. newline() .. "if " .. var("object") .. " == nil then return nil end" .. newline() .. "local " .. var("method") .. " = " .. var("object") .. "." .. lua(t[2], "Id") .. newline() .. "if " .. var("method") .. " == nil then return nil end" .. newline() .. "return function(...) return " .. var("method") .. "(" .. var("object") .. ", ...) end" .. unindent() .. "end)()" -- ./compiler/lua54.can:658 +end, -- ./compiler/lua54.can:658 +["LetExpr"] = function(t) -- ./compiler/lua54.can:665 +return lua(t[1][1]) -- ./compiler/lua54.can:666 +end, -- ./compiler/lua54.can:666 +["_statexpr"] = function(t, stat) -- ./compiler/lua54.can:670 +local hasPush = any(t, { "Push" }, func) -- ./compiler/lua54.can:671 +local r = "(function()" .. indent() -- ./compiler/lua54.can:672 +if hasPush then -- ./compiler/lua54.can:673 +r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:674 +else -- ./compiler/lua54.can:674 +push("push", false) -- ./compiler/lua54.can:676 +end -- ./compiler/lua54.can:676 +r = r .. (lua(t, stat)) -- ./compiler/lua54.can:678 +if hasPush then -- ./compiler/lua54.can:679 +r = r .. (newline() .. "return " .. UNPACK(var("push"))) -- ./compiler/lua54.can:680 +end -- ./compiler/lua54.can:680 +pop("push") -- ./compiler/lua54.can:682 +r = r .. (unindent() .. "end)()") -- ./compiler/lua54.can:683 +return r -- ./compiler/lua54.can:684 +end, -- ./compiler/lua54.can:684 +["DoExpr"] = function(t) -- ./compiler/lua54.can:687 +if t[# t]["tag"] == "Push" then -- ./compiler/lua54.can:688 +t[# t]["tag"] = "Return" -- ./compiler/lua54.can:689 +end -- ./compiler/lua54.can:689 +return lua(t, "_statexpr", "Do") -- ./compiler/lua54.can:691 +end, -- ./compiler/lua54.can:691 +["WhileExpr"] = function(t) -- ./compiler/lua54.can:694 +return lua(t, "_statexpr", "While") -- ./compiler/lua54.can:695 +end, -- ./compiler/lua54.can:695 +["RepeatExpr"] = function(t) -- ./compiler/lua54.can:698 +return lua(t, "_statexpr", "Repeat") -- ./compiler/lua54.can:699 +end, -- ./compiler/lua54.can:699 +["IfExpr"] = function(t) -- ./compiler/lua54.can:702 +for i = 2, # t do -- ./compiler/lua54.can:703 +local block = t[i] -- ./compiler/lua54.can:704 +if block[# block] and block[# block]["tag"] == "Push" then -- ./compiler/lua54.can:705 +block[# block]["tag"] = "Return" -- ./compiler/lua54.can:706 +end -- ./compiler/lua54.can:706 +end -- ./compiler/lua54.can:706 +return lua(t, "_statexpr", "If") -- ./compiler/lua54.can:709 +end, -- ./compiler/lua54.can:709 +["FornumExpr"] = function(t) -- ./compiler/lua54.can:712 +return lua(t, "_statexpr", "Fornum") -- ./compiler/lua54.can:713 +end, -- ./compiler/lua54.can:713 +["ForinExpr"] = function(t) -- ./compiler/lua54.can:716 +return lua(t, "_statexpr", "Forin") -- ./compiler/lua54.can:717 +end, -- ./compiler/lua54.can:717 +["Call"] = function(t) -- ./compiler/lua54.can:723 +if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua54.can:724 +return "(" .. lua(t[1]) .. ")(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:725 +elseif t[1]["tag"] == "MethodStub" then -- ./compiler/lua54.can:726 +if t[1][1]["tag"] == "String" or t[1][1]["tag"] == "Table" then -- ./compiler/lua54.can:727 +return "(" .. lua(t[1][1]) .. "):" .. lua(t[1][2], "Id") .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:728 +else -- ./compiler/lua54.can:728 +return lua(t[1][1]) .. ":" .. lua(t[1][2], "Id") .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:730 +end -- ./compiler/lua54.can:730 +else -- ./compiler/lua54.can:730 +return lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:733 +end -- ./compiler/lua54.can:733 end, -- ./compiler/lua54.can:733 -["Call"] = function(t) -- ./compiler/lua54.can:739 -if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua54.can:740 -return "(" .. lua(t[1]) .. ")(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:741 -elseif t[1]["tag"] == "Id" and not nomacro["functions"][t[1][1]] and macros["functions"][t[1][1]] then -- ./compiler/lua54.can:742 -local macro = macros["functions"][t[1][1]] -- ./compiler/lua54.can:743 -local replacement = macro["replacement"] -- ./compiler/lua54.can:744 -local r -- ./compiler/lua54.can:745 -nomacro["functions"][t[1][1]] = true -- ./compiler/lua54.can:746 -if type(replacement) == "function" then -- ./compiler/lua54.can:747 -local args = {} -- ./compiler/lua54.can:748 -for i = 2, # t do -- ./compiler/lua54.can:749 -table["insert"](args, lua(t[i])) -- ./compiler/lua54.can:750 -end -- ./compiler/lua54.can:750 -r = replacement(unpack(args)) -- ./compiler/lua54.can:752 -else -- ./compiler/lua54.can:752 -local macroargs = util["merge"](peek("macroargs")) -- ./compiler/lua54.can:754 -for i, arg in ipairs(macro["args"]) do -- ./compiler/lua54.can:755 -if arg["tag"] == "Dots" then -- ./compiler/lua54.can:756 -macroargs["..."] = (function() -- ./compiler/lua54.can:757 -local self = {} -- ./compiler/lua54.can:757 -for j = i + 1, # t do -- ./compiler/lua54.can:757 -self[#self+1] = t[j] -- ./compiler/lua54.can:757 -end -- ./compiler/lua54.can:757 -return self -- ./compiler/lua54.can:757 -end)() -- ./compiler/lua54.can:757 -elseif arg["tag"] == "Id" then -- ./compiler/lua54.can:758 -if t[i + 1] == nil then -- ./compiler/lua54.can:759 -error(("bad argument #%s to macro %s (value expected)"):format(i, t[1][1])) -- ./compiler/lua54.can:760 -end -- ./compiler/lua54.can:760 -macroargs[arg[1]] = t[i + 1] -- ./compiler/lua54.can:762 -else -- ./compiler/lua54.can:762 -error(("unexpected argument type %s in macro %s"):format(arg["tag"], t[1][1])) -- ./compiler/lua54.can:764 -end -- ./compiler/lua54.can:764 -end -- ./compiler/lua54.can:764 -push("macroargs", macroargs) -- ./compiler/lua54.can:767 -r = lua(replacement) -- ./compiler/lua54.can:768 -pop("macroargs") -- ./compiler/lua54.can:769 -end -- ./compiler/lua54.can:769 -nomacro["functions"][t[1][1]] = nil -- ./compiler/lua54.can:771 -return r -- ./compiler/lua54.can:772 -elseif t[1]["tag"] == "MethodStub" then -- ./compiler/lua54.can:773 -if t[1][1]["tag"] == "String" or t[1][1]["tag"] == "Table" then -- ./compiler/lua54.can:774 -return "(" .. lua(t[1][1]) .. "):" .. lua(t[1][2], "Id") .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:775 -else -- ./compiler/lua54.can:775 -return lua(t[1][1]) .. ":" .. lua(t[1][2], "Id") .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:777 -end -- ./compiler/lua54.can:777 -else -- ./compiler/lua54.can:777 -return lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:780 -end -- ./compiler/lua54.can:780 -end, -- ./compiler/lua54.can:780 -["SafeCall"] = function(t) -- ./compiler/lua54.can:784 -if t[1]["tag"] ~= "Id" then -- ./compiler/lua54.can:785 -return lua(t, "SafeIndex") -- ./compiler/lua54.can:786 -else -- ./compiler/lua54.can:786 -return "(" .. lua(t[1]) .. " ~= nil and " .. lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ") or nil)" -- ./compiler/lua54.can:788 -end -- ./compiler/lua54.can:788 -end, -- ./compiler/lua54.can:788 -["_lhs"] = function(t, start, newlines) -- ./compiler/lua54.can:793 -if start == nil then start = 1 end -- ./compiler/lua54.can:793 -local r -- ./compiler/lua54.can:794 -if t[start] then -- ./compiler/lua54.can:795 -r = lua(t[start]) -- ./compiler/lua54.can:796 -for i = start + 1, # t, 1 do -- ./compiler/lua54.can:797 -r = r .. ("," .. (newlines and newline() or " ") .. lua(t[i])) -- ./compiler/lua54.can:798 -end -- ./compiler/lua54.can:798 -else -- ./compiler/lua54.can:798 -r = "" -- ./compiler/lua54.can:801 -end -- ./compiler/lua54.can:801 -return r -- ./compiler/lua54.can:803 -end, -- ./compiler/lua54.can:803 -["Id"] = function(t) -- ./compiler/lua54.can:806 -local r = t[1] -- ./compiler/lua54.can:807 -local macroargs = peek("macroargs") -- ./compiler/lua54.can:808 -if not nomacro["variables"][t[1]] then -- ./compiler/lua54.can:809 -nomacro["variables"][t[1]] = true -- ./compiler/lua54.can:810 -if macroargs and macroargs[t[1]] then -- ./compiler/lua54.can:811 -r = lua(macroargs[t[1]]) -- ./compiler/lua54.can:812 -elseif macros["variables"][t[1]] ~= nil then -- ./compiler/lua54.can:813 -local macro = macros["variables"][t[1]] -- ./compiler/lua54.can:814 -if type(macro) == "function" then -- ./compiler/lua54.can:815 -r = macro() -- ./compiler/lua54.can:816 -else -- ./compiler/lua54.can:816 -r = lua(macro) -- ./compiler/lua54.can:818 -end -- ./compiler/lua54.can:818 -end -- ./compiler/lua54.can:818 -nomacro["variables"][t[1]] = nil -- ./compiler/lua54.can:821 -end -- ./compiler/lua54.can:821 -return r -- ./compiler/lua54.can:823 -end, -- ./compiler/lua54.can:823 -["AttributeId"] = function(t) -- ./compiler/lua54.can:826 -if t[2] then -- ./compiler/lua54.can:827 -return t[1] .. " <" .. t[2] .. ">" -- ./compiler/lua54.can:828 -else -- ./compiler/lua54.can:828 -return t[1] -- ./compiler/lua54.can:830 -end -- ./compiler/lua54.can:830 -end, -- ./compiler/lua54.can:830 -["DestructuringId"] = function(t) -- ./compiler/lua54.can:834 -if t["id"] then -- ./compiler/lua54.can:835 -return t["id"] -- ./compiler/lua54.can:836 -else -- ./compiler/lua54.can:836 -local d = assert(peek("destructuring"), "DestructuringId not in a destructurable assignement") -- ./compiler/lua54.can:838 -local vars = { ["id"] = tmp() } -- ./compiler/lua54.can:839 -for j = 1, # t, 1 do -- ./compiler/lua54.can:840 -table["insert"](vars, t[j]) -- ./compiler/lua54.can:841 -end -- ./compiler/lua54.can:841 -table["insert"](d, vars) -- ./compiler/lua54.can:843 -t["id"] = vars["id"] -- ./compiler/lua54.can:844 -return vars["id"] -- ./compiler/lua54.can:845 -end -- ./compiler/lua54.can:845 -end, -- ./compiler/lua54.can:845 -["Index"] = function(t) -- ./compiler/lua54.can:849 -if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua54.can:850 -return "(" .. lua(t[1]) .. ")[" .. lua(t[2]) .. "]" -- ./compiler/lua54.can:851 -else -- ./compiler/lua54.can:851 -return lua(t[1]) .. "[" .. lua(t[2]) .. "]" -- ./compiler/lua54.can:853 -end -- ./compiler/lua54.can:853 -end, -- ./compiler/lua54.can:853 -["SafeIndex"] = function(t) -- ./compiler/lua54.can:857 -if t[1]["tag"] ~= "Id" then -- ./compiler/lua54.can:858 -local l = {} -- ./compiler/lua54.can:859 -while t["tag"] == "SafeIndex" or t["tag"] == "SafeCall" do -- ./compiler/lua54.can:860 -table["insert"](l, 1, t) -- ./compiler/lua54.can:861 -t = t[1] -- ./compiler/lua54.can:862 -end -- ./compiler/lua54.can:862 -local r = "(function()" .. indent() .. "local " .. var("safe") .. " = " .. lua(l[1][1]) .. newline() -- ./compiler/lua54.can:864 -for _, e in ipairs(l) do -- ./compiler/lua54.can:865 -r = r .. ("if " .. var("safe") .. " == nil then return nil end" .. newline()) -- ./compiler/lua54.can:866 -if e["tag"] == "SafeIndex" then -- ./compiler/lua54.can:867 -r = r .. (var("safe") .. " = " .. var("safe") .. "[" .. lua(e[2]) .. "]" .. newline()) -- ./compiler/lua54.can:868 -else -- ./compiler/lua54.can:868 -r = r .. (var("safe") .. " = " .. var("safe") .. "(" .. lua(e, "_lhs", 2) .. ")" .. newline()) -- ./compiler/lua54.can:870 -end -- ./compiler/lua54.can:870 -end -- ./compiler/lua54.can:870 -r = r .. ("return " .. var("safe") .. unindent() .. "end)()") -- ./compiler/lua54.can:873 -return r -- ./compiler/lua54.can:874 -else -- ./compiler/lua54.can:874 -return "(" .. lua(t[1]) .. " ~= nil and " .. lua(t[1]) .. "[" .. lua(t[2]) .. "] or nil)" -- ./compiler/lua54.can:876 -end -- ./compiler/lua54.can:876 -end, -- ./compiler/lua54.can:876 -["_opid"] = { -- ./compiler/lua54.can:881 -["add"] = "+", -- ./compiler/lua54.can:882 -["sub"] = "-", -- ./compiler/lua54.can:882 -["mul"] = "*", -- ./compiler/lua54.can:882 -["div"] = "/", -- ./compiler/lua54.can:882 -["idiv"] = "//", -- ./compiler/lua54.can:883 -["mod"] = "%", -- ./compiler/lua54.can:883 -["pow"] = "^", -- ./compiler/lua54.can:883 -["concat"] = "..", -- ./compiler/lua54.can:883 -["band"] = "&", -- ./compiler/lua54.can:884 -["bor"] = "|", -- ./compiler/lua54.can:884 -["bxor"] = "~", -- ./compiler/lua54.can:884 -["shl"] = "<<", -- ./compiler/lua54.can:884 -["shr"] = ">>", -- ./compiler/lua54.can:884 -["eq"] = "==", -- ./compiler/lua54.can:885 -["ne"] = "~=", -- ./compiler/lua54.can:885 -["lt"] = "<", -- ./compiler/lua54.can:885 -["gt"] = ">", -- ./compiler/lua54.can:885 -["le"] = "<=", -- ./compiler/lua54.can:885 -["ge"] = ">=", -- ./compiler/lua54.can:885 -["and"] = "and", -- ./compiler/lua54.can:886 -["or"] = "or", -- ./compiler/lua54.can:886 -["unm"] = "-", -- ./compiler/lua54.can:886 -["len"] = "#", -- ./compiler/lua54.can:886 -["bnot"] = "~", -- ./compiler/lua54.can:886 -["not"] = "not" -- ./compiler/lua54.can:886 -} -- ./compiler/lua54.can:886 -}, { ["__index"] = function(self, key) -- ./compiler/lua54.can:889 -error("don't know how to compile a " .. tostring(key) .. " to " .. targetName) -- ./compiler/lua54.can:890 -end }) -- ./compiler/lua54.can:890 -local code = lua(ast) .. newline() -- ./compiler/lua54.can:896 -return requireStr .. code -- ./compiler/lua54.can:897 -end -- ./compiler/lua54.can:897 -end -- ./compiler/lua54.can:897 -local lua54 = _() or lua54 -- ./compiler/lua54.can:902 -package["loaded"]["compiler.lua54"] = lua54 or true -- ./compiler/lua54.can:903 -local function _() -- ./compiler/lua54.can:906 -local function _() -- ./compiler/lua54.can:908 -local util = require("candran.util") -- ./compiler/lua54.can:1 -local targetName = "Lua 5.4" -- ./compiler/lua54.can:3 -local unpack = unpack or table["unpack"] -- ./compiler/lua54.can:5 -return function(code, ast, options, macros) -- ./compiler/lua54.can:7 -if macros == nil then macros = { -- ./compiler/lua54.can:7 -["functions"] = {}, -- ./compiler/lua54.can:7 -["variables"] = {} -- ./compiler/lua54.can:7 -} end -- ./compiler/lua54.can:7 -local lastInputPos = 1 -- ./compiler/lua54.can:9 -local prevLinePos = 1 -- ./compiler/lua54.can:10 -local lastSource = options["chunkname"] or "nil" -- ./compiler/lua54.can:11 -local lastLine = 1 -- ./compiler/lua54.can:12 -local indentLevel = 0 -- ./compiler/lua54.can:15 -local function newline() -- ./compiler/lua54.can:17 -local r = options["newline"] .. string["rep"](options["indentation"], indentLevel) -- ./compiler/lua54.can:18 -if options["mapLines"] then -- ./compiler/lua54.can:19 -local sub = code:sub(lastInputPos) -- ./compiler/lua54.can:20 +["SafeCall"] = function(t) -- ./compiler/lua54.can:737 +if t[1]["tag"] ~= "Id" then -- ./compiler/lua54.can:738 +return lua(t, "SafeIndex") -- ./compiler/lua54.can:739 +else -- ./compiler/lua54.can:739 +return "(" .. lua(t[1]) .. " ~= nil and " .. lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ") or nil)" -- ./compiler/lua54.can:741 +end -- ./compiler/lua54.can:741 +end, -- ./compiler/lua54.can:741 +["_lhs"] = function(t, start, newlines) -- ./compiler/lua54.can:746 +if start == nil then start = 1 end -- ./compiler/lua54.can:746 +local r -- ./compiler/lua54.can:747 +if t[start] then -- ./compiler/lua54.can:748 +r = lua(t[start]) -- ./compiler/lua54.can:749 +for i = start + 1, # t, 1 do -- ./compiler/lua54.can:750 +r = r .. ("," .. (newlines and newline() or " ") .. lua(t[i])) -- ./compiler/lua54.can:751 +end -- ./compiler/lua54.can:751 +else -- ./compiler/lua54.can:751 +r = "" -- ./compiler/lua54.can:754 +end -- ./compiler/lua54.can:754 +return r -- ./compiler/lua54.can:756 +end, -- ./compiler/lua54.can:756 +["Id"] = function(t) -- ./compiler/lua54.can:759 +return t[1] -- ./compiler/lua54.can:760 +end, -- ./compiler/lua54.can:760 +["AttributeId"] = function(t) -- ./compiler/lua54.can:763 +if t[2] then -- ./compiler/lua54.can:764 +return t[1] .. " <" .. t[2] .. ">" -- ./compiler/lua54.can:765 +else -- ./compiler/lua54.can:765 +return t[1] -- ./compiler/lua54.can:767 +end -- ./compiler/lua54.can:767 +end, -- ./compiler/lua54.can:767 +["DestructuringId"] = function(t) -- ./compiler/lua54.can:771 +if t["id"] then -- ./compiler/lua54.can:772 +return t["id"] -- ./compiler/lua54.can:773 +else -- ./compiler/lua54.can:773 +local d = assert(peek("destructuring"), "DestructuringId not in a destructurable assignement") -- ./compiler/lua54.can:775 +local vars = { ["id"] = tmp() } -- ./compiler/lua54.can:776 +for j = 1, # t, 1 do -- ./compiler/lua54.can:777 +table["insert"](vars, t[j]) -- ./compiler/lua54.can:778 +end -- ./compiler/lua54.can:778 +table["insert"](d, vars) -- ./compiler/lua54.can:780 +t["id"] = vars["id"] -- ./compiler/lua54.can:781 +return vars["id"] -- ./compiler/lua54.can:782 +end -- ./compiler/lua54.can:782 +end, -- ./compiler/lua54.can:782 +["Index"] = function(t) -- ./compiler/lua54.can:786 +if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua54.can:787 +return "(" .. lua(t[1]) .. ")[" .. lua(t[2]) .. "]" -- ./compiler/lua54.can:788 +else -- ./compiler/lua54.can:788 +return lua(t[1]) .. "[" .. lua(t[2]) .. "]" -- ./compiler/lua54.can:790 +end -- ./compiler/lua54.can:790 +end, -- ./compiler/lua54.can:790 +["SafeIndex"] = function(t) -- ./compiler/lua54.can:794 +if t[1]["tag"] ~= "Id" then -- ./compiler/lua54.can:795 +local l = {} -- ./compiler/lua54.can:796 +while t["tag"] == "SafeIndex" or t["tag"] == "SafeCall" do -- ./compiler/lua54.can:797 +table["insert"](l, 1, t) -- ./compiler/lua54.can:798 +t = t[1] -- ./compiler/lua54.can:799 +end -- ./compiler/lua54.can:799 +local r = "(function()" .. indent() .. "local " .. var("safe") .. " = " .. lua(l[1][1]) .. newline() -- ./compiler/lua54.can:801 +for _, e in ipairs(l) do -- ./compiler/lua54.can:802 +r = r .. ("if " .. var("safe") .. " == nil then return nil end" .. newline()) -- ./compiler/lua54.can:803 +if e["tag"] == "SafeIndex" then -- ./compiler/lua54.can:804 +r = r .. (var("safe") .. " = " .. var("safe") .. "[" .. lua(e[2]) .. "]" .. newline()) -- ./compiler/lua54.can:805 +else -- ./compiler/lua54.can:805 +r = r .. (var("safe") .. " = " .. var("safe") .. "(" .. lua(e, "_lhs", 2) .. ")" .. newline()) -- ./compiler/lua54.can:807 +end -- ./compiler/lua54.can:807 +end -- ./compiler/lua54.can:807 +r = r .. ("return " .. var("safe") .. unindent() .. "end)()") -- ./compiler/lua54.can:810 +return r -- ./compiler/lua54.can:811 +else -- ./compiler/lua54.can:811 +return "(" .. lua(t[1]) .. " ~= nil and " .. lua(t[1]) .. "[" .. lua(t[2]) .. "] or nil)" -- ./compiler/lua54.can:813 +end -- ./compiler/lua54.can:813 +end, -- ./compiler/lua54.can:813 +["_opid"] = { -- ./compiler/lua54.can:818 +["add"] = "+", -- ./compiler/lua54.can:819 +["sub"] = "-", -- ./compiler/lua54.can:819 +["mul"] = "*", -- ./compiler/lua54.can:819 +["div"] = "/", -- ./compiler/lua54.can:819 +["idiv"] = "//", -- ./compiler/lua54.can:820 +["mod"] = "%", -- ./compiler/lua54.can:820 +["pow"] = "^", -- ./compiler/lua54.can:820 +["concat"] = "..", -- ./compiler/lua54.can:820 +["band"] = "&", -- ./compiler/lua54.can:821 +["bor"] = "|", -- ./compiler/lua54.can:821 +["bxor"] = "~", -- ./compiler/lua54.can:821 +["shl"] = "<<", -- ./compiler/lua54.can:821 +["shr"] = ">>", -- ./compiler/lua54.can:821 +["eq"] = "==", -- ./compiler/lua54.can:822 +["ne"] = "~=", -- ./compiler/lua54.can:822 +["lt"] = "<", -- ./compiler/lua54.can:822 +["gt"] = ">", -- ./compiler/lua54.can:822 +["le"] = "<=", -- ./compiler/lua54.can:822 +["ge"] = ">=", -- ./compiler/lua54.can:822 +["and"] = "and", -- ./compiler/lua54.can:823 +["or"] = "or", -- ./compiler/lua54.can:823 +["unm"] = "-", -- ./compiler/lua54.can:823 +["len"] = "#", -- ./compiler/lua54.can:823 +["bnot"] = "~", -- ./compiler/lua54.can:823 +["not"] = "not" -- ./compiler/lua54.can:823 +} -- ./compiler/lua54.can:823 +}, { ["__index"] = function(self, key) -- ./compiler/lua54.can:826 +error("don't know how to compile a " .. tostring(key) .. " to " .. targetName) -- ./compiler/lua54.can:827 +end }) -- ./compiler/lua54.can:827 +local code = lua(ast) .. newline() -- ./compiler/lua54.can:833 +return requireStr .. code -- ./compiler/lua54.can:834 +end -- ./compiler/lua54.can:834 +end -- ./compiler/lua54.can:834 +local lua54 = _() or lua54 -- ./compiler/lua54.can:839 +package["loaded"]["compiler.lua54"] = lua54 or true -- ./compiler/lua54.can:840 +local function _() -- ./compiler/lua54.can:843 +local function _() -- ./compiler/lua54.can:845 +local targetName = "Lua 5.4" -- ./compiler/lua54.can:1 +return function(code, ast, options) -- ./compiler/lua54.can:3 +local lastInputPos = 1 -- ./compiler/lua54.can:5 +local prevLinePos = 1 -- ./compiler/lua54.can:6 +local lastSource = options["chunkname"] or "nil" -- ./compiler/lua54.can:7 +local lastLine = 1 -- ./compiler/lua54.can:8 +local indentLevel = 0 -- ./compiler/lua54.can:11 +local function newline() -- ./compiler/lua54.can:13 +local r = options["newline"] .. string["rep"](options["indentation"], indentLevel) -- ./compiler/lua54.can:14 +if options["mapLines"] then -- ./compiler/lua54.can:15 +local sub = code:sub(lastInputPos) -- ./compiler/lua54.can:16 local source, line = sub:sub(1, sub:find("\ ")):match(".*%-%- (.-)%:(%d+)\ -") -- ./compiler/lua54.can:21 -if source and line then -- ./compiler/lua54.can:23 -lastSource = source -- ./compiler/lua54.can:24 -lastLine = tonumber(line) -- ./compiler/lua54.can:25 -else -- ./compiler/lua54.can:25 +") -- ./compiler/lua54.can:17 +if source and line then -- ./compiler/lua54.can:19 +lastSource = source -- ./compiler/lua54.can:20 +lastLine = tonumber(line) -- ./compiler/lua54.can:21 +else -- ./compiler/lua54.can:21 for _ in code:sub(prevLinePos, lastInputPos):gmatch("\ -") do -- ./compiler/lua54.can:27 -lastLine = lastLine + (1) -- ./compiler/lua54.can:28 -end -- ./compiler/lua54.can:28 -end -- ./compiler/lua54.can:28 -prevLinePos = lastInputPos -- ./compiler/lua54.can:32 -r = " -- " .. lastSource .. ":" .. lastLine .. r -- ./compiler/lua54.can:34 -end -- ./compiler/lua54.can:34 -return r -- ./compiler/lua54.can:36 -end -- ./compiler/lua54.can:36 -local function indent() -- ./compiler/lua54.can:39 -indentLevel = indentLevel + (1) -- ./compiler/lua54.can:40 -return newline() -- ./compiler/lua54.can:41 -end -- ./compiler/lua54.can:41 -local function unindent() -- ./compiler/lua54.can:44 -indentLevel = indentLevel - (1) -- ./compiler/lua54.can:45 -return newline() -- ./compiler/lua54.can:46 -end -- ./compiler/lua54.can:46 -local states = { -- ./compiler/lua54.can:51 -["push"] = {}, -- ./compiler/lua54.can:52 -["destructuring"] = {}, -- ./compiler/lua54.can:53 -["scope"] = {}, -- ./compiler/lua54.can:54 -["macroargs"] = {} -- ./compiler/lua54.can:55 -} -- ./compiler/lua54.can:55 -local function push(name, state) -- ./compiler/lua54.can:58 -table["insert"](states[name], state) -- ./compiler/lua54.can:59 +") do -- ./compiler/lua54.can:23 +lastLine = lastLine + (1) -- ./compiler/lua54.can:24 +end -- ./compiler/lua54.can:24 +end -- ./compiler/lua54.can:24 +prevLinePos = lastInputPos -- ./compiler/lua54.can:28 +r = " -- " .. lastSource .. ":" .. lastLine .. r -- ./compiler/lua54.can:30 +end -- ./compiler/lua54.can:30 +return r -- ./compiler/lua54.can:32 +end -- ./compiler/lua54.can:32 +local function indent() -- ./compiler/lua54.can:35 +indentLevel = indentLevel + (1) -- ./compiler/lua54.can:36 +return newline() -- ./compiler/lua54.can:37 +end -- ./compiler/lua54.can:37 +local function unindent() -- ./compiler/lua54.can:40 +indentLevel = indentLevel - (1) -- ./compiler/lua54.can:41 +return newline() -- ./compiler/lua54.can:42 +end -- ./compiler/lua54.can:42 +local states = { -- ./compiler/lua54.can:47 +["push"] = {}, -- ./compiler/lua54.can:48 +["destructuring"] = {}, -- ./compiler/lua54.can:49 +["scope"] = {} -- ./compiler/lua54.can:50 +} -- ./compiler/lua54.can:50 +local function push(name, state) -- ./compiler/lua54.can:53 +table["insert"](states[name], state) -- ./compiler/lua54.can:54 +return "" -- ./compiler/lua54.can:55 +end -- ./compiler/lua54.can:55 +local function pop(name) -- ./compiler/lua54.can:58 +table["remove"](states[name]) -- ./compiler/lua54.can:59 return "" -- ./compiler/lua54.can:60 end -- ./compiler/lua54.can:60 -local function pop(name) -- ./compiler/lua54.can:63 -table["remove"](states[name]) -- ./compiler/lua54.can:64 +local function set(name, state) -- ./compiler/lua54.can:63 +states[name][# states[name]] = state -- ./compiler/lua54.can:64 return "" -- ./compiler/lua54.can:65 end -- ./compiler/lua54.can:65 -local function set(name, state) -- ./compiler/lua54.can:68 -states[name][# states[name]] = state -- ./compiler/lua54.can:69 -return "" -- ./compiler/lua54.can:70 -end -- ./compiler/lua54.can:70 -local function peek(name) -- ./compiler/lua54.can:73 -return states[name][# states[name]] -- ./compiler/lua54.can:74 -end -- ./compiler/lua54.can:74 -local function var(name) -- ./compiler/lua54.can:79 -return options["variablePrefix"] .. name -- ./compiler/lua54.can:80 -end -- ./compiler/lua54.can:80 -local function tmp() -- ./compiler/lua54.can:84 -local scope = peek("scope") -- ./compiler/lua54.can:85 -local var = ("%s_%s"):format(options["variablePrefix"], # scope) -- ./compiler/lua54.can:86 -table["insert"](scope, var) -- ./compiler/lua54.can:87 -return var -- ./compiler/lua54.can:88 -end -- ./compiler/lua54.can:88 -local nomacro = { -- ./compiler/lua54.can:92 -["variables"] = {}, -- ./compiler/lua54.can:92 -["functions"] = {} -- ./compiler/lua54.can:92 -} -- ./compiler/lua54.can:92 -local required = {} -- ./compiler/lua54.can:95 -local requireStr = "" -- ./compiler/lua54.can:96 -local function addRequire(mod, name, field) -- ./compiler/lua54.can:98 -local req = ("require(%q)%s"):format(mod, field and "." .. field or "") -- ./compiler/lua54.can:99 -if not required[req] then -- ./compiler/lua54.can:100 -requireStr = requireStr .. (("local %s = %s%s"):format(var(name), req, options["newline"])) -- ./compiler/lua54.can:101 -required[req] = true -- ./compiler/lua54.can:102 -end -- ./compiler/lua54.can:102 -end -- ./compiler/lua54.can:102 -local loop = { -- ./compiler/lua54.can:107 -"While", -- ./compiler/lua54.can:107 -"Repeat", -- ./compiler/lua54.can:107 -"Fornum", -- ./compiler/lua54.can:107 -"Forin", -- ./compiler/lua54.can:107 -"WhileExpr", -- ./compiler/lua54.can:107 -"RepeatExpr", -- ./compiler/lua54.can:107 -"FornumExpr", -- ./compiler/lua54.can:107 -"ForinExpr" -- ./compiler/lua54.can:107 -} -- ./compiler/lua54.can:107 -local func = { -- ./compiler/lua54.can:108 -"Function", -- ./compiler/lua54.can:108 -"TableCompr", -- ./compiler/lua54.can:108 -"DoExpr", -- ./compiler/lua54.can:108 -"WhileExpr", -- ./compiler/lua54.can:108 -"RepeatExpr", -- ./compiler/lua54.can:108 -"IfExpr", -- ./compiler/lua54.can:108 -"FornumExpr", -- ./compiler/lua54.can:108 -"ForinExpr" -- ./compiler/lua54.can:108 -} -- ./compiler/lua54.can:108 -local function any(list, tags, nofollow) -- ./compiler/lua54.can:112 -if nofollow == nil then nofollow = {} end -- ./compiler/lua54.can:112 -local tagsCheck = {} -- ./compiler/lua54.can:113 -for _, tag in ipairs(tags) do -- ./compiler/lua54.can:114 -tagsCheck[tag] = true -- ./compiler/lua54.can:115 -end -- ./compiler/lua54.can:115 -local nofollowCheck = {} -- ./compiler/lua54.can:117 -for _, tag in ipairs(nofollow) do -- ./compiler/lua54.can:118 -nofollowCheck[tag] = true -- ./compiler/lua54.can:119 -end -- ./compiler/lua54.can:119 -for _, node in ipairs(list) do -- ./compiler/lua54.can:121 -if type(node) == "table" then -- ./compiler/lua54.can:122 -if tagsCheck[node["tag"]] then -- ./compiler/lua54.can:123 -return node -- ./compiler/lua54.can:124 +local function peek(name) -- ./compiler/lua54.can:68 +return states[name][# states[name]] -- ./compiler/lua54.can:69 +end -- ./compiler/lua54.can:69 +local function var(name) -- ./compiler/lua54.can:74 +return options["variablePrefix"] .. name -- ./compiler/lua54.can:75 +end -- ./compiler/lua54.can:75 +local function tmp() -- ./compiler/lua54.can:79 +local scope = peek("scope") -- ./compiler/lua54.can:80 +local var = ("%s_%s"):format(options["variablePrefix"], # scope) -- ./compiler/lua54.can:81 +table["insert"](scope, var) -- ./compiler/lua54.can:82 +return var -- ./compiler/lua54.can:83 +end -- ./compiler/lua54.can:83 +local required = {} -- ./compiler/lua54.can:87 +local requireStr = "" -- ./compiler/lua54.can:88 +local function addRequire(mod, name, field) -- ./compiler/lua54.can:90 +local req = ("require(%q)%s"):format(mod, field and "." .. field or "") -- ./compiler/lua54.can:91 +if not required[req] then -- ./compiler/lua54.can:92 +requireStr = requireStr .. (("local %s = %s%s"):format(var(name), req, options["newline"])) -- ./compiler/lua54.can:93 +required[req] = true -- ./compiler/lua54.can:94 +end -- ./compiler/lua54.can:94 +end -- ./compiler/lua54.can:94 +local loop = { -- ./compiler/lua54.can:99 +"While", -- ./compiler/lua54.can:99 +"Repeat", -- ./compiler/lua54.can:99 +"Fornum", -- ./compiler/lua54.can:99 +"Forin", -- ./compiler/lua54.can:99 +"WhileExpr", -- ./compiler/lua54.can:99 +"RepeatExpr", -- ./compiler/lua54.can:99 +"FornumExpr", -- ./compiler/lua54.can:99 +"ForinExpr" -- ./compiler/lua54.can:99 +} -- ./compiler/lua54.can:99 +local func = { -- ./compiler/lua54.can:100 +"Function", -- ./compiler/lua54.can:100 +"TableCompr", -- ./compiler/lua54.can:100 +"DoExpr", -- ./compiler/lua54.can:100 +"WhileExpr", -- ./compiler/lua54.can:100 +"RepeatExpr", -- ./compiler/lua54.can:100 +"IfExpr", -- ./compiler/lua54.can:100 +"FornumExpr", -- ./compiler/lua54.can:100 +"ForinExpr" -- ./compiler/lua54.can:100 +} -- ./compiler/lua54.can:100 +local function any(list, tags, nofollow) -- ./compiler/lua54.can:104 +if nofollow == nil then nofollow = {} end -- ./compiler/lua54.can:104 +local tagsCheck = {} -- ./compiler/lua54.can:105 +for _, tag in ipairs(tags) do -- ./compiler/lua54.can:106 +tagsCheck[tag] = true -- ./compiler/lua54.can:107 +end -- ./compiler/lua54.can:107 +local nofollowCheck = {} -- ./compiler/lua54.can:109 +for _, tag in ipairs(nofollow) do -- ./compiler/lua54.can:110 +nofollowCheck[tag] = true -- ./compiler/lua54.can:111 +end -- ./compiler/lua54.can:111 +for _, node in ipairs(list) do -- ./compiler/lua54.can:113 +if type(node) == "table" then -- ./compiler/lua54.can:114 +if tagsCheck[node["tag"]] then -- ./compiler/lua54.can:115 +return node -- ./compiler/lua54.can:116 +end -- ./compiler/lua54.can:116 +if not nofollowCheck[node["tag"]] then -- ./compiler/lua54.can:118 +local r = any(node, tags, nofollow) -- ./compiler/lua54.can:119 +if r then -- ./compiler/lua54.can:120 +return r -- ./compiler/lua54.can:120 +end -- ./compiler/lua54.can:120 +end -- ./compiler/lua54.can:120 +end -- ./compiler/lua54.can:120 +end -- ./compiler/lua54.can:120 +return nil -- ./compiler/lua54.can:124 end -- ./compiler/lua54.can:124 -if not nofollowCheck[node["tag"]] then -- ./compiler/lua54.can:126 -local r = any(node, tags, nofollow) -- ./compiler/lua54.can:127 -if r then -- ./compiler/lua54.can:128 -return r -- ./compiler/lua54.can:128 -end -- ./compiler/lua54.can:128 -end -- ./compiler/lua54.can:128 -end -- ./compiler/lua54.can:128 -end -- ./compiler/lua54.can:128 -return nil -- ./compiler/lua54.can:132 +local function search(list, tags, nofollow) -- ./compiler/lua54.can:129 +if nofollow == nil then nofollow = {} end -- ./compiler/lua54.can:129 +local tagsCheck = {} -- ./compiler/lua54.can:130 +for _, tag in ipairs(tags) do -- ./compiler/lua54.can:131 +tagsCheck[tag] = true -- ./compiler/lua54.can:132 end -- ./compiler/lua54.can:132 -local function search(list, tags, nofollow) -- ./compiler/lua54.can:137 -if nofollow == nil then nofollow = {} end -- ./compiler/lua54.can:137 -local tagsCheck = {} -- ./compiler/lua54.can:138 -for _, tag in ipairs(tags) do -- ./compiler/lua54.can:139 -tagsCheck[tag] = true -- ./compiler/lua54.can:140 -end -- ./compiler/lua54.can:140 -local nofollowCheck = {} -- ./compiler/lua54.can:142 -for _, tag in ipairs(nofollow) do -- ./compiler/lua54.can:143 -nofollowCheck[tag] = true -- ./compiler/lua54.can:144 -end -- ./compiler/lua54.can:144 -local found = {} -- ./compiler/lua54.can:146 -for _, node in ipairs(list) do -- ./compiler/lua54.can:147 -if type(node) == "table" then -- ./compiler/lua54.can:148 -if not nofollowCheck[node["tag"]] then -- ./compiler/lua54.can:149 -for _, n in ipairs(search(node, tags, nofollow)) do -- ./compiler/lua54.can:150 -table["insert"](found, n) -- ./compiler/lua54.can:151 +local nofollowCheck = {} -- ./compiler/lua54.can:134 +for _, tag in ipairs(nofollow) do -- ./compiler/lua54.can:135 +nofollowCheck[tag] = true -- ./compiler/lua54.can:136 +end -- ./compiler/lua54.can:136 +local found = {} -- ./compiler/lua54.can:138 +for _, node in ipairs(list) do -- ./compiler/lua54.can:139 +if type(node) == "table" then -- ./compiler/lua54.can:140 +if not nofollowCheck[node["tag"]] then -- ./compiler/lua54.can:141 +for _, n in ipairs(search(node, tags, nofollow)) do -- ./compiler/lua54.can:142 +table["insert"](found, n) -- ./compiler/lua54.can:143 +end -- ./compiler/lua54.can:143 +end -- ./compiler/lua54.can:143 +if tagsCheck[node["tag"]] then -- ./compiler/lua54.can:146 +table["insert"](found, node) -- ./compiler/lua54.can:147 +end -- ./compiler/lua54.can:147 +end -- ./compiler/lua54.can:147 +end -- ./compiler/lua54.can:147 +return found -- ./compiler/lua54.can:151 end -- ./compiler/lua54.can:151 -end -- ./compiler/lua54.can:151 -if tagsCheck[node["tag"]] then -- ./compiler/lua54.can:154 -table["insert"](found, node) -- ./compiler/lua54.can:155 -end -- ./compiler/lua54.can:155 -end -- ./compiler/lua54.can:155 -end -- ./compiler/lua54.can:155 -return found -- ./compiler/lua54.can:159 -end -- ./compiler/lua54.can:159 -local function all(list, tags) -- ./compiler/lua54.can:163 -for _, node in ipairs(list) do -- ./compiler/lua54.can:164 -local ok = false -- ./compiler/lua54.can:165 -for _, tag in ipairs(tags) do -- ./compiler/lua54.can:166 -if node["tag"] == tag then -- ./compiler/lua54.can:167 -ok = true -- ./compiler/lua54.can:168 -break -- ./compiler/lua54.can:169 -end -- ./compiler/lua54.can:169 -end -- ./compiler/lua54.can:169 -if not ok then -- ./compiler/lua54.can:172 -return false -- ./compiler/lua54.can:173 -end -- ./compiler/lua54.can:173 -end -- ./compiler/lua54.can:173 -return true -- ./compiler/lua54.can:176 +local function all(list, tags) -- ./compiler/lua54.can:155 +for _, node in ipairs(list) do -- ./compiler/lua54.can:156 +local ok = false -- ./compiler/lua54.can:157 +for _, tag in ipairs(tags) do -- ./compiler/lua54.can:158 +if node["tag"] == tag then -- ./compiler/lua54.can:159 +ok = true -- ./compiler/lua54.can:160 +break -- ./compiler/lua54.can:161 +end -- ./compiler/lua54.can:161 +end -- ./compiler/lua54.can:161 +if not ok then -- ./compiler/lua54.can:164 +return false -- ./compiler/lua54.can:165 +end -- ./compiler/lua54.can:165 +end -- ./compiler/lua54.can:165 +return true -- ./compiler/lua54.can:168 +end -- ./compiler/lua54.can:168 +local tags -- ./compiler/lua54.can:172 +local function lua(ast, forceTag, ...) -- ./compiler/lua54.can:174 +if options["mapLines"] and ast["pos"] then -- ./compiler/lua54.can:175 +lastInputPos = ast["pos"] -- ./compiler/lua54.can:176 end -- ./compiler/lua54.can:176 -local tags -- ./compiler/lua54.can:180 -local function lua(ast, forceTag, ...) -- ./compiler/lua54.can:182 -if options["mapLines"] and ast["pos"] then -- ./compiler/lua54.can:183 -lastInputPos = ast["pos"] -- ./compiler/lua54.can:184 -end -- ./compiler/lua54.can:184 -return tags[forceTag or ast["tag"]](ast, ...) -- ./compiler/lua54.can:186 +return tags[forceTag or ast["tag"]](ast, ...) -- ./compiler/lua54.can:178 +end -- ./compiler/lua54.can:178 +local UNPACK = function(list, i, j) -- ./compiler/lua54.can:182 +return "table.unpack(" .. list .. (i and (", " .. i .. (j and (", " .. j) or "")) or "") .. ")" -- ./compiler/lua54.can:183 +end -- ./compiler/lua54.can:183 +local APPEND = function(t, toAppend) -- ./compiler/lua54.can:185 +return "do" .. indent() .. "local " .. var("a") .. " = table.pack(" .. toAppend .. ")" .. newline() .. "table.move(" .. var("a") .. ", 1, " .. var("a") .. ".n, #" .. t .. "+1, " .. t .. ")" .. unindent() .. "end" -- ./compiler/lua54.can:186 end -- ./compiler/lua54.can:186 -local UNPACK = function(list, i, j) -- ./compiler/lua54.can:190 -return "table.unpack(" .. list .. (i and (", " .. i .. (j and (", " .. j) or "")) or "") .. ")" -- ./compiler/lua54.can:191 -end -- ./compiler/lua54.can:191 -local APPEND = function(t, toAppend) -- ./compiler/lua54.can:193 -return "do" .. indent() .. "local " .. var("a") .. " = table.pack(" .. toAppend .. ")" .. newline() .. "table.move(" .. var("a") .. ", 1, " .. var("a") .. ".n, #" .. t .. "+1, " .. t .. ")" .. unindent() .. "end" -- ./compiler/lua54.can:194 -end -- ./compiler/lua54.can:194 -local CONTINUE_START = function() -- ./compiler/lua54.can:196 -return "do" .. indent() -- ./compiler/lua54.can:197 -end -- ./compiler/lua54.can:197 -local CONTINUE_STOP = function() -- ./compiler/lua54.can:199 -return unindent() .. "end" .. newline() .. "::" .. var("continue") .. "::" -- ./compiler/lua54.can:200 -end -- ./compiler/lua54.can:200 -local DESTRUCTURING_ASSIGN = function(destructured, newlineAfter, noLocal) -- ./compiler/lua54.can:202 -if newlineAfter == nil then newlineAfter = false end -- ./compiler/lua54.can:202 -if noLocal == nil then noLocal = false end -- ./compiler/lua54.can:202 -local vars = {} -- ./compiler/lua54.can:203 -local values = {} -- ./compiler/lua54.can:204 -for _, list in ipairs(destructured) do -- ./compiler/lua54.can:205 -for _, v in ipairs(list) do -- ./compiler/lua54.can:206 -local var, val -- ./compiler/lua54.can:207 -if v["tag"] == "Id" or v["tag"] == "AttributeId" then -- ./compiler/lua54.can:208 -var = v -- ./compiler/lua54.can:209 +local CONTINUE_START = function() -- ./compiler/lua54.can:188 +return "do" .. indent() -- ./compiler/lua54.can:189 +end -- ./compiler/lua54.can:189 +local CONTINUE_STOP = function() -- ./compiler/lua54.can:191 +return unindent() .. "end" .. newline() .. "::" .. var("continue") .. "::" -- ./compiler/lua54.can:192 +end -- ./compiler/lua54.can:192 +local DESTRUCTURING_ASSIGN = function(destructured, newlineAfter, noLocal) -- ./compiler/lua54.can:194 +if newlineAfter == nil then newlineAfter = false end -- ./compiler/lua54.can:194 +if noLocal == nil then noLocal = false end -- ./compiler/lua54.can:194 +local vars = {} -- ./compiler/lua54.can:195 +local values = {} -- ./compiler/lua54.can:196 +for _, list in ipairs(destructured) do -- ./compiler/lua54.can:197 +for _, v in ipairs(list) do -- ./compiler/lua54.can:198 +local var, val -- ./compiler/lua54.can:199 +if v["tag"] == "Id" or v["tag"] == "AttributeId" then -- ./compiler/lua54.can:200 +var = v -- ./compiler/lua54.can:201 +val = { -- ./compiler/lua54.can:202 +["tag"] = "Index", -- ./compiler/lua54.can:202 +{ -- ./compiler/lua54.can:202 +["tag"] = "Id", -- ./compiler/lua54.can:202 +list["id"] -- ./compiler/lua54.can:202 +}, -- ./compiler/lua54.can:202 +{ -- ./compiler/lua54.can:202 +["tag"] = "String", -- ./compiler/lua54.can:202 +v[1] -- ./compiler/lua54.can:202 +} -- ./compiler/lua54.can:202 +} -- ./compiler/lua54.can:202 +elseif v["tag"] == "Pair" then -- ./compiler/lua54.can:203 +var = v[2] -- ./compiler/lua54.can:204 +val = { -- ./compiler/lua54.can:205 +["tag"] = "Index", -- ./compiler/lua54.can:205 +{ -- ./compiler/lua54.can:205 +["tag"] = "Id", -- ./compiler/lua54.can:205 +list["id"] -- ./compiler/lua54.can:205 +}, -- ./compiler/lua54.can:205 +v[1] -- ./compiler/lua54.can:205 +} -- ./compiler/lua54.can:205 +else -- ./compiler/lua54.can:205 +error("unknown destructuring element type: " .. tostring(v["tag"])) -- ./compiler/lua54.can:207 +end -- ./compiler/lua54.can:207 +if destructured["rightOp"] and destructured["leftOp"] then -- ./compiler/lua54.can:209 val = { -- ./compiler/lua54.can:210 -["tag"] = "Index", -- ./compiler/lua54.can:210 +["tag"] = "Op", -- ./compiler/lua54.can:210 +destructured["rightOp"], -- ./compiler/lua54.can:210 +var, -- ./compiler/lua54.can:210 { -- ./compiler/lua54.can:210 -["tag"] = "Id", -- ./compiler/lua54.can:210 -list["id"] -- ./compiler/lua54.can:210 -}, -- ./compiler/lua54.can:210 -{ -- ./compiler/lua54.can:210 -["tag"] = "String", -- ./compiler/lua54.can:210 -v[1] -- ./compiler/lua54.can:210 +["tag"] = "Op", -- ./compiler/lua54.can:210 +destructured["leftOp"], -- ./compiler/lua54.can:210 +val, -- ./compiler/lua54.can:210 +var -- ./compiler/lua54.can:210 } -- ./compiler/lua54.can:210 } -- ./compiler/lua54.can:210 -elseif v["tag"] == "Pair" then -- ./compiler/lua54.can:211 -var = v[2] -- ./compiler/lua54.can:212 -val = { -- ./compiler/lua54.can:213 -["tag"] = "Index", -- ./compiler/lua54.can:213 -{ -- ./compiler/lua54.can:213 -["tag"] = "Id", -- ./compiler/lua54.can:213 -list["id"] -- ./compiler/lua54.can:213 -}, -- ./compiler/lua54.can:213 -v[1] -- ./compiler/lua54.can:213 -} -- ./compiler/lua54.can:213 -else -- ./compiler/lua54.can:213 -error("unknown destructuring element type: " .. tostring(v["tag"])) -- ./compiler/lua54.can:215 -end -- ./compiler/lua54.can:215 -if destructured["rightOp"] and destructured["leftOp"] then -- ./compiler/lua54.can:217 -val = { -- ./compiler/lua54.can:218 -["tag"] = "Op", -- ./compiler/lua54.can:218 -destructured["rightOp"], -- ./compiler/lua54.can:218 -var, -- ./compiler/lua54.can:218 -{ -- ./compiler/lua54.can:218 -["tag"] = "Op", -- ./compiler/lua54.can:218 -destructured["leftOp"], -- ./compiler/lua54.can:218 -val, -- ./compiler/lua54.can:218 -var -- ./compiler/lua54.can:218 -} -- ./compiler/lua54.can:218 -} -- ./compiler/lua54.can:218 -elseif destructured["rightOp"] then -- ./compiler/lua54.can:219 -val = { -- ./compiler/lua54.can:220 -["tag"] = "Op", -- ./compiler/lua54.can:220 -destructured["rightOp"], -- ./compiler/lua54.can:220 -var, -- ./compiler/lua54.can:220 -val -- ./compiler/lua54.can:220 -} -- ./compiler/lua54.can:220 -elseif destructured["leftOp"] then -- ./compiler/lua54.can:221 -val = { -- ./compiler/lua54.can:222 -["tag"] = "Op", -- ./compiler/lua54.can:222 -destructured["leftOp"], -- ./compiler/lua54.can:222 -val, -- ./compiler/lua54.can:222 -var -- ./compiler/lua54.can:222 -} -- ./compiler/lua54.can:222 -end -- ./compiler/lua54.can:222 -table["insert"](vars, lua(var)) -- ./compiler/lua54.can:224 -table["insert"](values, lua(val)) -- ./compiler/lua54.can:225 +elseif destructured["rightOp"] then -- ./compiler/lua54.can:211 +val = { -- ./compiler/lua54.can:212 +["tag"] = "Op", -- ./compiler/lua54.can:212 +destructured["rightOp"], -- ./compiler/lua54.can:212 +var, -- ./compiler/lua54.can:212 +val -- ./compiler/lua54.can:212 +} -- ./compiler/lua54.can:212 +elseif destructured["leftOp"] then -- ./compiler/lua54.can:213 +val = { -- ./compiler/lua54.can:214 +["tag"] = "Op", -- ./compiler/lua54.can:214 +destructured["leftOp"], -- ./compiler/lua54.can:214 +val, -- ./compiler/lua54.can:214 +var -- ./compiler/lua54.can:214 +} -- ./compiler/lua54.can:214 +end -- ./compiler/lua54.can:214 +table["insert"](vars, lua(var)) -- ./compiler/lua54.can:216 +table["insert"](values, lua(val)) -- ./compiler/lua54.can:217 +end -- ./compiler/lua54.can:217 +end -- ./compiler/lua54.can:217 +if # vars > 0 then -- ./compiler/lua54.can:220 +local decl = noLocal and "" or "local " -- ./compiler/lua54.can:221 +if newlineAfter then -- ./compiler/lua54.can:222 +return decl .. table["concat"](vars, ", ") .. " = " .. table["concat"](values, ", ") .. newline() -- ./compiler/lua54.can:223 +else -- ./compiler/lua54.can:223 +return newline() .. decl .. table["concat"](vars, ", ") .. " = " .. table["concat"](values, ", ") -- ./compiler/lua54.can:225 end -- ./compiler/lua54.can:225 -end -- ./compiler/lua54.can:225 -if # vars > 0 then -- ./compiler/lua54.can:228 -local decl = noLocal and "" or "local " -- ./compiler/lua54.can:229 -if newlineAfter then -- ./compiler/lua54.can:230 -return decl .. table["concat"](vars, ", ") .. " = " .. table["concat"](values, ", ") .. newline() -- ./compiler/lua54.can:231 -else -- ./compiler/lua54.can:231 -return newline() .. decl .. table["concat"](vars, ", ") .. " = " .. table["concat"](values, ", ") -- ./compiler/lua54.can:233 -end -- ./compiler/lua54.can:233 -else -- ./compiler/lua54.can:233 -return "" -- ./compiler/lua54.can:236 -end -- ./compiler/lua54.can:236 -end -- ./compiler/lua54.can:236 -tags = setmetatable({ -- ./compiler/lua54.can:241 -["Block"] = function(t) -- ./compiler/lua54.can:243 -local hasPush = peek("push") == nil and any(t, { "Push" }, func) -- ./compiler/lua54.can:244 -if hasPush and hasPush == t[# t] then -- ./compiler/lua54.can:245 -hasPush["tag"] = "Return" -- ./compiler/lua54.can:246 -hasPush = false -- ./compiler/lua54.can:247 -end -- ./compiler/lua54.can:247 -local r = push("scope", {}) -- ./compiler/lua54.can:249 -if hasPush then -- ./compiler/lua54.can:250 -r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:251 -end -- ./compiler/lua54.can:251 -for i = 1, # t - 1, 1 do -- ./compiler/lua54.can:253 -r = r .. (lua(t[i]) .. newline()) -- ./compiler/lua54.can:254 -end -- ./compiler/lua54.can:254 -if t[# t] then -- ./compiler/lua54.can:256 -r = r .. (lua(t[# t])) -- ./compiler/lua54.can:257 -end -- ./compiler/lua54.can:257 -if hasPush and (t[# t] and t[# t]["tag"] ~= "Return") then -- ./compiler/lua54.can:259 -r = r .. (newline() .. "return " .. UNPACK(var("push")) .. pop("push")) -- ./compiler/lua54.can:260 -end -- ./compiler/lua54.can:260 -return r .. pop("scope") -- ./compiler/lua54.can:262 -end, -- ./compiler/lua54.can:262 -["Do"] = function(t) -- ./compiler/lua54.can:268 -return "do" .. indent() .. lua(t, "Block") .. unindent() .. "end" -- ./compiler/lua54.can:269 -end, -- ./compiler/lua54.can:269 -["Set"] = function(t) -- ./compiler/lua54.can:272 -local expr = t[# t] -- ./compiler/lua54.can:274 -local vars, values = {}, {} -- ./compiler/lua54.can:275 -local destructuringVars, destructuringValues = {}, {} -- ./compiler/lua54.can:276 -for i, n in ipairs(t[1]) do -- ./compiler/lua54.can:277 -if n["tag"] == "DestructuringId" then -- ./compiler/lua54.can:278 -table["insert"](destructuringVars, n) -- ./compiler/lua54.can:279 -table["insert"](destructuringValues, expr[i]) -- ./compiler/lua54.can:280 -else -- ./compiler/lua54.can:280 -table["insert"](vars, n) -- ./compiler/lua54.can:282 -table["insert"](values, expr[i]) -- ./compiler/lua54.can:283 -end -- ./compiler/lua54.can:283 -end -- ./compiler/lua54.can:283 -if # t == 2 or # t == 3 then -- ./compiler/lua54.can:287 -local r = "" -- ./compiler/lua54.can:288 -if # vars > 0 then -- ./compiler/lua54.can:289 -r = lua(vars, "_lhs") .. " = " .. lua(values, "_lhs") -- ./compiler/lua54.can:290 -end -- ./compiler/lua54.can:290 -if # destructuringVars > 0 then -- ./compiler/lua54.can:292 -local destructured = {} -- ./compiler/lua54.can:293 -r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:294 -return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:295 -end -- ./compiler/lua54.can:295 -return r -- ./compiler/lua54.can:297 -elseif # t == 4 then -- ./compiler/lua54.can:298 -if t[3] == "=" then -- ./compiler/lua54.can:299 -local r = "" -- ./compiler/lua54.can:300 -if # vars > 0 then -- ./compiler/lua54.can:301 -r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:302 -t[2], -- ./compiler/lua54.can:302 -vars[1], -- ./compiler/lua54.can:302 -{ -- ./compiler/lua54.can:302 -["tag"] = "Paren", -- ./compiler/lua54.can:302 -values[1] -- ./compiler/lua54.can:302 -} -- ./compiler/lua54.can:302 -}, "Op")) -- ./compiler/lua54.can:302 -for i = 2, math["min"](# t[4], # vars), 1 do -- ./compiler/lua54.can:303 -r = r .. (", " .. lua({ -- ./compiler/lua54.can:304 -t[2], -- ./compiler/lua54.can:304 -vars[i], -- ./compiler/lua54.can:304 -{ -- ./compiler/lua54.can:304 -["tag"] = "Paren", -- ./compiler/lua54.can:304 -values[i] -- ./compiler/lua54.can:304 -} -- ./compiler/lua54.can:304 -}, "Op")) -- ./compiler/lua54.can:304 -end -- ./compiler/lua54.can:304 -end -- ./compiler/lua54.can:304 -if # destructuringVars > 0 then -- ./compiler/lua54.can:307 -local destructured = { ["rightOp"] = t[2] } -- ./compiler/lua54.can:308 -r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:309 -return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:310 +else -- ./compiler/lua54.can:225 +return "" -- ./compiler/lua54.can:228 +end -- ./compiler/lua54.can:228 +end -- ./compiler/lua54.can:228 +tags = setmetatable({ -- ./compiler/lua54.can:233 +["Block"] = function(t) -- ./compiler/lua54.can:235 +local hasPush = peek("push") == nil and any(t, { "Push" }, func) -- ./compiler/lua54.can:236 +if hasPush and hasPush == t[# t] then -- ./compiler/lua54.can:237 +hasPush["tag"] = "Return" -- ./compiler/lua54.can:238 +hasPush = false -- ./compiler/lua54.can:239 +end -- ./compiler/lua54.can:239 +local r = push("scope", {}) -- ./compiler/lua54.can:241 +if hasPush then -- ./compiler/lua54.can:242 +r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:243 +end -- ./compiler/lua54.can:243 +for i = 1, # t - 1, 1 do -- ./compiler/lua54.can:245 +r = r .. (lua(t[i]) .. newline()) -- ./compiler/lua54.can:246 +end -- ./compiler/lua54.can:246 +if t[# t] then -- ./compiler/lua54.can:248 +r = r .. (lua(t[# t])) -- ./compiler/lua54.can:249 +end -- ./compiler/lua54.can:249 +if hasPush and (t[# t] and t[# t]["tag"] ~= "Return") then -- ./compiler/lua54.can:251 +r = r .. (newline() .. "return " .. UNPACK(var("push")) .. pop("push")) -- ./compiler/lua54.can:252 +end -- ./compiler/lua54.can:252 +return r .. pop("scope") -- ./compiler/lua54.can:254 +end, -- ./compiler/lua54.can:254 +["Do"] = function(t) -- ./compiler/lua54.can:260 +return "do" .. indent() .. lua(t, "Block") .. unindent() .. "end" -- ./compiler/lua54.can:261 +end, -- ./compiler/lua54.can:261 +["Set"] = function(t) -- ./compiler/lua54.can:264 +local expr = t[# t] -- ./compiler/lua54.can:266 +local vars, values = {}, {} -- ./compiler/lua54.can:267 +local destructuringVars, destructuringValues = {}, {} -- ./compiler/lua54.can:268 +for i, n in ipairs(t[1]) do -- ./compiler/lua54.can:269 +if n["tag"] == "DestructuringId" then -- ./compiler/lua54.can:270 +table["insert"](destructuringVars, n) -- ./compiler/lua54.can:271 +table["insert"](destructuringValues, expr[i]) -- ./compiler/lua54.can:272 +else -- ./compiler/lua54.can:272 +table["insert"](vars, n) -- ./compiler/lua54.can:274 +table["insert"](values, expr[i]) -- ./compiler/lua54.can:275 +end -- ./compiler/lua54.can:275 +end -- ./compiler/lua54.can:275 +if # t == 2 or # t == 3 then -- ./compiler/lua54.can:279 +local r = "" -- ./compiler/lua54.can:280 +if # vars > 0 then -- ./compiler/lua54.can:281 +r = lua(vars, "_lhs") .. " = " .. lua(values, "_lhs") -- ./compiler/lua54.can:282 +end -- ./compiler/lua54.can:282 +if # destructuringVars > 0 then -- ./compiler/lua54.can:284 +local destructured = {} -- ./compiler/lua54.can:285 +r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:286 +return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:287 +end -- ./compiler/lua54.can:287 +return r -- ./compiler/lua54.can:289 +elseif # t == 4 then -- ./compiler/lua54.can:290 +if t[3] == "=" then -- ./compiler/lua54.can:291 +local r = "" -- ./compiler/lua54.can:292 +if # vars > 0 then -- ./compiler/lua54.can:293 +r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:294 +t[2], -- ./compiler/lua54.can:294 +vars[1], -- ./compiler/lua54.can:294 +{ -- ./compiler/lua54.can:294 +["tag"] = "Paren", -- ./compiler/lua54.can:294 +values[1] -- ./compiler/lua54.can:294 +} -- ./compiler/lua54.can:294 +}, "Op")) -- ./compiler/lua54.can:294 +for i = 2, math["min"](# t[4], # vars), 1 do -- ./compiler/lua54.can:295 +r = r .. (", " .. lua({ -- ./compiler/lua54.can:296 +t[2], -- ./compiler/lua54.can:296 +vars[i], -- ./compiler/lua54.can:296 +{ -- ./compiler/lua54.can:296 +["tag"] = "Paren", -- ./compiler/lua54.can:296 +values[i] -- ./compiler/lua54.can:296 +} -- ./compiler/lua54.can:296 +}, "Op")) -- ./compiler/lua54.can:296 +end -- ./compiler/lua54.can:296 +end -- ./compiler/lua54.can:296 +if # destructuringVars > 0 then -- ./compiler/lua54.can:299 +local destructured = { ["rightOp"] = t[2] } -- ./compiler/lua54.can:300 +r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:301 +return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:302 +end -- ./compiler/lua54.can:302 +return r -- ./compiler/lua54.can:304 +else -- ./compiler/lua54.can:304 +local r = "" -- ./compiler/lua54.can:306 +if # vars > 0 then -- ./compiler/lua54.can:307 +r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:308 +t[3], -- ./compiler/lua54.can:308 +{ -- ./compiler/lua54.can:308 +["tag"] = "Paren", -- ./compiler/lua54.can:308 +values[1] -- ./compiler/lua54.can:308 +}, -- ./compiler/lua54.can:308 +vars[1] -- ./compiler/lua54.can:308 +}, "Op")) -- ./compiler/lua54.can:308 +for i = 2, math["min"](# t[4], # t[1]), 1 do -- ./compiler/lua54.can:309 +r = r .. (", " .. lua({ -- ./compiler/lua54.can:310 +t[3], -- ./compiler/lua54.can:310 +{ -- ./compiler/lua54.can:310 +["tag"] = "Paren", -- ./compiler/lua54.can:310 +values[i] -- ./compiler/lua54.can:310 +}, -- ./compiler/lua54.can:310 +vars[i] -- ./compiler/lua54.can:310 +}, "Op")) -- ./compiler/lua54.can:310 end -- ./compiler/lua54.can:310 -return r -- ./compiler/lua54.can:312 -else -- ./compiler/lua54.can:312 -local r = "" -- ./compiler/lua54.can:314 -if # vars > 0 then -- ./compiler/lua54.can:315 -r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:316 -t[3], -- ./compiler/lua54.can:316 -{ -- ./compiler/lua54.can:316 -["tag"] = "Paren", -- ./compiler/lua54.can:316 -values[1] -- ./compiler/lua54.can:316 -}, -- ./compiler/lua54.can:316 -vars[1] -- ./compiler/lua54.can:316 -}, "Op")) -- ./compiler/lua54.can:316 -for i = 2, math["min"](# t[4], # t[1]), 1 do -- ./compiler/lua54.can:317 -r = r .. (", " .. lua({ -- ./compiler/lua54.can:318 -t[3], -- ./compiler/lua54.can:318 -{ -- ./compiler/lua54.can:318 -["tag"] = "Paren", -- ./compiler/lua54.can:318 -values[i] -- ./compiler/lua54.can:318 -}, -- ./compiler/lua54.can:318 -vars[i] -- ./compiler/lua54.can:318 -}, "Op")) -- ./compiler/lua54.can:318 +end -- ./compiler/lua54.can:310 +if # destructuringVars > 0 then -- ./compiler/lua54.can:313 +local destructured = { ["leftOp"] = t[3] } -- ./compiler/lua54.can:314 +r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:315 +return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:316 +end -- ./compiler/lua54.can:316 +return r -- ./compiler/lua54.can:318 end -- ./compiler/lua54.can:318 -end -- ./compiler/lua54.can:318 -if # destructuringVars > 0 then -- ./compiler/lua54.can:321 -local destructured = { ["leftOp"] = t[3] } -- ./compiler/lua54.can:322 -r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:323 -return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:324 -end -- ./compiler/lua54.can:324 -return r -- ./compiler/lua54.can:326 -end -- ./compiler/lua54.can:326 -else -- ./compiler/lua54.can:326 -local r = "" -- ./compiler/lua54.can:329 -if # vars > 0 then -- ./compiler/lua54.can:330 -r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:331 -t[2], -- ./compiler/lua54.can:331 -vars[1], -- ./compiler/lua54.can:331 -{ -- ./compiler/lua54.can:331 -["tag"] = "Op", -- ./compiler/lua54.can:331 -t[4], -- ./compiler/lua54.can:331 -{ -- ./compiler/lua54.can:331 -["tag"] = "Paren", -- ./compiler/lua54.can:331 -values[1] -- ./compiler/lua54.can:331 -}, -- ./compiler/lua54.can:331 -vars[1] -- ./compiler/lua54.can:331 -} -- ./compiler/lua54.can:331 -}, "Op")) -- ./compiler/lua54.can:331 -for i = 2, math["min"](# t[5], # t[1]), 1 do -- ./compiler/lua54.can:332 -r = r .. (", " .. lua({ -- ./compiler/lua54.can:333 -t[2], -- ./compiler/lua54.can:333 -vars[i], -- ./compiler/lua54.can:333 -{ -- ./compiler/lua54.can:333 -["tag"] = "Op", -- ./compiler/lua54.can:333 -t[4], -- ./compiler/lua54.can:333 -{ -- ./compiler/lua54.can:333 -["tag"] = "Paren", -- ./compiler/lua54.can:333 -values[i] -- ./compiler/lua54.can:333 -}, -- ./compiler/lua54.can:333 -vars[i] -- ./compiler/lua54.can:333 -} -- ./compiler/lua54.can:333 -}, "Op")) -- ./compiler/lua54.can:333 +else -- ./compiler/lua54.can:318 +local r = "" -- ./compiler/lua54.can:321 +if # vars > 0 then -- ./compiler/lua54.can:322 +r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:323 +t[2], -- ./compiler/lua54.can:323 +vars[1], -- ./compiler/lua54.can:323 +{ -- ./compiler/lua54.can:323 +["tag"] = "Op", -- ./compiler/lua54.can:323 +t[4], -- ./compiler/lua54.can:323 +{ -- ./compiler/lua54.can:323 +["tag"] = "Paren", -- ./compiler/lua54.can:323 +values[1] -- ./compiler/lua54.can:323 +}, -- ./compiler/lua54.can:323 +vars[1] -- ./compiler/lua54.can:323 +} -- ./compiler/lua54.can:323 +}, "Op")) -- ./compiler/lua54.can:323 +for i = 2, math["min"](# t[5], # t[1]), 1 do -- ./compiler/lua54.can:324 +r = r .. (", " .. lua({ -- ./compiler/lua54.can:325 +t[2], -- ./compiler/lua54.can:325 +vars[i], -- ./compiler/lua54.can:325 +{ -- ./compiler/lua54.can:325 +["tag"] = "Op", -- ./compiler/lua54.can:325 +t[4], -- ./compiler/lua54.can:325 +{ -- ./compiler/lua54.can:325 +["tag"] = "Paren", -- ./compiler/lua54.can:325 +values[i] -- ./compiler/lua54.can:325 +}, -- ./compiler/lua54.can:325 +vars[i] -- ./compiler/lua54.can:325 +} -- ./compiler/lua54.can:325 +}, "Op")) -- ./compiler/lua54.can:325 +end -- ./compiler/lua54.can:325 +end -- ./compiler/lua54.can:325 +if # destructuringVars > 0 then -- ./compiler/lua54.can:328 +local destructured = { -- ./compiler/lua54.can:329 +["rightOp"] = t[2], -- ./compiler/lua54.can:329 +["leftOp"] = t[4] -- ./compiler/lua54.can:329 +} -- ./compiler/lua54.can:329 +r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:330 +return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:331 +end -- ./compiler/lua54.can:331 +return r -- ./compiler/lua54.can:333 end -- ./compiler/lua54.can:333 -end -- ./compiler/lua54.can:333 -if # destructuringVars > 0 then -- ./compiler/lua54.can:336 -local destructured = { -- ./compiler/lua54.can:337 -["rightOp"] = t[2], -- ./compiler/lua54.can:337 -["leftOp"] = t[4] -- ./compiler/lua54.can:337 -} -- ./compiler/lua54.can:337 -r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:338 -return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:339 -end -- ./compiler/lua54.can:339 -return r -- ./compiler/lua54.can:341 -end -- ./compiler/lua54.can:341 -end, -- ./compiler/lua54.can:341 -["While"] = function(t) -- ./compiler/lua54.can:345 -local r = "" -- ./compiler/lua54.can:346 -local hasContinue = any(t[2], { "Continue" }, loop) -- ./compiler/lua54.can:347 -local lets = search({ t[1] }, { "LetExpr" }) -- ./compiler/lua54.can:348 -if # lets > 0 then -- ./compiler/lua54.can:349 -r = r .. ("do" .. indent()) -- ./compiler/lua54.can:350 -for _, l in ipairs(lets) do -- ./compiler/lua54.can:351 -r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:352 +end, -- ./compiler/lua54.can:333 +["While"] = function(t) -- ./compiler/lua54.can:337 +local r = "" -- ./compiler/lua54.can:338 +local hasContinue = any(t[2], { "Continue" }, loop) -- ./compiler/lua54.can:339 +local lets = search({ t[1] }, { "LetExpr" }) -- ./compiler/lua54.can:340 +if # lets > 0 then -- ./compiler/lua54.can:341 +r = r .. ("do" .. indent()) -- ./compiler/lua54.can:342 +for _, l in ipairs(lets) do -- ./compiler/lua54.can:343 +r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:344 +end -- ./compiler/lua54.can:344 +end -- ./compiler/lua54.can:344 +r = r .. ("while " .. lua(t[1]) .. " do" .. indent()) -- ./compiler/lua54.can:347 +if # lets > 0 then -- ./compiler/lua54.can:348 +r = r .. ("do" .. indent()) -- ./compiler/lua54.can:349 +end -- ./compiler/lua54.can:349 +if hasContinue then -- ./compiler/lua54.can:351 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:352 end -- ./compiler/lua54.can:352 -end -- ./compiler/lua54.can:352 -r = r .. ("while " .. lua(t[1]) .. " do" .. indent()) -- ./compiler/lua54.can:355 -if # lets > 0 then -- ./compiler/lua54.can:356 -r = r .. ("do" .. indent()) -- ./compiler/lua54.can:357 -end -- ./compiler/lua54.can:357 -if hasContinue then -- ./compiler/lua54.can:359 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:360 -end -- ./compiler/lua54.can:360 -r = r .. (lua(t[2])) -- ./compiler/lua54.can:362 -if hasContinue then -- ./compiler/lua54.can:363 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:364 -end -- ./compiler/lua54.can:364 -r = r .. (unindent() .. "end") -- ./compiler/lua54.can:366 -if # lets > 0 then -- ./compiler/lua54.can:367 -for _, l in ipairs(lets) do -- ./compiler/lua54.can:368 -r = r .. (newline() .. lua(l, "Set")) -- ./compiler/lua54.can:369 -end -- ./compiler/lua54.can:369 -r = r .. (unindent() .. "end" .. unindent() .. "end") -- ./compiler/lua54.can:371 -end -- ./compiler/lua54.can:371 -return r -- ./compiler/lua54.can:373 -end, -- ./compiler/lua54.can:373 -["Repeat"] = function(t) -- ./compiler/lua54.can:376 -local hasContinue = any(t[1], { "Continue" }, loop) -- ./compiler/lua54.can:377 -local r = "repeat" .. indent() -- ./compiler/lua54.can:378 -if hasContinue then -- ./compiler/lua54.can:379 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:380 -end -- ./compiler/lua54.can:380 -r = r .. (lua(t[1])) -- ./compiler/lua54.can:382 -if hasContinue then -- ./compiler/lua54.can:383 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:384 -end -- ./compiler/lua54.can:384 -r = r .. (unindent() .. "until " .. lua(t[2])) -- ./compiler/lua54.can:386 -return r -- ./compiler/lua54.can:387 -end, -- ./compiler/lua54.can:387 -["If"] = function(t) -- ./compiler/lua54.can:390 -local r = "" -- ./compiler/lua54.can:391 -local toClose = 0 -- ./compiler/lua54.can:392 -local lets = search({ t[1] }, { "LetExpr" }) -- ./compiler/lua54.can:393 -if # lets > 0 then -- ./compiler/lua54.can:394 -r = r .. ("do" .. indent()) -- ./compiler/lua54.can:395 -toClose = toClose + (1) -- ./compiler/lua54.can:396 -for _, l in ipairs(lets) do -- ./compiler/lua54.can:397 -r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:398 -end -- ./compiler/lua54.can:398 -end -- ./compiler/lua54.can:398 -r = r .. ("if " .. lua(t[1]) .. " then" .. indent() .. lua(t[2]) .. unindent()) -- ./compiler/lua54.can:401 -for i = 3, # t - 1, 2 do -- ./compiler/lua54.can:402 -lets = search({ t[i] }, { "LetExpr" }) -- ./compiler/lua54.can:403 -if # lets > 0 then -- ./compiler/lua54.can:404 -r = r .. ("else" .. indent()) -- ./compiler/lua54.can:405 -toClose = toClose + (1) -- ./compiler/lua54.can:406 -for _, l in ipairs(lets) do -- ./compiler/lua54.can:407 -r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:408 +r = r .. (lua(t[2])) -- ./compiler/lua54.can:354 +if hasContinue then -- ./compiler/lua54.can:355 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:356 +end -- ./compiler/lua54.can:356 +r = r .. (unindent() .. "end") -- ./compiler/lua54.can:358 +if # lets > 0 then -- ./compiler/lua54.can:359 +for _, l in ipairs(lets) do -- ./compiler/lua54.can:360 +r = r .. (newline() .. lua(l, "Set")) -- ./compiler/lua54.can:361 +end -- ./compiler/lua54.can:361 +r = r .. (unindent() .. "end" .. unindent() .. "end") -- ./compiler/lua54.can:363 +end -- ./compiler/lua54.can:363 +return r -- ./compiler/lua54.can:365 +end, -- ./compiler/lua54.can:365 +["Repeat"] = function(t) -- ./compiler/lua54.can:368 +local hasContinue = any(t[1], { "Continue" }, loop) -- ./compiler/lua54.can:369 +local r = "repeat" .. indent() -- ./compiler/lua54.can:370 +if hasContinue then -- ./compiler/lua54.can:371 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:372 +end -- ./compiler/lua54.can:372 +r = r .. (lua(t[1])) -- ./compiler/lua54.can:374 +if hasContinue then -- ./compiler/lua54.can:375 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:376 +end -- ./compiler/lua54.can:376 +r = r .. (unindent() .. "until " .. lua(t[2])) -- ./compiler/lua54.can:378 +return r -- ./compiler/lua54.can:379 +end, -- ./compiler/lua54.can:379 +["If"] = function(t) -- ./compiler/lua54.can:382 +local r = "" -- ./compiler/lua54.can:383 +local toClose = 0 -- ./compiler/lua54.can:384 +local lets = search({ t[1] }, { "LetExpr" }) -- ./compiler/lua54.can:385 +if # lets > 0 then -- ./compiler/lua54.can:386 +r = r .. ("do" .. indent()) -- ./compiler/lua54.can:387 +toClose = toClose + (1) -- ./compiler/lua54.can:388 +for _, l in ipairs(lets) do -- ./compiler/lua54.can:389 +r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:390 +end -- ./compiler/lua54.can:390 +end -- ./compiler/lua54.can:390 +r = r .. ("if " .. lua(t[1]) .. " then" .. indent() .. lua(t[2]) .. unindent()) -- ./compiler/lua54.can:393 +for i = 3, # t - 1, 2 do -- ./compiler/lua54.can:394 +lets = search({ t[i] }, { "LetExpr" }) -- ./compiler/lua54.can:395 +if # lets > 0 then -- ./compiler/lua54.can:396 +r = r .. ("else" .. indent()) -- ./compiler/lua54.can:397 +toClose = toClose + (1) -- ./compiler/lua54.can:398 +for _, l in ipairs(lets) do -- ./compiler/lua54.can:399 +r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:400 +end -- ./compiler/lua54.can:400 +else -- ./compiler/lua54.can:400 +r = r .. ("else") -- ./compiler/lua54.can:403 +end -- ./compiler/lua54.can:403 +r = r .. ("if " .. lua(t[i]) .. " then" .. indent() .. lua(t[i + 1]) .. unindent()) -- ./compiler/lua54.can:405 +end -- ./compiler/lua54.can:405 +if # t % 2 == 1 then -- ./compiler/lua54.can:407 +r = r .. ("else" .. indent() .. lua(t[# t]) .. unindent()) -- ./compiler/lua54.can:408 end -- ./compiler/lua54.can:408 -else -- ./compiler/lua54.can:408 -r = r .. ("else") -- ./compiler/lua54.can:411 -end -- ./compiler/lua54.can:411 -r = r .. ("if " .. lua(t[i]) .. " then" .. indent() .. lua(t[i + 1]) .. unindent()) -- ./compiler/lua54.can:413 -end -- ./compiler/lua54.can:413 -if # t % 2 == 1 then -- ./compiler/lua54.can:415 -r = r .. ("else" .. indent() .. lua(t[# t]) .. unindent()) -- ./compiler/lua54.can:416 -end -- ./compiler/lua54.can:416 -r = r .. ("end") -- ./compiler/lua54.can:418 -for i = 1, toClose do -- ./compiler/lua54.can:419 -r = r .. (unindent() .. "end") -- ./compiler/lua54.can:420 -end -- ./compiler/lua54.can:420 -return r -- ./compiler/lua54.can:422 -end, -- ./compiler/lua54.can:422 -["Fornum"] = function(t) -- ./compiler/lua54.can:425 -local r = "for " .. lua(t[1]) .. " = " .. lua(t[2]) .. ", " .. lua(t[3]) -- ./compiler/lua54.can:426 -if # t == 5 then -- ./compiler/lua54.can:427 -local hasContinue = any(t[5], { "Continue" }, loop) -- ./compiler/lua54.can:428 -r = r .. (", " .. lua(t[4]) .. " do" .. indent()) -- ./compiler/lua54.can:429 -if hasContinue then -- ./compiler/lua54.can:430 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:431 -end -- ./compiler/lua54.can:431 -r = r .. (lua(t[5])) -- ./compiler/lua54.can:433 -if hasContinue then -- ./compiler/lua54.can:434 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:435 -end -- ./compiler/lua54.can:435 -return r .. unindent() .. "end" -- ./compiler/lua54.can:437 -else -- ./compiler/lua54.can:437 -local hasContinue = any(t[4], { "Continue" }, loop) -- ./compiler/lua54.can:439 -r = r .. (" do" .. indent()) -- ./compiler/lua54.can:440 -if hasContinue then -- ./compiler/lua54.can:441 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:442 -end -- ./compiler/lua54.can:442 -r = r .. (lua(t[4])) -- ./compiler/lua54.can:444 -if hasContinue then -- ./compiler/lua54.can:445 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:446 -end -- ./compiler/lua54.can:446 -return r .. unindent() .. "end" -- ./compiler/lua54.can:448 -end -- ./compiler/lua54.can:448 -end, -- ./compiler/lua54.can:448 -["Forin"] = function(t) -- ./compiler/lua54.can:452 -local destructured = {} -- ./compiler/lua54.can:453 -local hasContinue = any(t[3], { "Continue" }, loop) -- ./compiler/lua54.can:454 -local r = "for " .. push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") .. " in " .. lua(t[2], "_lhs") .. " do" .. indent() -- ./compiler/lua54.can:455 -if hasContinue then -- ./compiler/lua54.can:456 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:457 -end -- ./compiler/lua54.can:457 -r = r .. (DESTRUCTURING_ASSIGN(destructured, true) .. lua(t[3])) -- ./compiler/lua54.can:459 -if hasContinue then -- ./compiler/lua54.can:460 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:461 -end -- ./compiler/lua54.can:461 -return r .. unindent() .. "end" -- ./compiler/lua54.can:463 -end, -- ./compiler/lua54.can:463 -["Local"] = function(t) -- ./compiler/lua54.can:466 -local destructured = {} -- ./compiler/lua54.can:467 -local r = "local " .. push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") -- ./compiler/lua54.can:468 -if t[2][1] then -- ./compiler/lua54.can:469 -r = r .. (" = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:470 -end -- ./compiler/lua54.can:470 -return r .. DESTRUCTURING_ASSIGN(destructured) -- ./compiler/lua54.can:472 -end, -- ./compiler/lua54.can:472 -["Let"] = function(t) -- ./compiler/lua54.can:475 -local destructured = {} -- ./compiler/lua54.can:476 -local nameList = push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") -- ./compiler/lua54.can:477 -local r = "local " .. nameList -- ./compiler/lua54.can:478 -if t[2][1] then -- ./compiler/lua54.can:479 -if all(t[2], { -- ./compiler/lua54.can:480 -"Nil", -- ./compiler/lua54.can:480 -"Dots", -- ./compiler/lua54.can:480 -"Boolean", -- ./compiler/lua54.can:480 -"Number", -- ./compiler/lua54.can:480 -"String" -- ./compiler/lua54.can:480 -}) then -- ./compiler/lua54.can:480 -r = r .. (" = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:481 -else -- ./compiler/lua54.can:481 -r = r .. (newline() .. nameList .. " = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:483 -end -- ./compiler/lua54.can:483 -end -- ./compiler/lua54.can:483 -return r .. DESTRUCTURING_ASSIGN(destructured) -- ./compiler/lua54.can:486 +r = r .. ("end") -- ./compiler/lua54.can:410 +for i = 1, toClose do -- ./compiler/lua54.can:411 +r = r .. (unindent() .. "end") -- ./compiler/lua54.can:412 +end -- ./compiler/lua54.can:412 +return r -- ./compiler/lua54.can:414 +end, -- ./compiler/lua54.can:414 +["Fornum"] = function(t) -- ./compiler/lua54.can:417 +local r = "for " .. lua(t[1]) .. " = " .. lua(t[2]) .. ", " .. lua(t[3]) -- ./compiler/lua54.can:418 +if # t == 5 then -- ./compiler/lua54.can:419 +local hasContinue = any(t[5], { "Continue" }, loop) -- ./compiler/lua54.can:420 +r = r .. (", " .. lua(t[4]) .. " do" .. indent()) -- ./compiler/lua54.can:421 +if hasContinue then -- ./compiler/lua54.can:422 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:423 +end -- ./compiler/lua54.can:423 +r = r .. (lua(t[5])) -- ./compiler/lua54.can:425 +if hasContinue then -- ./compiler/lua54.can:426 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:427 +end -- ./compiler/lua54.can:427 +return r .. unindent() .. "end" -- ./compiler/lua54.can:429 +else -- ./compiler/lua54.can:429 +local hasContinue = any(t[4], { "Continue" }, loop) -- ./compiler/lua54.can:431 +r = r .. (" do" .. indent()) -- ./compiler/lua54.can:432 +if hasContinue then -- ./compiler/lua54.can:433 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:434 +end -- ./compiler/lua54.can:434 +r = r .. (lua(t[4])) -- ./compiler/lua54.can:436 +if hasContinue then -- ./compiler/lua54.can:437 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:438 +end -- ./compiler/lua54.can:438 +return r .. unindent() .. "end" -- ./compiler/lua54.can:440 +end -- ./compiler/lua54.can:440 +end, -- ./compiler/lua54.can:440 +["Forin"] = function(t) -- ./compiler/lua54.can:444 +local destructured = {} -- ./compiler/lua54.can:445 +local hasContinue = any(t[3], { "Continue" }, loop) -- ./compiler/lua54.can:446 +local r = "for " .. push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") .. " in " .. lua(t[2], "_lhs") .. " do" .. indent() -- ./compiler/lua54.can:447 +if hasContinue then -- ./compiler/lua54.can:448 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:449 +end -- ./compiler/lua54.can:449 +r = r .. (DESTRUCTURING_ASSIGN(destructured, true) .. lua(t[3])) -- ./compiler/lua54.can:451 +if hasContinue then -- ./compiler/lua54.can:452 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:453 +end -- ./compiler/lua54.can:453 +return r .. unindent() .. "end" -- ./compiler/lua54.can:455 +end, -- ./compiler/lua54.can:455 +["Local"] = function(t) -- ./compiler/lua54.can:458 +local destructured = {} -- ./compiler/lua54.can:459 +local r = "local " .. push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") -- ./compiler/lua54.can:460 +if t[2][1] then -- ./compiler/lua54.can:461 +r = r .. (" = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:462 +end -- ./compiler/lua54.can:462 +return r .. DESTRUCTURING_ASSIGN(destructured) -- ./compiler/lua54.can:464 +end, -- ./compiler/lua54.can:464 +["Let"] = function(t) -- ./compiler/lua54.can:467 +local destructured = {} -- ./compiler/lua54.can:468 +local nameList = push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") -- ./compiler/lua54.can:469 +local r = "local " .. nameList -- ./compiler/lua54.can:470 +if t[2][1] then -- ./compiler/lua54.can:471 +if all(t[2], { -- ./compiler/lua54.can:472 +"Nil", -- ./compiler/lua54.can:472 +"Dots", -- ./compiler/lua54.can:472 +"Boolean", -- ./compiler/lua54.can:472 +"Number", -- ./compiler/lua54.can:472 +"String" -- ./compiler/lua54.can:472 +}) then -- ./compiler/lua54.can:472 +r = r .. (" = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:473 +else -- ./compiler/lua54.can:473 +r = r .. (newline() .. nameList .. " = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:475 +end -- ./compiler/lua54.can:475 +end -- ./compiler/lua54.can:475 +return r .. DESTRUCTURING_ASSIGN(destructured) -- ./compiler/lua54.can:478 +end, -- ./compiler/lua54.can:478 +["Localrec"] = function(t) -- ./compiler/lua54.can:481 +return "local function " .. lua(t[1][1]) .. lua(t[2][1], "_functionWithoutKeyword") -- ./compiler/lua54.can:482 +end, -- ./compiler/lua54.can:482 +["Goto"] = function(t) -- ./compiler/lua54.can:485 +return "goto " .. lua(t, "Id") -- ./compiler/lua54.can:486 end, -- ./compiler/lua54.can:486 -["Localrec"] = function(t) -- ./compiler/lua54.can:489 -return "local function " .. lua(t[1][1]) .. lua(t[2][1], "_functionWithoutKeyword") -- ./compiler/lua54.can:490 +["Label"] = function(t) -- ./compiler/lua54.can:489 +return "::" .. lua(t, "Id") .. "::" -- ./compiler/lua54.can:490 end, -- ./compiler/lua54.can:490 -["Goto"] = function(t) -- ./compiler/lua54.can:493 -return "goto " .. lua(t, "Id") -- ./compiler/lua54.can:494 -end, -- ./compiler/lua54.can:494 -["Label"] = function(t) -- ./compiler/lua54.can:497 -return "::" .. lua(t, "Id") .. "::" -- ./compiler/lua54.can:498 -end, -- ./compiler/lua54.can:498 -["Return"] = function(t) -- ./compiler/lua54.can:501 -local push = peek("push") -- ./compiler/lua54.can:502 -if push then -- ./compiler/lua54.can:503 -local r = "" -- ./compiler/lua54.can:504 -for _, val in ipairs(t) do -- ./compiler/lua54.can:505 -r = r .. (push .. "[#" .. push .. "+1] = " .. lua(val) .. newline()) -- ./compiler/lua54.can:506 -end -- ./compiler/lua54.can:506 -return r .. "return " .. UNPACK(push) -- ./compiler/lua54.can:508 -else -- ./compiler/lua54.can:508 -return "return " .. lua(t, "_lhs") -- ./compiler/lua54.can:510 +["Return"] = function(t) -- ./compiler/lua54.can:493 +local push = peek("push") -- ./compiler/lua54.can:494 +if push then -- ./compiler/lua54.can:495 +local r = "" -- ./compiler/lua54.can:496 +for _, val in ipairs(t) do -- ./compiler/lua54.can:497 +r = r .. (push .. "[#" .. push .. "+1] = " .. lua(val) .. newline()) -- ./compiler/lua54.can:498 +end -- ./compiler/lua54.can:498 +return r .. "return " .. UNPACK(push) -- ./compiler/lua54.can:500 +else -- ./compiler/lua54.can:500 +return "return " .. lua(t, "_lhs") -- ./compiler/lua54.can:502 +end -- ./compiler/lua54.can:502 +end, -- ./compiler/lua54.can:502 +["Push"] = function(t) -- ./compiler/lua54.can:506 +local var = assert(peek("push"), "no context given for push") -- ./compiler/lua54.can:507 +r = "" -- ./compiler/lua54.can:508 +for i = 1, # t - 1, 1 do -- ./compiler/lua54.can:509 +r = r .. (var .. "[#" .. var .. "+1] = " .. lua(t[i]) .. newline()) -- ./compiler/lua54.can:510 end -- ./compiler/lua54.can:510 -end, -- ./compiler/lua54.can:510 -["Push"] = function(t) -- ./compiler/lua54.can:514 -local var = assert(peek("push"), "no context given for push") -- ./compiler/lua54.can:515 -r = "" -- ./compiler/lua54.can:516 -for i = 1, # t - 1, 1 do -- ./compiler/lua54.can:517 -r = r .. (var .. "[#" .. var .. "+1] = " .. lua(t[i]) .. newline()) -- ./compiler/lua54.can:518 -end -- ./compiler/lua54.can:518 -if t[# t] then -- ./compiler/lua54.can:520 -if t[# t]["tag"] == "Call" then -- ./compiler/lua54.can:521 -r = r .. (APPEND(var, lua(t[# t]))) -- ./compiler/lua54.can:522 -else -- ./compiler/lua54.can:522 -r = r .. (var .. "[#" .. var .. "+1] = " .. lua(t[# t])) -- ./compiler/lua54.can:524 -end -- ./compiler/lua54.can:524 -end -- ./compiler/lua54.can:524 -return r -- ./compiler/lua54.can:527 +if t[# t] then -- ./compiler/lua54.can:512 +if t[# t]["tag"] == "Call" then -- ./compiler/lua54.can:513 +r = r .. (APPEND(var, lua(t[# t]))) -- ./compiler/lua54.can:514 +else -- ./compiler/lua54.can:514 +r = r .. (var .. "[#" .. var .. "+1] = " .. lua(t[# t])) -- ./compiler/lua54.can:516 +end -- ./compiler/lua54.can:516 +end -- ./compiler/lua54.can:516 +return r -- ./compiler/lua54.can:519 +end, -- ./compiler/lua54.can:519 +["Break"] = function() -- ./compiler/lua54.can:522 +return "break" -- ./compiler/lua54.can:523 +end, -- ./compiler/lua54.can:523 +["Continue"] = function() -- ./compiler/lua54.can:526 +return "goto " .. var("continue") -- ./compiler/lua54.can:527 end, -- ./compiler/lua54.can:527 -["Break"] = function() -- ./compiler/lua54.can:530 -return "break" -- ./compiler/lua54.can:531 -end, -- ./compiler/lua54.can:531 -["Continue"] = function() -- ./compiler/lua54.can:534 -return "goto " .. var("continue") -- ./compiler/lua54.can:535 +["Nil"] = function() -- ./compiler/lua54.can:534 +return "nil" -- ./compiler/lua54.can:535 end, -- ./compiler/lua54.can:535 -["Nil"] = function() -- ./compiler/lua54.can:542 -return "nil" -- ./compiler/lua54.can:543 +["Dots"] = function() -- ./compiler/lua54.can:538 +return "..." -- ./compiler/lua54.can:539 +end, -- ./compiler/lua54.can:539 +["Boolean"] = function(t) -- ./compiler/lua54.can:542 +return tostring(t[1]) -- ./compiler/lua54.can:543 end, -- ./compiler/lua54.can:543 -["Dots"] = function() -- ./compiler/lua54.can:546 -local macroargs = peek("macroargs") -- ./compiler/lua54.can:547 -if macroargs and not nomacro["variables"]["..."] and macroargs["..."] then -- ./compiler/lua54.can:548 -nomacro["variables"]["..."] = true -- ./compiler/lua54.can:549 -local r = lua(macroargs["..."], "_lhs") -- ./compiler/lua54.can:550 -nomacro["variables"]["..."] = nil -- ./compiler/lua54.can:551 -return r -- ./compiler/lua54.can:552 -else -- ./compiler/lua54.can:552 -return "..." -- ./compiler/lua54.can:554 -end -- ./compiler/lua54.can:554 -end, -- ./compiler/lua54.can:554 -["Boolean"] = function(t) -- ./compiler/lua54.can:558 -return tostring(t[1]) -- ./compiler/lua54.can:559 -end, -- ./compiler/lua54.can:559 -["Number"] = function(t) -- ./compiler/lua54.can:562 -return tostring(t[1]) -- ./compiler/lua54.can:563 -end, -- ./compiler/lua54.can:563 -["String"] = function(t) -- ./compiler/lua54.can:566 -return ("%q"):format(t[1]) -- ./compiler/lua54.can:567 -end, -- ./compiler/lua54.can:567 -["_functionWithoutKeyword"] = function(t) -- ./compiler/lua54.can:570 -local r = "(" -- ./compiler/lua54.can:571 -local decl = {} -- ./compiler/lua54.can:572 -if t[1][1] then -- ./compiler/lua54.can:573 -if t[1][1]["tag"] == "ParPair" then -- ./compiler/lua54.can:574 -local id = lua(t[1][1][1]) -- ./compiler/lua54.can:575 -indentLevel = indentLevel + (1) -- ./compiler/lua54.can:576 -table["insert"](decl, "if " .. id .. " == nil then " .. id .. " = " .. lua(t[1][1][2]) .. " end") -- ./compiler/lua54.can:577 -indentLevel = indentLevel - (1) -- ./compiler/lua54.can:578 -r = r .. (id) -- ./compiler/lua54.can:579 -else -- ./compiler/lua54.can:579 -r = r .. (lua(t[1][1])) -- ./compiler/lua54.can:581 +["Number"] = function(t) -- ./compiler/lua54.can:546 +return tostring(t[1]) -- ./compiler/lua54.can:547 +end, -- ./compiler/lua54.can:547 +["String"] = function(t) -- ./compiler/lua54.can:550 +return ("%q"):format(t[1]) -- ./compiler/lua54.can:551 +end, -- ./compiler/lua54.can:551 +["_functionWithoutKeyword"] = function(t) -- ./compiler/lua54.can:554 +local r = "(" -- ./compiler/lua54.can:555 +local decl = {} -- ./compiler/lua54.can:556 +if t[1][1] then -- ./compiler/lua54.can:557 +if t[1][1]["tag"] == "ParPair" then -- ./compiler/lua54.can:558 +local id = lua(t[1][1][1]) -- ./compiler/lua54.can:559 +indentLevel = indentLevel + (1) -- ./compiler/lua54.can:560 +table["insert"](decl, "if " .. id .. " == nil then " .. id .. " = " .. lua(t[1][1][2]) .. " end") -- ./compiler/lua54.can:561 +indentLevel = indentLevel - (1) -- ./compiler/lua54.can:562 +r = r .. (id) -- ./compiler/lua54.can:563 +else -- ./compiler/lua54.can:563 +r = r .. (lua(t[1][1])) -- ./compiler/lua54.can:565 +end -- ./compiler/lua54.can:565 +for i = 2, # t[1], 1 do -- ./compiler/lua54.can:567 +if t[1][i]["tag"] == "ParPair" then -- ./compiler/lua54.can:568 +local id = lua(t[1][i][1]) -- ./compiler/lua54.can:569 +indentLevel = indentLevel + (1) -- ./compiler/lua54.can:570 +table["insert"](decl, "if " .. id .. " == nil then " .. id .. " = " .. lua(t[1][i][2]) .. " end") -- ./compiler/lua54.can:571 +indentLevel = indentLevel - (1) -- ./compiler/lua54.can:572 +r = r .. (", " .. id) -- ./compiler/lua54.can:573 +else -- ./compiler/lua54.can:573 +r = r .. (", " .. lua(t[1][i])) -- ./compiler/lua54.can:575 +end -- ./compiler/lua54.can:575 +end -- ./compiler/lua54.can:575 +end -- ./compiler/lua54.can:575 +r = r .. (")" .. indent()) -- ./compiler/lua54.can:579 +for _, d in ipairs(decl) do -- ./compiler/lua54.can:580 +r = r .. (d .. newline()) -- ./compiler/lua54.can:581 end -- ./compiler/lua54.can:581 -for i = 2, # t[1], 1 do -- ./compiler/lua54.can:583 -if t[1][i]["tag"] == "ParPair" then -- ./compiler/lua54.can:584 -local id = lua(t[1][i][1]) -- ./compiler/lua54.can:585 -indentLevel = indentLevel + (1) -- ./compiler/lua54.can:586 -table["insert"](decl, "if " .. id .. " == nil then " .. id .. " = " .. lua(t[1][i][2]) .. " end") -- ./compiler/lua54.can:587 -indentLevel = indentLevel - (1) -- ./compiler/lua54.can:588 -r = r .. (", " .. id) -- ./compiler/lua54.can:589 -else -- ./compiler/lua54.can:589 -r = r .. (", " .. lua(t[1][i])) -- ./compiler/lua54.can:591 -end -- ./compiler/lua54.can:591 -end -- ./compiler/lua54.can:591 -end -- ./compiler/lua54.can:591 -r = r .. (")" .. indent()) -- ./compiler/lua54.can:595 -for _, d in ipairs(decl) do -- ./compiler/lua54.can:596 -r = r .. (d .. newline()) -- ./compiler/lua54.can:597 -end -- ./compiler/lua54.can:597 -if t[2][# t[2]] and t[2][# t[2]]["tag"] == "Push" then -- ./compiler/lua54.can:599 -t[2][# t[2]]["tag"] = "Return" -- ./compiler/lua54.can:600 -end -- ./compiler/lua54.can:600 -local hasPush = any(t[2], { "Push" }, func) -- ./compiler/lua54.can:602 -if hasPush then -- ./compiler/lua54.can:603 -r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:604 -else -- ./compiler/lua54.can:604 -push("push", false) -- ./compiler/lua54.can:606 -end -- ./compiler/lua54.can:606 -r = r .. (lua(t[2])) -- ./compiler/lua54.can:608 -if hasPush and (t[2][# t[2]] and t[2][# t[2]]["tag"] ~= "Return") then -- ./compiler/lua54.can:609 -r = r .. (newline() .. "return " .. UNPACK(var("push"))) -- ./compiler/lua54.can:610 -end -- ./compiler/lua54.can:610 -pop("push") -- ./compiler/lua54.can:612 -return r .. unindent() .. "end" -- ./compiler/lua54.can:613 -end, -- ./compiler/lua54.can:613 -["Function"] = function(t) -- ./compiler/lua54.can:615 -return "function" .. lua(t, "_functionWithoutKeyword") -- ./compiler/lua54.can:616 -end, -- ./compiler/lua54.can:616 -["Pair"] = function(t) -- ./compiler/lua54.can:619 -return "[" .. lua(t[1]) .. "] = " .. lua(t[2]) -- ./compiler/lua54.can:620 -end, -- ./compiler/lua54.can:620 -["Table"] = function(t) -- ./compiler/lua54.can:622 -if # t == 0 then -- ./compiler/lua54.can:623 -return "{}" -- ./compiler/lua54.can:624 -elseif # t == 1 then -- ./compiler/lua54.can:625 -return "{ " .. lua(t, "_lhs") .. " }" -- ./compiler/lua54.can:626 +if t[2][# t[2]] and t[2][# t[2]]["tag"] == "Push" then -- ./compiler/lua54.can:583 +t[2][# t[2]]["tag"] = "Return" -- ./compiler/lua54.can:584 +end -- ./compiler/lua54.can:584 +local hasPush = any(t[2], { "Push" }, func) -- ./compiler/lua54.can:586 +if hasPush then -- ./compiler/lua54.can:587 +r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:588 +else -- ./compiler/lua54.can:588 +push("push", false) -- ./compiler/lua54.can:590 +end -- ./compiler/lua54.can:590 +r = r .. (lua(t[2])) -- ./compiler/lua54.can:592 +if hasPush and (t[2][# t[2]] and t[2][# t[2]]["tag"] ~= "Return") then -- ./compiler/lua54.can:593 +r = r .. (newline() .. "return " .. UNPACK(var("push"))) -- ./compiler/lua54.can:594 +end -- ./compiler/lua54.can:594 +pop("push") -- ./compiler/lua54.can:596 +return r .. unindent() .. "end" -- ./compiler/lua54.can:597 +end, -- ./compiler/lua54.can:597 +["Function"] = function(t) -- ./compiler/lua54.can:599 +return "function" .. lua(t, "_functionWithoutKeyword") -- ./compiler/lua54.can:600 +end, -- ./compiler/lua54.can:600 +["Pair"] = function(t) -- ./compiler/lua54.can:603 +return "[" .. lua(t[1]) .. "] = " .. lua(t[2]) -- ./compiler/lua54.can:604 +end, -- ./compiler/lua54.can:604 +["Table"] = function(t) -- ./compiler/lua54.can:606 +if # t == 0 then -- ./compiler/lua54.can:607 +return "{}" -- ./compiler/lua54.can:608 +elseif # t == 1 then -- ./compiler/lua54.can:609 +return "{ " .. lua(t, "_lhs") .. " }" -- ./compiler/lua54.can:610 +else -- ./compiler/lua54.can:610 +return "{" .. indent() .. lua(t, "_lhs", nil, true) .. unindent() .. "}" -- ./compiler/lua54.can:612 +end -- ./compiler/lua54.can:612 +end, -- ./compiler/lua54.can:612 +["TableCompr"] = function(t) -- ./compiler/lua54.can:616 +return push("push", "self") .. "(function()" .. indent() .. "local self = {}" .. newline() .. lua(t[1]) .. newline() .. "return self" .. unindent() .. "end)()" .. pop("push") -- ./compiler/lua54.can:617 +end, -- ./compiler/lua54.can:617 +["Op"] = function(t) -- ./compiler/lua54.can:620 +local r -- ./compiler/lua54.can:621 +if # t == 2 then -- ./compiler/lua54.can:622 +if type(tags["_opid"][t[1]]) == "string" then -- ./compiler/lua54.can:623 +r = tags["_opid"][t[1]] .. " " .. lua(t[2]) -- ./compiler/lua54.can:624 +else -- ./compiler/lua54.can:624 +r = tags["_opid"][t[1]](t[2]) -- ./compiler/lua54.can:626 +end -- ./compiler/lua54.can:626 else -- ./compiler/lua54.can:626 -return "{" .. indent() .. lua(t, "_lhs", nil, true) .. unindent() .. "}" -- ./compiler/lua54.can:628 -end -- ./compiler/lua54.can:628 -end, -- ./compiler/lua54.can:628 -["TableCompr"] = function(t) -- ./compiler/lua54.can:632 -return push("push", "self") .. "(function()" .. indent() .. "local self = {}" .. newline() .. lua(t[1]) .. newline() .. "return self" .. unindent() .. "end)()" .. pop("push") -- ./compiler/lua54.can:633 -end, -- ./compiler/lua54.can:633 -["Op"] = function(t) -- ./compiler/lua54.can:636 -local r -- ./compiler/lua54.can:637 -if # t == 2 then -- ./compiler/lua54.can:638 -if type(tags["_opid"][t[1]]) == "string" then -- ./compiler/lua54.can:639 -r = tags["_opid"][t[1]] .. " " .. lua(t[2]) -- ./compiler/lua54.can:640 -else -- ./compiler/lua54.can:640 -r = tags["_opid"][t[1]](t[2]) -- ./compiler/lua54.can:642 -end -- ./compiler/lua54.can:642 -else -- ./compiler/lua54.can:642 -if type(tags["_opid"][t[1]]) == "string" then -- ./compiler/lua54.can:645 -r = lua(t[2]) .. " " .. tags["_opid"][t[1]] .. " " .. lua(t[3]) -- ./compiler/lua54.can:646 -else -- ./compiler/lua54.can:646 -r = tags["_opid"][t[1]](t[2], t[3]) -- ./compiler/lua54.can:648 -end -- ./compiler/lua54.can:648 -end -- ./compiler/lua54.can:648 -return r -- ./compiler/lua54.can:651 -end, -- ./compiler/lua54.can:651 -["Paren"] = function(t) -- ./compiler/lua54.can:654 -return "(" .. lua(t[1]) .. ")" -- ./compiler/lua54.can:655 -end, -- ./compiler/lua54.can:655 -["MethodStub"] = function(t) -- ./compiler/lua54.can:658 -return "(function()" .. indent() .. "local " .. var("object") .. " = " .. lua(t[1]) .. newline() .. "local " .. var("method") .. " = " .. var("object") .. "." .. lua(t[2], "Id") .. newline() .. "if " .. var("method") .. " == nil then return nil end" .. newline() .. "return function(...) return " .. var("method") .. "(" .. var("object") .. ", ...) end" .. unindent() .. "end)()" -- ./compiler/lua54.can:664 -end, -- ./compiler/lua54.can:664 -["SafeMethodStub"] = function(t) -- ./compiler/lua54.can:667 -return "(function()" .. indent() .. "local " .. var("object") .. " = " .. lua(t[1]) .. newline() .. "if " .. var("object") .. " == nil then return nil end" .. newline() .. "local " .. var("method") .. " = " .. var("object") .. "." .. lua(t[2], "Id") .. newline() .. "if " .. var("method") .. " == nil then return nil end" .. newline() .. "return function(...) return " .. var("method") .. "(" .. var("object") .. ", ...) end" .. unindent() .. "end)()" -- ./compiler/lua54.can:674 -end, -- ./compiler/lua54.can:674 -["LetExpr"] = function(t) -- ./compiler/lua54.can:681 -return lua(t[1][1]) -- ./compiler/lua54.can:682 -end, -- ./compiler/lua54.can:682 -["_statexpr"] = function(t, stat) -- ./compiler/lua54.can:686 -local hasPush = any(t, { "Push" }, func) -- ./compiler/lua54.can:687 -local r = "(function()" .. indent() -- ./compiler/lua54.can:688 -if hasPush then -- ./compiler/lua54.can:689 -r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:690 -else -- ./compiler/lua54.can:690 -push("push", false) -- ./compiler/lua54.can:692 -end -- ./compiler/lua54.can:692 -r = r .. (lua(t, stat)) -- ./compiler/lua54.can:694 -if hasPush then -- ./compiler/lua54.can:695 -r = r .. (newline() .. "return " .. UNPACK(var("push"))) -- ./compiler/lua54.can:696 -end -- ./compiler/lua54.can:696 -pop("push") -- ./compiler/lua54.can:698 -r = r .. (unindent() .. "end)()") -- ./compiler/lua54.can:699 -return r -- ./compiler/lua54.can:700 -end, -- ./compiler/lua54.can:700 -["DoExpr"] = function(t) -- ./compiler/lua54.can:703 -if t[# t]["tag"] == "Push" then -- ./compiler/lua54.can:704 -t[# t]["tag"] = "Return" -- ./compiler/lua54.can:705 -end -- ./compiler/lua54.can:705 -return lua(t, "_statexpr", "Do") -- ./compiler/lua54.can:707 -end, -- ./compiler/lua54.can:707 -["WhileExpr"] = function(t) -- ./compiler/lua54.can:710 -return lua(t, "_statexpr", "While") -- ./compiler/lua54.can:711 -end, -- ./compiler/lua54.can:711 -["RepeatExpr"] = function(t) -- ./compiler/lua54.can:714 -return lua(t, "_statexpr", "Repeat") -- ./compiler/lua54.can:715 -end, -- ./compiler/lua54.can:715 -["IfExpr"] = function(t) -- ./compiler/lua54.can:718 -for i = 2, # t do -- ./compiler/lua54.can:719 -local block = t[i] -- ./compiler/lua54.can:720 -if block[# block] and block[# block]["tag"] == "Push" then -- ./compiler/lua54.can:721 -block[# block]["tag"] = "Return" -- ./compiler/lua54.can:722 -end -- ./compiler/lua54.can:722 -end -- ./compiler/lua54.can:722 -return lua(t, "_statexpr", "If") -- ./compiler/lua54.can:725 -end, -- ./compiler/lua54.can:725 -["FornumExpr"] = function(t) -- ./compiler/lua54.can:728 -return lua(t, "_statexpr", "Fornum") -- ./compiler/lua54.can:729 -end, -- ./compiler/lua54.can:729 -["ForinExpr"] = function(t) -- ./compiler/lua54.can:732 -return lua(t, "_statexpr", "Forin") -- ./compiler/lua54.can:733 +if type(tags["_opid"][t[1]]) == "string" then -- ./compiler/lua54.can:629 +r = lua(t[2]) .. " " .. tags["_opid"][t[1]] .. " " .. lua(t[3]) -- ./compiler/lua54.can:630 +else -- ./compiler/lua54.can:630 +r = tags["_opid"][t[1]](t[2], t[3]) -- ./compiler/lua54.can:632 +end -- ./compiler/lua54.can:632 +end -- ./compiler/lua54.can:632 +return r -- ./compiler/lua54.can:635 +end, -- ./compiler/lua54.can:635 +["Paren"] = function(t) -- ./compiler/lua54.can:638 +return "(" .. lua(t[1]) .. ")" -- ./compiler/lua54.can:639 +end, -- ./compiler/lua54.can:639 +["MethodStub"] = function(t) -- ./compiler/lua54.can:642 +return "(function()" .. indent() .. "local " .. var("object") .. " = " .. lua(t[1]) .. newline() .. "local " .. var("method") .. " = " .. var("object") .. "." .. lua(t[2], "Id") .. newline() .. "if " .. var("method") .. " == nil then return nil end" .. newline() .. "return function(...) return " .. var("method") .. "(" .. var("object") .. ", ...) end" .. unindent() .. "end)()" -- ./compiler/lua54.can:648 +end, -- ./compiler/lua54.can:648 +["SafeMethodStub"] = function(t) -- ./compiler/lua54.can:651 +return "(function()" .. indent() .. "local " .. var("object") .. " = " .. lua(t[1]) .. newline() .. "if " .. var("object") .. " == nil then return nil end" .. newline() .. "local " .. var("method") .. " = " .. var("object") .. "." .. lua(t[2], "Id") .. newline() .. "if " .. var("method") .. " == nil then return nil end" .. newline() .. "return function(...) return " .. var("method") .. "(" .. var("object") .. ", ...) end" .. unindent() .. "end)()" -- ./compiler/lua54.can:658 +end, -- ./compiler/lua54.can:658 +["LetExpr"] = function(t) -- ./compiler/lua54.can:665 +return lua(t[1][1]) -- ./compiler/lua54.can:666 +end, -- ./compiler/lua54.can:666 +["_statexpr"] = function(t, stat) -- ./compiler/lua54.can:670 +local hasPush = any(t, { "Push" }, func) -- ./compiler/lua54.can:671 +local r = "(function()" .. indent() -- ./compiler/lua54.can:672 +if hasPush then -- ./compiler/lua54.can:673 +r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:674 +else -- ./compiler/lua54.can:674 +push("push", false) -- ./compiler/lua54.can:676 +end -- ./compiler/lua54.can:676 +r = r .. (lua(t, stat)) -- ./compiler/lua54.can:678 +if hasPush then -- ./compiler/lua54.can:679 +r = r .. (newline() .. "return " .. UNPACK(var("push"))) -- ./compiler/lua54.can:680 +end -- ./compiler/lua54.can:680 +pop("push") -- ./compiler/lua54.can:682 +r = r .. (unindent() .. "end)()") -- ./compiler/lua54.can:683 +return r -- ./compiler/lua54.can:684 +end, -- ./compiler/lua54.can:684 +["DoExpr"] = function(t) -- ./compiler/lua54.can:687 +if t[# t]["tag"] == "Push" then -- ./compiler/lua54.can:688 +t[# t]["tag"] = "Return" -- ./compiler/lua54.can:689 +end -- ./compiler/lua54.can:689 +return lua(t, "_statexpr", "Do") -- ./compiler/lua54.can:691 +end, -- ./compiler/lua54.can:691 +["WhileExpr"] = function(t) -- ./compiler/lua54.can:694 +return lua(t, "_statexpr", "While") -- ./compiler/lua54.can:695 +end, -- ./compiler/lua54.can:695 +["RepeatExpr"] = function(t) -- ./compiler/lua54.can:698 +return lua(t, "_statexpr", "Repeat") -- ./compiler/lua54.can:699 +end, -- ./compiler/lua54.can:699 +["IfExpr"] = function(t) -- ./compiler/lua54.can:702 +for i = 2, # t do -- ./compiler/lua54.can:703 +local block = t[i] -- ./compiler/lua54.can:704 +if block[# block] and block[# block]["tag"] == "Push" then -- ./compiler/lua54.can:705 +block[# block]["tag"] = "Return" -- ./compiler/lua54.can:706 +end -- ./compiler/lua54.can:706 +end -- ./compiler/lua54.can:706 +return lua(t, "_statexpr", "If") -- ./compiler/lua54.can:709 +end, -- ./compiler/lua54.can:709 +["FornumExpr"] = function(t) -- ./compiler/lua54.can:712 +return lua(t, "_statexpr", "Fornum") -- ./compiler/lua54.can:713 +end, -- ./compiler/lua54.can:713 +["ForinExpr"] = function(t) -- ./compiler/lua54.can:716 +return lua(t, "_statexpr", "Forin") -- ./compiler/lua54.can:717 +end, -- ./compiler/lua54.can:717 +["Call"] = function(t) -- ./compiler/lua54.can:723 +if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua54.can:724 +return "(" .. lua(t[1]) .. ")(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:725 +elseif t[1]["tag"] == "MethodStub" then -- ./compiler/lua54.can:726 +if t[1][1]["tag"] == "String" or t[1][1]["tag"] == "Table" then -- ./compiler/lua54.can:727 +return "(" .. lua(t[1][1]) .. "):" .. lua(t[1][2], "Id") .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:728 +else -- ./compiler/lua54.can:728 +return lua(t[1][1]) .. ":" .. lua(t[1][2], "Id") .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:730 +end -- ./compiler/lua54.can:730 +else -- ./compiler/lua54.can:730 +return lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:733 +end -- ./compiler/lua54.can:733 end, -- ./compiler/lua54.can:733 -["Call"] = function(t) -- ./compiler/lua54.can:739 -if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua54.can:740 -return "(" .. lua(t[1]) .. ")(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:741 -elseif t[1]["tag"] == "Id" and not nomacro["functions"][t[1][1]] and macros["functions"][t[1][1]] then -- ./compiler/lua54.can:742 -local macro = macros["functions"][t[1][1]] -- ./compiler/lua54.can:743 -local replacement = macro["replacement"] -- ./compiler/lua54.can:744 -local r -- ./compiler/lua54.can:745 -nomacro["functions"][t[1][1]] = true -- ./compiler/lua54.can:746 -if type(replacement) == "function" then -- ./compiler/lua54.can:747 -local args = {} -- ./compiler/lua54.can:748 -for i = 2, # t do -- ./compiler/lua54.can:749 -table["insert"](args, lua(t[i])) -- ./compiler/lua54.can:750 -end -- ./compiler/lua54.can:750 -r = replacement(unpack(args)) -- ./compiler/lua54.can:752 -else -- ./compiler/lua54.can:752 -local macroargs = util["merge"](peek("macroargs")) -- ./compiler/lua54.can:754 -for i, arg in ipairs(macro["args"]) do -- ./compiler/lua54.can:755 -if arg["tag"] == "Dots" then -- ./compiler/lua54.can:756 -macroargs["..."] = (function() -- ./compiler/lua54.can:757 -local self = {} -- ./compiler/lua54.can:757 -for j = i + 1, # t do -- ./compiler/lua54.can:757 -self[#self+1] = t[j] -- ./compiler/lua54.can:757 -end -- ./compiler/lua54.can:757 -return self -- ./compiler/lua54.can:757 -end)() -- ./compiler/lua54.can:757 -elseif arg["tag"] == "Id" then -- ./compiler/lua54.can:758 -if t[i + 1] == nil then -- ./compiler/lua54.can:759 -error(("bad argument #%s to macro %s (value expected)"):format(i, t[1][1])) -- ./compiler/lua54.can:760 -end -- ./compiler/lua54.can:760 -macroargs[arg[1]] = t[i + 1] -- ./compiler/lua54.can:762 -else -- ./compiler/lua54.can:762 -error(("unexpected argument type %s in macro %s"):format(arg["tag"], t[1][1])) -- ./compiler/lua54.can:764 -end -- ./compiler/lua54.can:764 -end -- ./compiler/lua54.can:764 -push("macroargs", macroargs) -- ./compiler/lua54.can:767 -r = lua(replacement) -- ./compiler/lua54.can:768 -pop("macroargs") -- ./compiler/lua54.can:769 -end -- ./compiler/lua54.can:769 -nomacro["functions"][t[1][1]] = nil -- ./compiler/lua54.can:771 -return r -- ./compiler/lua54.can:772 -elseif t[1]["tag"] == "MethodStub" then -- ./compiler/lua54.can:773 -if t[1][1]["tag"] == "String" or t[1][1]["tag"] == "Table" then -- ./compiler/lua54.can:774 -return "(" .. lua(t[1][1]) .. "):" .. lua(t[1][2], "Id") .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:775 -else -- ./compiler/lua54.can:775 -return lua(t[1][1]) .. ":" .. lua(t[1][2], "Id") .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:777 -end -- ./compiler/lua54.can:777 -else -- ./compiler/lua54.can:777 -return lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:780 -end -- ./compiler/lua54.can:780 -end, -- ./compiler/lua54.can:780 -["SafeCall"] = function(t) -- ./compiler/lua54.can:784 -if t[1]["tag"] ~= "Id" then -- ./compiler/lua54.can:785 -return lua(t, "SafeIndex") -- ./compiler/lua54.can:786 -else -- ./compiler/lua54.can:786 -return "(" .. lua(t[1]) .. " ~= nil and " .. lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ") or nil)" -- ./compiler/lua54.can:788 -end -- ./compiler/lua54.can:788 -end, -- ./compiler/lua54.can:788 -["_lhs"] = function(t, start, newlines) -- ./compiler/lua54.can:793 -if start == nil then start = 1 end -- ./compiler/lua54.can:793 -local r -- ./compiler/lua54.can:794 -if t[start] then -- ./compiler/lua54.can:795 -r = lua(t[start]) -- ./compiler/lua54.can:796 -for i = start + 1, # t, 1 do -- ./compiler/lua54.can:797 -r = r .. ("," .. (newlines and newline() or " ") .. lua(t[i])) -- ./compiler/lua54.can:798 -end -- ./compiler/lua54.can:798 -else -- ./compiler/lua54.can:798 -r = "" -- ./compiler/lua54.can:801 -end -- ./compiler/lua54.can:801 -return r -- ./compiler/lua54.can:803 -end, -- ./compiler/lua54.can:803 -["Id"] = function(t) -- ./compiler/lua54.can:806 -local r = t[1] -- ./compiler/lua54.can:807 -local macroargs = peek("macroargs") -- ./compiler/lua54.can:808 -if not nomacro["variables"][t[1]] then -- ./compiler/lua54.can:809 -nomacro["variables"][t[1]] = true -- ./compiler/lua54.can:810 -if macroargs and macroargs[t[1]] then -- ./compiler/lua54.can:811 -r = lua(macroargs[t[1]]) -- ./compiler/lua54.can:812 -elseif macros["variables"][t[1]] ~= nil then -- ./compiler/lua54.can:813 -local macro = macros["variables"][t[1]] -- ./compiler/lua54.can:814 -if type(macro) == "function" then -- ./compiler/lua54.can:815 -r = macro() -- ./compiler/lua54.can:816 -else -- ./compiler/lua54.can:816 -r = lua(macro) -- ./compiler/lua54.can:818 -end -- ./compiler/lua54.can:818 -end -- ./compiler/lua54.can:818 -nomacro["variables"][t[1]] = nil -- ./compiler/lua54.can:821 -end -- ./compiler/lua54.can:821 -return r -- ./compiler/lua54.can:823 -end, -- ./compiler/lua54.can:823 -["AttributeId"] = function(t) -- ./compiler/lua54.can:826 -if t[2] then -- ./compiler/lua54.can:827 -return t[1] .. " <" .. t[2] .. ">" -- ./compiler/lua54.can:828 -else -- ./compiler/lua54.can:828 -return t[1] -- ./compiler/lua54.can:830 -end -- ./compiler/lua54.can:830 -end, -- ./compiler/lua54.can:830 -["DestructuringId"] = function(t) -- ./compiler/lua54.can:834 -if t["id"] then -- ./compiler/lua54.can:835 -return t["id"] -- ./compiler/lua54.can:836 -else -- ./compiler/lua54.can:836 -local d = assert(peek("destructuring"), "DestructuringId not in a destructurable assignement") -- ./compiler/lua54.can:838 -local vars = { ["id"] = tmp() } -- ./compiler/lua54.can:839 -for j = 1, # t, 1 do -- ./compiler/lua54.can:840 -table["insert"](vars, t[j]) -- ./compiler/lua54.can:841 -end -- ./compiler/lua54.can:841 -table["insert"](d, vars) -- ./compiler/lua54.can:843 -t["id"] = vars["id"] -- ./compiler/lua54.can:844 -return vars["id"] -- ./compiler/lua54.can:845 -end -- ./compiler/lua54.can:845 -end, -- ./compiler/lua54.can:845 -["Index"] = function(t) -- ./compiler/lua54.can:849 -if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua54.can:850 -return "(" .. lua(t[1]) .. ")[" .. lua(t[2]) .. "]" -- ./compiler/lua54.can:851 -else -- ./compiler/lua54.can:851 -return lua(t[1]) .. "[" .. lua(t[2]) .. "]" -- ./compiler/lua54.can:853 -end -- ./compiler/lua54.can:853 -end, -- ./compiler/lua54.can:853 -["SafeIndex"] = function(t) -- ./compiler/lua54.can:857 -if t[1]["tag"] ~= "Id" then -- ./compiler/lua54.can:858 -local l = {} -- ./compiler/lua54.can:859 -while t["tag"] == "SafeIndex" or t["tag"] == "SafeCall" do -- ./compiler/lua54.can:860 -table["insert"](l, 1, t) -- ./compiler/lua54.can:861 -t = t[1] -- ./compiler/lua54.can:862 -end -- ./compiler/lua54.can:862 -local r = "(function()" .. indent() .. "local " .. var("safe") .. " = " .. lua(l[1][1]) .. newline() -- ./compiler/lua54.can:864 -for _, e in ipairs(l) do -- ./compiler/lua54.can:865 -r = r .. ("if " .. var("safe") .. " == nil then return nil end" .. newline()) -- ./compiler/lua54.can:866 -if e["tag"] == "SafeIndex" then -- ./compiler/lua54.can:867 -r = r .. (var("safe") .. " = " .. var("safe") .. "[" .. lua(e[2]) .. "]" .. newline()) -- ./compiler/lua54.can:868 -else -- ./compiler/lua54.can:868 -r = r .. (var("safe") .. " = " .. var("safe") .. "(" .. lua(e, "_lhs", 2) .. ")" .. newline()) -- ./compiler/lua54.can:870 -end -- ./compiler/lua54.can:870 -end -- ./compiler/lua54.can:870 -r = r .. ("return " .. var("safe") .. unindent() .. "end)()") -- ./compiler/lua54.can:873 -return r -- ./compiler/lua54.can:874 -else -- ./compiler/lua54.can:874 -return "(" .. lua(t[1]) .. " ~= nil and " .. lua(t[1]) .. "[" .. lua(t[2]) .. "] or nil)" -- ./compiler/lua54.can:876 -end -- ./compiler/lua54.can:876 -end, -- ./compiler/lua54.can:876 -["_opid"] = { -- ./compiler/lua54.can:881 -["add"] = "+", -- ./compiler/lua54.can:882 -["sub"] = "-", -- ./compiler/lua54.can:882 -["mul"] = "*", -- ./compiler/lua54.can:882 -["div"] = "/", -- ./compiler/lua54.can:882 -["idiv"] = "//", -- ./compiler/lua54.can:883 -["mod"] = "%", -- ./compiler/lua54.can:883 -["pow"] = "^", -- ./compiler/lua54.can:883 -["concat"] = "..", -- ./compiler/lua54.can:883 -["band"] = "&", -- ./compiler/lua54.can:884 -["bor"] = "|", -- ./compiler/lua54.can:884 -["bxor"] = "~", -- ./compiler/lua54.can:884 -["shl"] = "<<", -- ./compiler/lua54.can:884 -["shr"] = ">>", -- ./compiler/lua54.can:884 -["eq"] = "==", -- ./compiler/lua54.can:885 -["ne"] = "~=", -- ./compiler/lua54.can:885 -["lt"] = "<", -- ./compiler/lua54.can:885 -["gt"] = ">", -- ./compiler/lua54.can:885 -["le"] = "<=", -- ./compiler/lua54.can:885 -["ge"] = ">=", -- ./compiler/lua54.can:885 -["and"] = "and", -- ./compiler/lua54.can:886 -["or"] = "or", -- ./compiler/lua54.can:886 -["unm"] = "-", -- ./compiler/lua54.can:886 -["len"] = "#", -- ./compiler/lua54.can:886 -["bnot"] = "~", -- ./compiler/lua54.can:886 -["not"] = "not" -- ./compiler/lua54.can:886 -} -- ./compiler/lua54.can:886 -}, { ["__index"] = function(self, key) -- ./compiler/lua54.can:889 -error("don't know how to compile a " .. tostring(key) .. " to " .. targetName) -- ./compiler/lua54.can:890 -end }) -- ./compiler/lua54.can:890 +["SafeCall"] = function(t) -- ./compiler/lua54.can:737 +if t[1]["tag"] ~= "Id" then -- ./compiler/lua54.can:738 +return lua(t, "SafeIndex") -- ./compiler/lua54.can:739 +else -- ./compiler/lua54.can:739 +return "(" .. lua(t[1]) .. " ~= nil and " .. lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ") or nil)" -- ./compiler/lua54.can:741 +end -- ./compiler/lua54.can:741 +end, -- ./compiler/lua54.can:741 +["_lhs"] = function(t, start, newlines) -- ./compiler/lua54.can:746 +if start == nil then start = 1 end -- ./compiler/lua54.can:746 +local r -- ./compiler/lua54.can:747 +if t[start] then -- ./compiler/lua54.can:748 +r = lua(t[start]) -- ./compiler/lua54.can:749 +for i = start + 1, # t, 1 do -- ./compiler/lua54.can:750 +r = r .. ("," .. (newlines and newline() or " ") .. lua(t[i])) -- ./compiler/lua54.can:751 +end -- ./compiler/lua54.can:751 +else -- ./compiler/lua54.can:751 +r = "" -- ./compiler/lua54.can:754 +end -- ./compiler/lua54.can:754 +return r -- ./compiler/lua54.can:756 +end, -- ./compiler/lua54.can:756 +["Id"] = function(t) -- ./compiler/lua54.can:759 +return t[1] -- ./compiler/lua54.can:760 +end, -- ./compiler/lua54.can:760 +["AttributeId"] = function(t) -- ./compiler/lua54.can:763 +if t[2] then -- ./compiler/lua54.can:764 +return t[1] .. " <" .. t[2] .. ">" -- ./compiler/lua54.can:765 +else -- ./compiler/lua54.can:765 +return t[1] -- ./compiler/lua54.can:767 +end -- ./compiler/lua54.can:767 +end, -- ./compiler/lua54.can:767 +["DestructuringId"] = function(t) -- ./compiler/lua54.can:771 +if t["id"] then -- ./compiler/lua54.can:772 +return t["id"] -- ./compiler/lua54.can:773 +else -- ./compiler/lua54.can:773 +local d = assert(peek("destructuring"), "DestructuringId not in a destructurable assignement") -- ./compiler/lua54.can:775 +local vars = { ["id"] = tmp() } -- ./compiler/lua54.can:776 +for j = 1, # t, 1 do -- ./compiler/lua54.can:777 +table["insert"](vars, t[j]) -- ./compiler/lua54.can:778 +end -- ./compiler/lua54.can:778 +table["insert"](d, vars) -- ./compiler/lua54.can:780 +t["id"] = vars["id"] -- ./compiler/lua54.can:781 +return vars["id"] -- ./compiler/lua54.can:782 +end -- ./compiler/lua54.can:782 +end, -- ./compiler/lua54.can:782 +["Index"] = function(t) -- ./compiler/lua54.can:786 +if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua54.can:787 +return "(" .. lua(t[1]) .. ")[" .. lua(t[2]) .. "]" -- ./compiler/lua54.can:788 +else -- ./compiler/lua54.can:788 +return lua(t[1]) .. "[" .. lua(t[2]) .. "]" -- ./compiler/lua54.can:790 +end -- ./compiler/lua54.can:790 +end, -- ./compiler/lua54.can:790 +["SafeIndex"] = function(t) -- ./compiler/lua54.can:794 +if t[1]["tag"] ~= "Id" then -- ./compiler/lua54.can:795 +local l = {} -- ./compiler/lua54.can:796 +while t["tag"] == "SafeIndex" or t["tag"] == "SafeCall" do -- ./compiler/lua54.can:797 +table["insert"](l, 1, t) -- ./compiler/lua54.can:798 +t = t[1] -- ./compiler/lua54.can:799 +end -- ./compiler/lua54.can:799 +local r = "(function()" .. indent() .. "local " .. var("safe") .. " = " .. lua(l[1][1]) .. newline() -- ./compiler/lua54.can:801 +for _, e in ipairs(l) do -- ./compiler/lua54.can:802 +r = r .. ("if " .. var("safe") .. " == nil then return nil end" .. newline()) -- ./compiler/lua54.can:803 +if e["tag"] == "SafeIndex" then -- ./compiler/lua54.can:804 +r = r .. (var("safe") .. " = " .. var("safe") .. "[" .. lua(e[2]) .. "]" .. newline()) -- ./compiler/lua54.can:805 +else -- ./compiler/lua54.can:805 +r = r .. (var("safe") .. " = " .. var("safe") .. "(" .. lua(e, "_lhs", 2) .. ")" .. newline()) -- ./compiler/lua54.can:807 +end -- ./compiler/lua54.can:807 +end -- ./compiler/lua54.can:807 +r = r .. ("return " .. var("safe") .. unindent() .. "end)()") -- ./compiler/lua54.can:810 +return r -- ./compiler/lua54.can:811 +else -- ./compiler/lua54.can:811 +return "(" .. lua(t[1]) .. " ~= nil and " .. lua(t[1]) .. "[" .. lua(t[2]) .. "] or nil)" -- ./compiler/lua54.can:813 +end -- ./compiler/lua54.can:813 +end, -- ./compiler/lua54.can:813 +["_opid"] = { -- ./compiler/lua54.can:818 +["add"] = "+", -- ./compiler/lua54.can:819 +["sub"] = "-", -- ./compiler/lua54.can:819 +["mul"] = "*", -- ./compiler/lua54.can:819 +["div"] = "/", -- ./compiler/lua54.can:819 +["idiv"] = "//", -- ./compiler/lua54.can:820 +["mod"] = "%", -- ./compiler/lua54.can:820 +["pow"] = "^", -- ./compiler/lua54.can:820 +["concat"] = "..", -- ./compiler/lua54.can:820 +["band"] = "&", -- ./compiler/lua54.can:821 +["bor"] = "|", -- ./compiler/lua54.can:821 +["bxor"] = "~", -- ./compiler/lua54.can:821 +["shl"] = "<<", -- ./compiler/lua54.can:821 +["shr"] = ">>", -- ./compiler/lua54.can:821 +["eq"] = "==", -- ./compiler/lua54.can:822 +["ne"] = "~=", -- ./compiler/lua54.can:822 +["lt"] = "<", -- ./compiler/lua54.can:822 +["gt"] = ">", -- ./compiler/lua54.can:822 +["le"] = "<=", -- ./compiler/lua54.can:822 +["ge"] = ">=", -- ./compiler/lua54.can:822 +["and"] = "and", -- ./compiler/lua54.can:823 +["or"] = "or", -- ./compiler/lua54.can:823 +["unm"] = "-", -- ./compiler/lua54.can:823 +["len"] = "#", -- ./compiler/lua54.can:823 +["bnot"] = "~", -- ./compiler/lua54.can:823 +["not"] = "not" -- ./compiler/lua54.can:823 +} -- ./compiler/lua54.can:823 +}, { ["__index"] = function(self, key) -- ./compiler/lua54.can:826 +error("don't know how to compile a " .. tostring(key) .. " to " .. targetName) -- ./compiler/lua54.can:827 +end }) -- ./compiler/lua54.can:827 targetName = "Lua 5.3" -- ./compiler/lua53.can:1 tags["AttributeId"] = function(t) -- ./compiler/lua53.can:4 if t[2] then -- ./compiler/lua53.can:5 @@ -2228,11 +1855,11 @@ else -- ./compiler/lua53.can:6 return t[1] -- ./compiler/lua53.can:8 end -- ./compiler/lua53.can:8 end -- ./compiler/lua53.can:8 -local code = lua(ast) .. newline() -- ./compiler/lua54.can:896 -return requireStr .. code -- ./compiler/lua54.can:897 -end -- ./compiler/lua54.can:897 -end -- ./compiler/lua54.can:897 -local lua54 = _() or lua54 -- ./compiler/lua54.can:902 +local code = lua(ast) .. newline() -- ./compiler/lua54.can:833 +return requireStr .. code -- ./compiler/lua54.can:834 +end -- ./compiler/lua54.can:834 +end -- ./compiler/lua54.can:834 +local lua54 = _() or lua54 -- ./compiler/lua54.can:839 return lua54 -- ./compiler/lua53.can:18 end -- ./compiler/lua53.can:18 local lua53 = _() or lua53 -- ./compiler/lua53.can:22 @@ -2240,933 +1867,861 @@ package["loaded"]["compiler.lua53"] = lua53 or true -- ./compiler/lua53.can:23 local function _() -- ./compiler/lua53.can:26 local function _() -- ./compiler/lua53.can:28 local function _() -- ./compiler/lua53.can:30 -local util = require("candran.util") -- ./compiler/lua54.can:1 -local targetName = "Lua 5.4" -- ./compiler/lua54.can:3 -local unpack = unpack or table["unpack"] -- ./compiler/lua54.can:5 -return function(code, ast, options, macros) -- ./compiler/lua54.can:7 -if macros == nil then macros = { -- ./compiler/lua54.can:7 -["functions"] = {}, -- ./compiler/lua54.can:7 -["variables"] = {} -- ./compiler/lua54.can:7 -} end -- ./compiler/lua54.can:7 -local lastInputPos = 1 -- ./compiler/lua54.can:9 -local prevLinePos = 1 -- ./compiler/lua54.can:10 -local lastSource = options["chunkname"] or "nil" -- ./compiler/lua54.can:11 -local lastLine = 1 -- ./compiler/lua54.can:12 -local indentLevel = 0 -- ./compiler/lua54.can:15 -local function newline() -- ./compiler/lua54.can:17 -local r = options["newline"] .. string["rep"](options["indentation"], indentLevel) -- ./compiler/lua54.can:18 -if options["mapLines"] then -- ./compiler/lua54.can:19 -local sub = code:sub(lastInputPos) -- ./compiler/lua54.can:20 +local targetName = "Lua 5.4" -- ./compiler/lua54.can:1 +return function(code, ast, options) -- ./compiler/lua54.can:3 +local lastInputPos = 1 -- ./compiler/lua54.can:5 +local prevLinePos = 1 -- ./compiler/lua54.can:6 +local lastSource = options["chunkname"] or "nil" -- ./compiler/lua54.can:7 +local lastLine = 1 -- ./compiler/lua54.can:8 +local indentLevel = 0 -- ./compiler/lua54.can:11 +local function newline() -- ./compiler/lua54.can:13 +local r = options["newline"] .. string["rep"](options["indentation"], indentLevel) -- ./compiler/lua54.can:14 +if options["mapLines"] then -- ./compiler/lua54.can:15 +local sub = code:sub(lastInputPos) -- ./compiler/lua54.can:16 local source, line = sub:sub(1, sub:find("\ ")):match(".*%-%- (.-)%:(%d+)\ -") -- ./compiler/lua54.can:21 -if source and line then -- ./compiler/lua54.can:23 -lastSource = source -- ./compiler/lua54.can:24 -lastLine = tonumber(line) -- ./compiler/lua54.can:25 -else -- ./compiler/lua54.can:25 +") -- ./compiler/lua54.can:17 +if source and line then -- ./compiler/lua54.can:19 +lastSource = source -- ./compiler/lua54.can:20 +lastLine = tonumber(line) -- ./compiler/lua54.can:21 +else -- ./compiler/lua54.can:21 for _ in code:sub(prevLinePos, lastInputPos):gmatch("\ -") do -- ./compiler/lua54.can:27 -lastLine = lastLine + (1) -- ./compiler/lua54.can:28 -end -- ./compiler/lua54.can:28 -end -- ./compiler/lua54.can:28 -prevLinePos = lastInputPos -- ./compiler/lua54.can:32 -r = " -- " .. lastSource .. ":" .. lastLine .. r -- ./compiler/lua54.can:34 -end -- ./compiler/lua54.can:34 -return r -- ./compiler/lua54.can:36 -end -- ./compiler/lua54.can:36 -local function indent() -- ./compiler/lua54.can:39 -indentLevel = indentLevel + (1) -- ./compiler/lua54.can:40 -return newline() -- ./compiler/lua54.can:41 -end -- ./compiler/lua54.can:41 -local function unindent() -- ./compiler/lua54.can:44 -indentLevel = indentLevel - (1) -- ./compiler/lua54.can:45 -return newline() -- ./compiler/lua54.can:46 -end -- ./compiler/lua54.can:46 -local states = { -- ./compiler/lua54.can:51 -["push"] = {}, -- ./compiler/lua54.can:52 -["destructuring"] = {}, -- ./compiler/lua54.can:53 -["scope"] = {}, -- ./compiler/lua54.can:54 -["macroargs"] = {} -- ./compiler/lua54.can:55 -} -- ./compiler/lua54.can:55 -local function push(name, state) -- ./compiler/lua54.can:58 -table["insert"](states[name], state) -- ./compiler/lua54.can:59 +") do -- ./compiler/lua54.can:23 +lastLine = lastLine + (1) -- ./compiler/lua54.can:24 +end -- ./compiler/lua54.can:24 +end -- ./compiler/lua54.can:24 +prevLinePos = lastInputPos -- ./compiler/lua54.can:28 +r = " -- " .. lastSource .. ":" .. lastLine .. r -- ./compiler/lua54.can:30 +end -- ./compiler/lua54.can:30 +return r -- ./compiler/lua54.can:32 +end -- ./compiler/lua54.can:32 +local function indent() -- ./compiler/lua54.can:35 +indentLevel = indentLevel + (1) -- ./compiler/lua54.can:36 +return newline() -- ./compiler/lua54.can:37 +end -- ./compiler/lua54.can:37 +local function unindent() -- ./compiler/lua54.can:40 +indentLevel = indentLevel - (1) -- ./compiler/lua54.can:41 +return newline() -- ./compiler/lua54.can:42 +end -- ./compiler/lua54.can:42 +local states = { -- ./compiler/lua54.can:47 +["push"] = {}, -- ./compiler/lua54.can:48 +["destructuring"] = {}, -- ./compiler/lua54.can:49 +["scope"] = {} -- ./compiler/lua54.can:50 +} -- ./compiler/lua54.can:50 +local function push(name, state) -- ./compiler/lua54.can:53 +table["insert"](states[name], state) -- ./compiler/lua54.can:54 +return "" -- ./compiler/lua54.can:55 +end -- ./compiler/lua54.can:55 +local function pop(name) -- ./compiler/lua54.can:58 +table["remove"](states[name]) -- ./compiler/lua54.can:59 return "" -- ./compiler/lua54.can:60 end -- ./compiler/lua54.can:60 -local function pop(name) -- ./compiler/lua54.can:63 -table["remove"](states[name]) -- ./compiler/lua54.can:64 +local function set(name, state) -- ./compiler/lua54.can:63 +states[name][# states[name]] = state -- ./compiler/lua54.can:64 return "" -- ./compiler/lua54.can:65 end -- ./compiler/lua54.can:65 -local function set(name, state) -- ./compiler/lua54.can:68 -states[name][# states[name]] = state -- ./compiler/lua54.can:69 -return "" -- ./compiler/lua54.can:70 -end -- ./compiler/lua54.can:70 -local function peek(name) -- ./compiler/lua54.can:73 -return states[name][# states[name]] -- ./compiler/lua54.can:74 -end -- ./compiler/lua54.can:74 -local function var(name) -- ./compiler/lua54.can:79 -return options["variablePrefix"] .. name -- ./compiler/lua54.can:80 -end -- ./compiler/lua54.can:80 -local function tmp() -- ./compiler/lua54.can:84 -local scope = peek("scope") -- ./compiler/lua54.can:85 -local var = ("%s_%s"):format(options["variablePrefix"], # scope) -- ./compiler/lua54.can:86 -table["insert"](scope, var) -- ./compiler/lua54.can:87 -return var -- ./compiler/lua54.can:88 -end -- ./compiler/lua54.can:88 -local nomacro = { -- ./compiler/lua54.can:92 -["variables"] = {}, -- ./compiler/lua54.can:92 -["functions"] = {} -- ./compiler/lua54.can:92 -} -- ./compiler/lua54.can:92 -local required = {} -- ./compiler/lua54.can:95 -local requireStr = "" -- ./compiler/lua54.can:96 -local function addRequire(mod, name, field) -- ./compiler/lua54.can:98 -local req = ("require(%q)%s"):format(mod, field and "." .. field or "") -- ./compiler/lua54.can:99 -if not required[req] then -- ./compiler/lua54.can:100 -requireStr = requireStr .. (("local %s = %s%s"):format(var(name), req, options["newline"])) -- ./compiler/lua54.can:101 -required[req] = true -- ./compiler/lua54.can:102 -end -- ./compiler/lua54.can:102 -end -- ./compiler/lua54.can:102 -local loop = { -- ./compiler/lua54.can:107 -"While", -- ./compiler/lua54.can:107 -"Repeat", -- ./compiler/lua54.can:107 -"Fornum", -- ./compiler/lua54.can:107 -"Forin", -- ./compiler/lua54.can:107 -"WhileExpr", -- ./compiler/lua54.can:107 -"RepeatExpr", -- ./compiler/lua54.can:107 -"FornumExpr", -- ./compiler/lua54.can:107 -"ForinExpr" -- ./compiler/lua54.can:107 -} -- ./compiler/lua54.can:107 -local func = { -- ./compiler/lua54.can:108 -"Function", -- ./compiler/lua54.can:108 -"TableCompr", -- ./compiler/lua54.can:108 -"DoExpr", -- ./compiler/lua54.can:108 -"WhileExpr", -- ./compiler/lua54.can:108 -"RepeatExpr", -- ./compiler/lua54.can:108 -"IfExpr", -- ./compiler/lua54.can:108 -"FornumExpr", -- ./compiler/lua54.can:108 -"ForinExpr" -- ./compiler/lua54.can:108 -} -- ./compiler/lua54.can:108 -local function any(list, tags, nofollow) -- ./compiler/lua54.can:112 -if nofollow == nil then nofollow = {} end -- ./compiler/lua54.can:112 -local tagsCheck = {} -- ./compiler/lua54.can:113 -for _, tag in ipairs(tags) do -- ./compiler/lua54.can:114 -tagsCheck[tag] = true -- ./compiler/lua54.can:115 -end -- ./compiler/lua54.can:115 -local nofollowCheck = {} -- ./compiler/lua54.can:117 -for _, tag in ipairs(nofollow) do -- ./compiler/lua54.can:118 -nofollowCheck[tag] = true -- ./compiler/lua54.can:119 -end -- ./compiler/lua54.can:119 -for _, node in ipairs(list) do -- ./compiler/lua54.can:121 -if type(node) == "table" then -- ./compiler/lua54.can:122 -if tagsCheck[node["tag"]] then -- ./compiler/lua54.can:123 -return node -- ./compiler/lua54.can:124 +local function peek(name) -- ./compiler/lua54.can:68 +return states[name][# states[name]] -- ./compiler/lua54.can:69 +end -- ./compiler/lua54.can:69 +local function var(name) -- ./compiler/lua54.can:74 +return options["variablePrefix"] .. name -- ./compiler/lua54.can:75 +end -- ./compiler/lua54.can:75 +local function tmp() -- ./compiler/lua54.can:79 +local scope = peek("scope") -- ./compiler/lua54.can:80 +local var = ("%s_%s"):format(options["variablePrefix"], # scope) -- ./compiler/lua54.can:81 +table["insert"](scope, var) -- ./compiler/lua54.can:82 +return var -- ./compiler/lua54.can:83 +end -- ./compiler/lua54.can:83 +local required = {} -- ./compiler/lua54.can:87 +local requireStr = "" -- ./compiler/lua54.can:88 +local function addRequire(mod, name, field) -- ./compiler/lua54.can:90 +local req = ("require(%q)%s"):format(mod, field and "." .. field or "") -- ./compiler/lua54.can:91 +if not required[req] then -- ./compiler/lua54.can:92 +requireStr = requireStr .. (("local %s = %s%s"):format(var(name), req, options["newline"])) -- ./compiler/lua54.can:93 +required[req] = true -- ./compiler/lua54.can:94 +end -- ./compiler/lua54.can:94 +end -- ./compiler/lua54.can:94 +local loop = { -- ./compiler/lua54.can:99 +"While", -- ./compiler/lua54.can:99 +"Repeat", -- ./compiler/lua54.can:99 +"Fornum", -- ./compiler/lua54.can:99 +"Forin", -- ./compiler/lua54.can:99 +"WhileExpr", -- ./compiler/lua54.can:99 +"RepeatExpr", -- ./compiler/lua54.can:99 +"FornumExpr", -- ./compiler/lua54.can:99 +"ForinExpr" -- ./compiler/lua54.can:99 +} -- ./compiler/lua54.can:99 +local func = { -- ./compiler/lua54.can:100 +"Function", -- ./compiler/lua54.can:100 +"TableCompr", -- ./compiler/lua54.can:100 +"DoExpr", -- ./compiler/lua54.can:100 +"WhileExpr", -- ./compiler/lua54.can:100 +"RepeatExpr", -- ./compiler/lua54.can:100 +"IfExpr", -- ./compiler/lua54.can:100 +"FornumExpr", -- ./compiler/lua54.can:100 +"ForinExpr" -- ./compiler/lua54.can:100 +} -- ./compiler/lua54.can:100 +local function any(list, tags, nofollow) -- ./compiler/lua54.can:104 +if nofollow == nil then nofollow = {} end -- ./compiler/lua54.can:104 +local tagsCheck = {} -- ./compiler/lua54.can:105 +for _, tag in ipairs(tags) do -- ./compiler/lua54.can:106 +tagsCheck[tag] = true -- ./compiler/lua54.can:107 +end -- ./compiler/lua54.can:107 +local nofollowCheck = {} -- ./compiler/lua54.can:109 +for _, tag in ipairs(nofollow) do -- ./compiler/lua54.can:110 +nofollowCheck[tag] = true -- ./compiler/lua54.can:111 +end -- ./compiler/lua54.can:111 +for _, node in ipairs(list) do -- ./compiler/lua54.can:113 +if type(node) == "table" then -- ./compiler/lua54.can:114 +if tagsCheck[node["tag"]] then -- ./compiler/lua54.can:115 +return node -- ./compiler/lua54.can:116 +end -- ./compiler/lua54.can:116 +if not nofollowCheck[node["tag"]] then -- ./compiler/lua54.can:118 +local r = any(node, tags, nofollow) -- ./compiler/lua54.can:119 +if r then -- ./compiler/lua54.can:120 +return r -- ./compiler/lua54.can:120 +end -- ./compiler/lua54.can:120 +end -- ./compiler/lua54.can:120 +end -- ./compiler/lua54.can:120 +end -- ./compiler/lua54.can:120 +return nil -- ./compiler/lua54.can:124 end -- ./compiler/lua54.can:124 -if not nofollowCheck[node["tag"]] then -- ./compiler/lua54.can:126 -local r = any(node, tags, nofollow) -- ./compiler/lua54.can:127 -if r then -- ./compiler/lua54.can:128 -return r -- ./compiler/lua54.can:128 -end -- ./compiler/lua54.can:128 -end -- ./compiler/lua54.can:128 -end -- ./compiler/lua54.can:128 -end -- ./compiler/lua54.can:128 -return nil -- ./compiler/lua54.can:132 +local function search(list, tags, nofollow) -- ./compiler/lua54.can:129 +if nofollow == nil then nofollow = {} end -- ./compiler/lua54.can:129 +local tagsCheck = {} -- ./compiler/lua54.can:130 +for _, tag in ipairs(tags) do -- ./compiler/lua54.can:131 +tagsCheck[tag] = true -- ./compiler/lua54.can:132 end -- ./compiler/lua54.can:132 -local function search(list, tags, nofollow) -- ./compiler/lua54.can:137 -if nofollow == nil then nofollow = {} end -- ./compiler/lua54.can:137 -local tagsCheck = {} -- ./compiler/lua54.can:138 -for _, tag in ipairs(tags) do -- ./compiler/lua54.can:139 -tagsCheck[tag] = true -- ./compiler/lua54.can:140 -end -- ./compiler/lua54.can:140 -local nofollowCheck = {} -- ./compiler/lua54.can:142 -for _, tag in ipairs(nofollow) do -- ./compiler/lua54.can:143 -nofollowCheck[tag] = true -- ./compiler/lua54.can:144 -end -- ./compiler/lua54.can:144 -local found = {} -- ./compiler/lua54.can:146 -for _, node in ipairs(list) do -- ./compiler/lua54.can:147 -if type(node) == "table" then -- ./compiler/lua54.can:148 -if not nofollowCheck[node["tag"]] then -- ./compiler/lua54.can:149 -for _, n in ipairs(search(node, tags, nofollow)) do -- ./compiler/lua54.can:150 -table["insert"](found, n) -- ./compiler/lua54.can:151 +local nofollowCheck = {} -- ./compiler/lua54.can:134 +for _, tag in ipairs(nofollow) do -- ./compiler/lua54.can:135 +nofollowCheck[tag] = true -- ./compiler/lua54.can:136 +end -- ./compiler/lua54.can:136 +local found = {} -- ./compiler/lua54.can:138 +for _, node in ipairs(list) do -- ./compiler/lua54.can:139 +if type(node) == "table" then -- ./compiler/lua54.can:140 +if not nofollowCheck[node["tag"]] then -- ./compiler/lua54.can:141 +for _, n in ipairs(search(node, tags, nofollow)) do -- ./compiler/lua54.can:142 +table["insert"](found, n) -- ./compiler/lua54.can:143 +end -- ./compiler/lua54.can:143 +end -- ./compiler/lua54.can:143 +if tagsCheck[node["tag"]] then -- ./compiler/lua54.can:146 +table["insert"](found, node) -- ./compiler/lua54.can:147 +end -- ./compiler/lua54.can:147 +end -- ./compiler/lua54.can:147 +end -- ./compiler/lua54.can:147 +return found -- ./compiler/lua54.can:151 end -- ./compiler/lua54.can:151 -end -- ./compiler/lua54.can:151 -if tagsCheck[node["tag"]] then -- ./compiler/lua54.can:154 -table["insert"](found, node) -- ./compiler/lua54.can:155 -end -- ./compiler/lua54.can:155 -end -- ./compiler/lua54.can:155 -end -- ./compiler/lua54.can:155 -return found -- ./compiler/lua54.can:159 -end -- ./compiler/lua54.can:159 -local function all(list, tags) -- ./compiler/lua54.can:163 -for _, node in ipairs(list) do -- ./compiler/lua54.can:164 -local ok = false -- ./compiler/lua54.can:165 -for _, tag in ipairs(tags) do -- ./compiler/lua54.can:166 -if node["tag"] == tag then -- ./compiler/lua54.can:167 -ok = true -- ./compiler/lua54.can:168 -break -- ./compiler/lua54.can:169 -end -- ./compiler/lua54.can:169 -end -- ./compiler/lua54.can:169 -if not ok then -- ./compiler/lua54.can:172 -return false -- ./compiler/lua54.can:173 -end -- ./compiler/lua54.can:173 -end -- ./compiler/lua54.can:173 -return true -- ./compiler/lua54.can:176 +local function all(list, tags) -- ./compiler/lua54.can:155 +for _, node in ipairs(list) do -- ./compiler/lua54.can:156 +local ok = false -- ./compiler/lua54.can:157 +for _, tag in ipairs(tags) do -- ./compiler/lua54.can:158 +if node["tag"] == tag then -- ./compiler/lua54.can:159 +ok = true -- ./compiler/lua54.can:160 +break -- ./compiler/lua54.can:161 +end -- ./compiler/lua54.can:161 +end -- ./compiler/lua54.can:161 +if not ok then -- ./compiler/lua54.can:164 +return false -- ./compiler/lua54.can:165 +end -- ./compiler/lua54.can:165 +end -- ./compiler/lua54.can:165 +return true -- ./compiler/lua54.can:168 +end -- ./compiler/lua54.can:168 +local tags -- ./compiler/lua54.can:172 +local function lua(ast, forceTag, ...) -- ./compiler/lua54.can:174 +if options["mapLines"] and ast["pos"] then -- ./compiler/lua54.can:175 +lastInputPos = ast["pos"] -- ./compiler/lua54.can:176 end -- ./compiler/lua54.can:176 -local tags -- ./compiler/lua54.can:180 -local function lua(ast, forceTag, ...) -- ./compiler/lua54.can:182 -if options["mapLines"] and ast["pos"] then -- ./compiler/lua54.can:183 -lastInputPos = ast["pos"] -- ./compiler/lua54.can:184 -end -- ./compiler/lua54.can:184 -return tags[forceTag or ast["tag"]](ast, ...) -- ./compiler/lua54.can:186 +return tags[forceTag or ast["tag"]](ast, ...) -- ./compiler/lua54.can:178 +end -- ./compiler/lua54.can:178 +local UNPACK = function(list, i, j) -- ./compiler/lua54.can:182 +return "table.unpack(" .. list .. (i and (", " .. i .. (j and (", " .. j) or "")) or "") .. ")" -- ./compiler/lua54.can:183 +end -- ./compiler/lua54.can:183 +local APPEND = function(t, toAppend) -- ./compiler/lua54.can:185 +return "do" .. indent() .. "local " .. var("a") .. " = table.pack(" .. toAppend .. ")" .. newline() .. "table.move(" .. var("a") .. ", 1, " .. var("a") .. ".n, #" .. t .. "+1, " .. t .. ")" .. unindent() .. "end" -- ./compiler/lua54.can:186 end -- ./compiler/lua54.can:186 -local UNPACK = function(list, i, j) -- ./compiler/lua54.can:190 -return "table.unpack(" .. list .. (i and (", " .. i .. (j and (", " .. j) or "")) or "") .. ")" -- ./compiler/lua54.can:191 -end -- ./compiler/lua54.can:191 -local APPEND = function(t, toAppend) -- ./compiler/lua54.can:193 -return "do" .. indent() .. "local " .. var("a") .. " = table.pack(" .. toAppend .. ")" .. newline() .. "table.move(" .. var("a") .. ", 1, " .. var("a") .. ".n, #" .. t .. "+1, " .. t .. ")" .. unindent() .. "end" -- ./compiler/lua54.can:194 -end -- ./compiler/lua54.can:194 -local CONTINUE_START = function() -- ./compiler/lua54.can:196 -return "do" .. indent() -- ./compiler/lua54.can:197 -end -- ./compiler/lua54.can:197 -local CONTINUE_STOP = function() -- ./compiler/lua54.can:199 -return unindent() .. "end" .. newline() .. "::" .. var("continue") .. "::" -- ./compiler/lua54.can:200 -end -- ./compiler/lua54.can:200 -local DESTRUCTURING_ASSIGN = function(destructured, newlineAfter, noLocal) -- ./compiler/lua54.can:202 -if newlineAfter == nil then newlineAfter = false end -- ./compiler/lua54.can:202 -if noLocal == nil then noLocal = false end -- ./compiler/lua54.can:202 -local vars = {} -- ./compiler/lua54.can:203 -local values = {} -- ./compiler/lua54.can:204 -for _, list in ipairs(destructured) do -- ./compiler/lua54.can:205 -for _, v in ipairs(list) do -- ./compiler/lua54.can:206 -local var, val -- ./compiler/lua54.can:207 -if v["tag"] == "Id" or v["tag"] == "AttributeId" then -- ./compiler/lua54.can:208 -var = v -- ./compiler/lua54.can:209 +local CONTINUE_START = function() -- ./compiler/lua54.can:188 +return "do" .. indent() -- ./compiler/lua54.can:189 +end -- ./compiler/lua54.can:189 +local CONTINUE_STOP = function() -- ./compiler/lua54.can:191 +return unindent() .. "end" .. newline() .. "::" .. var("continue") .. "::" -- ./compiler/lua54.can:192 +end -- ./compiler/lua54.can:192 +local DESTRUCTURING_ASSIGN = function(destructured, newlineAfter, noLocal) -- ./compiler/lua54.can:194 +if newlineAfter == nil then newlineAfter = false end -- ./compiler/lua54.can:194 +if noLocal == nil then noLocal = false end -- ./compiler/lua54.can:194 +local vars = {} -- ./compiler/lua54.can:195 +local values = {} -- ./compiler/lua54.can:196 +for _, list in ipairs(destructured) do -- ./compiler/lua54.can:197 +for _, v in ipairs(list) do -- ./compiler/lua54.can:198 +local var, val -- ./compiler/lua54.can:199 +if v["tag"] == "Id" or v["tag"] == "AttributeId" then -- ./compiler/lua54.can:200 +var = v -- ./compiler/lua54.can:201 +val = { -- ./compiler/lua54.can:202 +["tag"] = "Index", -- ./compiler/lua54.can:202 +{ -- ./compiler/lua54.can:202 +["tag"] = "Id", -- ./compiler/lua54.can:202 +list["id"] -- ./compiler/lua54.can:202 +}, -- ./compiler/lua54.can:202 +{ -- ./compiler/lua54.can:202 +["tag"] = "String", -- ./compiler/lua54.can:202 +v[1] -- ./compiler/lua54.can:202 +} -- ./compiler/lua54.can:202 +} -- ./compiler/lua54.can:202 +elseif v["tag"] == "Pair" then -- ./compiler/lua54.can:203 +var = v[2] -- ./compiler/lua54.can:204 +val = { -- ./compiler/lua54.can:205 +["tag"] = "Index", -- ./compiler/lua54.can:205 +{ -- ./compiler/lua54.can:205 +["tag"] = "Id", -- ./compiler/lua54.can:205 +list["id"] -- ./compiler/lua54.can:205 +}, -- ./compiler/lua54.can:205 +v[1] -- ./compiler/lua54.can:205 +} -- ./compiler/lua54.can:205 +else -- ./compiler/lua54.can:205 +error("unknown destructuring element type: " .. tostring(v["tag"])) -- ./compiler/lua54.can:207 +end -- ./compiler/lua54.can:207 +if destructured["rightOp"] and destructured["leftOp"] then -- ./compiler/lua54.can:209 val = { -- ./compiler/lua54.can:210 -["tag"] = "Index", -- ./compiler/lua54.can:210 +["tag"] = "Op", -- ./compiler/lua54.can:210 +destructured["rightOp"], -- ./compiler/lua54.can:210 +var, -- ./compiler/lua54.can:210 { -- ./compiler/lua54.can:210 -["tag"] = "Id", -- ./compiler/lua54.can:210 -list["id"] -- ./compiler/lua54.can:210 -}, -- ./compiler/lua54.can:210 -{ -- ./compiler/lua54.can:210 -["tag"] = "String", -- ./compiler/lua54.can:210 -v[1] -- ./compiler/lua54.can:210 +["tag"] = "Op", -- ./compiler/lua54.can:210 +destructured["leftOp"], -- ./compiler/lua54.can:210 +val, -- ./compiler/lua54.can:210 +var -- ./compiler/lua54.can:210 } -- ./compiler/lua54.can:210 } -- ./compiler/lua54.can:210 -elseif v["tag"] == "Pair" then -- ./compiler/lua54.can:211 -var = v[2] -- ./compiler/lua54.can:212 -val = { -- ./compiler/lua54.can:213 -["tag"] = "Index", -- ./compiler/lua54.can:213 -{ -- ./compiler/lua54.can:213 -["tag"] = "Id", -- ./compiler/lua54.can:213 -list["id"] -- ./compiler/lua54.can:213 -}, -- ./compiler/lua54.can:213 -v[1] -- ./compiler/lua54.can:213 -} -- ./compiler/lua54.can:213 -else -- ./compiler/lua54.can:213 -error("unknown destructuring element type: " .. tostring(v["tag"])) -- ./compiler/lua54.can:215 -end -- ./compiler/lua54.can:215 -if destructured["rightOp"] and destructured["leftOp"] then -- ./compiler/lua54.can:217 -val = { -- ./compiler/lua54.can:218 -["tag"] = "Op", -- ./compiler/lua54.can:218 -destructured["rightOp"], -- ./compiler/lua54.can:218 -var, -- ./compiler/lua54.can:218 -{ -- ./compiler/lua54.can:218 -["tag"] = "Op", -- ./compiler/lua54.can:218 -destructured["leftOp"], -- ./compiler/lua54.can:218 -val, -- ./compiler/lua54.can:218 -var -- ./compiler/lua54.can:218 -} -- ./compiler/lua54.can:218 -} -- ./compiler/lua54.can:218 -elseif destructured["rightOp"] then -- ./compiler/lua54.can:219 -val = { -- ./compiler/lua54.can:220 -["tag"] = "Op", -- ./compiler/lua54.can:220 -destructured["rightOp"], -- ./compiler/lua54.can:220 -var, -- ./compiler/lua54.can:220 -val -- ./compiler/lua54.can:220 -} -- ./compiler/lua54.can:220 -elseif destructured["leftOp"] then -- ./compiler/lua54.can:221 -val = { -- ./compiler/lua54.can:222 -["tag"] = "Op", -- ./compiler/lua54.can:222 -destructured["leftOp"], -- ./compiler/lua54.can:222 -val, -- ./compiler/lua54.can:222 -var -- ./compiler/lua54.can:222 -} -- ./compiler/lua54.can:222 -end -- ./compiler/lua54.can:222 -table["insert"](vars, lua(var)) -- ./compiler/lua54.can:224 -table["insert"](values, lua(val)) -- ./compiler/lua54.can:225 +elseif destructured["rightOp"] then -- ./compiler/lua54.can:211 +val = { -- ./compiler/lua54.can:212 +["tag"] = "Op", -- ./compiler/lua54.can:212 +destructured["rightOp"], -- ./compiler/lua54.can:212 +var, -- ./compiler/lua54.can:212 +val -- ./compiler/lua54.can:212 +} -- ./compiler/lua54.can:212 +elseif destructured["leftOp"] then -- ./compiler/lua54.can:213 +val = { -- ./compiler/lua54.can:214 +["tag"] = "Op", -- ./compiler/lua54.can:214 +destructured["leftOp"], -- ./compiler/lua54.can:214 +val, -- ./compiler/lua54.can:214 +var -- ./compiler/lua54.can:214 +} -- ./compiler/lua54.can:214 +end -- ./compiler/lua54.can:214 +table["insert"](vars, lua(var)) -- ./compiler/lua54.can:216 +table["insert"](values, lua(val)) -- ./compiler/lua54.can:217 +end -- ./compiler/lua54.can:217 +end -- ./compiler/lua54.can:217 +if # vars > 0 then -- ./compiler/lua54.can:220 +local decl = noLocal and "" or "local " -- ./compiler/lua54.can:221 +if newlineAfter then -- ./compiler/lua54.can:222 +return decl .. table["concat"](vars, ", ") .. " = " .. table["concat"](values, ", ") .. newline() -- ./compiler/lua54.can:223 +else -- ./compiler/lua54.can:223 +return newline() .. decl .. table["concat"](vars, ", ") .. " = " .. table["concat"](values, ", ") -- ./compiler/lua54.can:225 end -- ./compiler/lua54.can:225 -end -- ./compiler/lua54.can:225 -if # vars > 0 then -- ./compiler/lua54.can:228 -local decl = noLocal and "" or "local " -- ./compiler/lua54.can:229 -if newlineAfter then -- ./compiler/lua54.can:230 -return decl .. table["concat"](vars, ", ") .. " = " .. table["concat"](values, ", ") .. newline() -- ./compiler/lua54.can:231 -else -- ./compiler/lua54.can:231 -return newline() .. decl .. table["concat"](vars, ", ") .. " = " .. table["concat"](values, ", ") -- ./compiler/lua54.can:233 -end -- ./compiler/lua54.can:233 -else -- ./compiler/lua54.can:233 -return "" -- ./compiler/lua54.can:236 -end -- ./compiler/lua54.can:236 -end -- ./compiler/lua54.can:236 -tags = setmetatable({ -- ./compiler/lua54.can:241 -["Block"] = function(t) -- ./compiler/lua54.can:243 -local hasPush = peek("push") == nil and any(t, { "Push" }, func) -- ./compiler/lua54.can:244 -if hasPush and hasPush == t[# t] then -- ./compiler/lua54.can:245 -hasPush["tag"] = "Return" -- ./compiler/lua54.can:246 -hasPush = false -- ./compiler/lua54.can:247 -end -- ./compiler/lua54.can:247 -local r = push("scope", {}) -- ./compiler/lua54.can:249 -if hasPush then -- ./compiler/lua54.can:250 -r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:251 -end -- ./compiler/lua54.can:251 -for i = 1, # t - 1, 1 do -- ./compiler/lua54.can:253 -r = r .. (lua(t[i]) .. newline()) -- ./compiler/lua54.can:254 -end -- ./compiler/lua54.can:254 -if t[# t] then -- ./compiler/lua54.can:256 -r = r .. (lua(t[# t])) -- ./compiler/lua54.can:257 -end -- ./compiler/lua54.can:257 -if hasPush and (t[# t] and t[# t]["tag"] ~= "Return") then -- ./compiler/lua54.can:259 -r = r .. (newline() .. "return " .. UNPACK(var("push")) .. pop("push")) -- ./compiler/lua54.can:260 -end -- ./compiler/lua54.can:260 -return r .. pop("scope") -- ./compiler/lua54.can:262 -end, -- ./compiler/lua54.can:262 -["Do"] = function(t) -- ./compiler/lua54.can:268 -return "do" .. indent() .. lua(t, "Block") .. unindent() .. "end" -- ./compiler/lua54.can:269 -end, -- ./compiler/lua54.can:269 -["Set"] = function(t) -- ./compiler/lua54.can:272 -local expr = t[# t] -- ./compiler/lua54.can:274 -local vars, values = {}, {} -- ./compiler/lua54.can:275 -local destructuringVars, destructuringValues = {}, {} -- ./compiler/lua54.can:276 -for i, n in ipairs(t[1]) do -- ./compiler/lua54.can:277 -if n["tag"] == "DestructuringId" then -- ./compiler/lua54.can:278 -table["insert"](destructuringVars, n) -- ./compiler/lua54.can:279 -table["insert"](destructuringValues, expr[i]) -- ./compiler/lua54.can:280 -else -- ./compiler/lua54.can:280 -table["insert"](vars, n) -- ./compiler/lua54.can:282 -table["insert"](values, expr[i]) -- ./compiler/lua54.can:283 -end -- ./compiler/lua54.can:283 -end -- ./compiler/lua54.can:283 -if # t == 2 or # t == 3 then -- ./compiler/lua54.can:287 -local r = "" -- ./compiler/lua54.can:288 -if # vars > 0 then -- ./compiler/lua54.can:289 -r = lua(vars, "_lhs") .. " = " .. lua(values, "_lhs") -- ./compiler/lua54.can:290 -end -- ./compiler/lua54.can:290 -if # destructuringVars > 0 then -- ./compiler/lua54.can:292 -local destructured = {} -- ./compiler/lua54.can:293 -r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:294 -return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:295 -end -- ./compiler/lua54.can:295 -return r -- ./compiler/lua54.can:297 -elseif # t == 4 then -- ./compiler/lua54.can:298 -if t[3] == "=" then -- ./compiler/lua54.can:299 -local r = "" -- ./compiler/lua54.can:300 -if # vars > 0 then -- ./compiler/lua54.can:301 -r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:302 -t[2], -- ./compiler/lua54.can:302 -vars[1], -- ./compiler/lua54.can:302 -{ -- ./compiler/lua54.can:302 -["tag"] = "Paren", -- ./compiler/lua54.can:302 -values[1] -- ./compiler/lua54.can:302 -} -- ./compiler/lua54.can:302 -}, "Op")) -- ./compiler/lua54.can:302 -for i = 2, math["min"](# t[4], # vars), 1 do -- ./compiler/lua54.can:303 -r = r .. (", " .. lua({ -- ./compiler/lua54.can:304 -t[2], -- ./compiler/lua54.can:304 -vars[i], -- ./compiler/lua54.can:304 -{ -- ./compiler/lua54.can:304 -["tag"] = "Paren", -- ./compiler/lua54.can:304 -values[i] -- ./compiler/lua54.can:304 -} -- ./compiler/lua54.can:304 -}, "Op")) -- ./compiler/lua54.can:304 -end -- ./compiler/lua54.can:304 -end -- ./compiler/lua54.can:304 -if # destructuringVars > 0 then -- ./compiler/lua54.can:307 -local destructured = { ["rightOp"] = t[2] } -- ./compiler/lua54.can:308 -r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:309 -return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:310 +else -- ./compiler/lua54.can:225 +return "" -- ./compiler/lua54.can:228 +end -- ./compiler/lua54.can:228 +end -- ./compiler/lua54.can:228 +tags = setmetatable({ -- ./compiler/lua54.can:233 +["Block"] = function(t) -- ./compiler/lua54.can:235 +local hasPush = peek("push") == nil and any(t, { "Push" }, func) -- ./compiler/lua54.can:236 +if hasPush and hasPush == t[# t] then -- ./compiler/lua54.can:237 +hasPush["tag"] = "Return" -- ./compiler/lua54.can:238 +hasPush = false -- ./compiler/lua54.can:239 +end -- ./compiler/lua54.can:239 +local r = push("scope", {}) -- ./compiler/lua54.can:241 +if hasPush then -- ./compiler/lua54.can:242 +r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:243 +end -- ./compiler/lua54.can:243 +for i = 1, # t - 1, 1 do -- ./compiler/lua54.can:245 +r = r .. (lua(t[i]) .. newline()) -- ./compiler/lua54.can:246 +end -- ./compiler/lua54.can:246 +if t[# t] then -- ./compiler/lua54.can:248 +r = r .. (lua(t[# t])) -- ./compiler/lua54.can:249 +end -- ./compiler/lua54.can:249 +if hasPush and (t[# t] and t[# t]["tag"] ~= "Return") then -- ./compiler/lua54.can:251 +r = r .. (newline() .. "return " .. UNPACK(var("push")) .. pop("push")) -- ./compiler/lua54.can:252 +end -- ./compiler/lua54.can:252 +return r .. pop("scope") -- ./compiler/lua54.can:254 +end, -- ./compiler/lua54.can:254 +["Do"] = function(t) -- ./compiler/lua54.can:260 +return "do" .. indent() .. lua(t, "Block") .. unindent() .. "end" -- ./compiler/lua54.can:261 +end, -- ./compiler/lua54.can:261 +["Set"] = function(t) -- ./compiler/lua54.can:264 +local expr = t[# t] -- ./compiler/lua54.can:266 +local vars, values = {}, {} -- ./compiler/lua54.can:267 +local destructuringVars, destructuringValues = {}, {} -- ./compiler/lua54.can:268 +for i, n in ipairs(t[1]) do -- ./compiler/lua54.can:269 +if n["tag"] == "DestructuringId" then -- ./compiler/lua54.can:270 +table["insert"](destructuringVars, n) -- ./compiler/lua54.can:271 +table["insert"](destructuringValues, expr[i]) -- ./compiler/lua54.can:272 +else -- ./compiler/lua54.can:272 +table["insert"](vars, n) -- ./compiler/lua54.can:274 +table["insert"](values, expr[i]) -- ./compiler/lua54.can:275 +end -- ./compiler/lua54.can:275 +end -- ./compiler/lua54.can:275 +if # t == 2 or # t == 3 then -- ./compiler/lua54.can:279 +local r = "" -- ./compiler/lua54.can:280 +if # vars > 0 then -- ./compiler/lua54.can:281 +r = lua(vars, "_lhs") .. " = " .. lua(values, "_lhs") -- ./compiler/lua54.can:282 +end -- ./compiler/lua54.can:282 +if # destructuringVars > 0 then -- ./compiler/lua54.can:284 +local destructured = {} -- ./compiler/lua54.can:285 +r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:286 +return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:287 +end -- ./compiler/lua54.can:287 +return r -- ./compiler/lua54.can:289 +elseif # t == 4 then -- ./compiler/lua54.can:290 +if t[3] == "=" then -- ./compiler/lua54.can:291 +local r = "" -- ./compiler/lua54.can:292 +if # vars > 0 then -- ./compiler/lua54.can:293 +r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:294 +t[2], -- ./compiler/lua54.can:294 +vars[1], -- ./compiler/lua54.can:294 +{ -- ./compiler/lua54.can:294 +["tag"] = "Paren", -- ./compiler/lua54.can:294 +values[1] -- ./compiler/lua54.can:294 +} -- ./compiler/lua54.can:294 +}, "Op")) -- ./compiler/lua54.can:294 +for i = 2, math["min"](# t[4], # vars), 1 do -- ./compiler/lua54.can:295 +r = r .. (", " .. lua({ -- ./compiler/lua54.can:296 +t[2], -- ./compiler/lua54.can:296 +vars[i], -- ./compiler/lua54.can:296 +{ -- ./compiler/lua54.can:296 +["tag"] = "Paren", -- ./compiler/lua54.can:296 +values[i] -- ./compiler/lua54.can:296 +} -- ./compiler/lua54.can:296 +}, "Op")) -- ./compiler/lua54.can:296 +end -- ./compiler/lua54.can:296 +end -- ./compiler/lua54.can:296 +if # destructuringVars > 0 then -- ./compiler/lua54.can:299 +local destructured = { ["rightOp"] = t[2] } -- ./compiler/lua54.can:300 +r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:301 +return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:302 +end -- ./compiler/lua54.can:302 +return r -- ./compiler/lua54.can:304 +else -- ./compiler/lua54.can:304 +local r = "" -- ./compiler/lua54.can:306 +if # vars > 0 then -- ./compiler/lua54.can:307 +r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:308 +t[3], -- ./compiler/lua54.can:308 +{ -- ./compiler/lua54.can:308 +["tag"] = "Paren", -- ./compiler/lua54.can:308 +values[1] -- ./compiler/lua54.can:308 +}, -- ./compiler/lua54.can:308 +vars[1] -- ./compiler/lua54.can:308 +}, "Op")) -- ./compiler/lua54.can:308 +for i = 2, math["min"](# t[4], # t[1]), 1 do -- ./compiler/lua54.can:309 +r = r .. (", " .. lua({ -- ./compiler/lua54.can:310 +t[3], -- ./compiler/lua54.can:310 +{ -- ./compiler/lua54.can:310 +["tag"] = "Paren", -- ./compiler/lua54.can:310 +values[i] -- ./compiler/lua54.can:310 +}, -- ./compiler/lua54.can:310 +vars[i] -- ./compiler/lua54.can:310 +}, "Op")) -- ./compiler/lua54.can:310 end -- ./compiler/lua54.can:310 -return r -- ./compiler/lua54.can:312 -else -- ./compiler/lua54.can:312 -local r = "" -- ./compiler/lua54.can:314 -if # vars > 0 then -- ./compiler/lua54.can:315 -r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:316 -t[3], -- ./compiler/lua54.can:316 -{ -- ./compiler/lua54.can:316 -["tag"] = "Paren", -- ./compiler/lua54.can:316 -values[1] -- ./compiler/lua54.can:316 -}, -- ./compiler/lua54.can:316 -vars[1] -- ./compiler/lua54.can:316 -}, "Op")) -- ./compiler/lua54.can:316 -for i = 2, math["min"](# t[4], # t[1]), 1 do -- ./compiler/lua54.can:317 -r = r .. (", " .. lua({ -- ./compiler/lua54.can:318 -t[3], -- ./compiler/lua54.can:318 -{ -- ./compiler/lua54.can:318 -["tag"] = "Paren", -- ./compiler/lua54.can:318 -values[i] -- ./compiler/lua54.can:318 -}, -- ./compiler/lua54.can:318 -vars[i] -- ./compiler/lua54.can:318 -}, "Op")) -- ./compiler/lua54.can:318 +end -- ./compiler/lua54.can:310 +if # destructuringVars > 0 then -- ./compiler/lua54.can:313 +local destructured = { ["leftOp"] = t[3] } -- ./compiler/lua54.can:314 +r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:315 +return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:316 +end -- ./compiler/lua54.can:316 +return r -- ./compiler/lua54.can:318 end -- ./compiler/lua54.can:318 -end -- ./compiler/lua54.can:318 -if # destructuringVars > 0 then -- ./compiler/lua54.can:321 -local destructured = { ["leftOp"] = t[3] } -- ./compiler/lua54.can:322 -r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:323 -return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:324 -end -- ./compiler/lua54.can:324 -return r -- ./compiler/lua54.can:326 -end -- ./compiler/lua54.can:326 -else -- ./compiler/lua54.can:326 -local r = "" -- ./compiler/lua54.can:329 -if # vars > 0 then -- ./compiler/lua54.can:330 -r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:331 -t[2], -- ./compiler/lua54.can:331 -vars[1], -- ./compiler/lua54.can:331 -{ -- ./compiler/lua54.can:331 -["tag"] = "Op", -- ./compiler/lua54.can:331 -t[4], -- ./compiler/lua54.can:331 -{ -- ./compiler/lua54.can:331 -["tag"] = "Paren", -- ./compiler/lua54.can:331 -values[1] -- ./compiler/lua54.can:331 -}, -- ./compiler/lua54.can:331 -vars[1] -- ./compiler/lua54.can:331 -} -- ./compiler/lua54.can:331 -}, "Op")) -- ./compiler/lua54.can:331 -for i = 2, math["min"](# t[5], # t[1]), 1 do -- ./compiler/lua54.can:332 -r = r .. (", " .. lua({ -- ./compiler/lua54.can:333 -t[2], -- ./compiler/lua54.can:333 -vars[i], -- ./compiler/lua54.can:333 -{ -- ./compiler/lua54.can:333 -["tag"] = "Op", -- ./compiler/lua54.can:333 -t[4], -- ./compiler/lua54.can:333 -{ -- ./compiler/lua54.can:333 -["tag"] = "Paren", -- ./compiler/lua54.can:333 -values[i] -- ./compiler/lua54.can:333 -}, -- ./compiler/lua54.can:333 -vars[i] -- ./compiler/lua54.can:333 -} -- ./compiler/lua54.can:333 -}, "Op")) -- ./compiler/lua54.can:333 +else -- ./compiler/lua54.can:318 +local r = "" -- ./compiler/lua54.can:321 +if # vars > 0 then -- ./compiler/lua54.can:322 +r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:323 +t[2], -- ./compiler/lua54.can:323 +vars[1], -- ./compiler/lua54.can:323 +{ -- ./compiler/lua54.can:323 +["tag"] = "Op", -- ./compiler/lua54.can:323 +t[4], -- ./compiler/lua54.can:323 +{ -- ./compiler/lua54.can:323 +["tag"] = "Paren", -- ./compiler/lua54.can:323 +values[1] -- ./compiler/lua54.can:323 +}, -- ./compiler/lua54.can:323 +vars[1] -- ./compiler/lua54.can:323 +} -- ./compiler/lua54.can:323 +}, "Op")) -- ./compiler/lua54.can:323 +for i = 2, math["min"](# t[5], # t[1]), 1 do -- ./compiler/lua54.can:324 +r = r .. (", " .. lua({ -- ./compiler/lua54.can:325 +t[2], -- ./compiler/lua54.can:325 +vars[i], -- ./compiler/lua54.can:325 +{ -- ./compiler/lua54.can:325 +["tag"] = "Op", -- ./compiler/lua54.can:325 +t[4], -- ./compiler/lua54.can:325 +{ -- ./compiler/lua54.can:325 +["tag"] = "Paren", -- ./compiler/lua54.can:325 +values[i] -- ./compiler/lua54.can:325 +}, -- ./compiler/lua54.can:325 +vars[i] -- ./compiler/lua54.can:325 +} -- ./compiler/lua54.can:325 +}, "Op")) -- ./compiler/lua54.can:325 +end -- ./compiler/lua54.can:325 +end -- ./compiler/lua54.can:325 +if # destructuringVars > 0 then -- ./compiler/lua54.can:328 +local destructured = { -- ./compiler/lua54.can:329 +["rightOp"] = t[2], -- ./compiler/lua54.can:329 +["leftOp"] = t[4] -- ./compiler/lua54.can:329 +} -- ./compiler/lua54.can:329 +r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:330 +return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:331 +end -- ./compiler/lua54.can:331 +return r -- ./compiler/lua54.can:333 end -- ./compiler/lua54.can:333 -end -- ./compiler/lua54.can:333 -if # destructuringVars > 0 then -- ./compiler/lua54.can:336 -local destructured = { -- ./compiler/lua54.can:337 -["rightOp"] = t[2], -- ./compiler/lua54.can:337 -["leftOp"] = t[4] -- ./compiler/lua54.can:337 -} -- ./compiler/lua54.can:337 -r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:338 -return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:339 -end -- ./compiler/lua54.can:339 -return r -- ./compiler/lua54.can:341 -end -- ./compiler/lua54.can:341 -end, -- ./compiler/lua54.can:341 -["While"] = function(t) -- ./compiler/lua54.can:345 -local r = "" -- ./compiler/lua54.can:346 -local hasContinue = any(t[2], { "Continue" }, loop) -- ./compiler/lua54.can:347 -local lets = search({ t[1] }, { "LetExpr" }) -- ./compiler/lua54.can:348 -if # lets > 0 then -- ./compiler/lua54.can:349 -r = r .. ("do" .. indent()) -- ./compiler/lua54.can:350 -for _, l in ipairs(lets) do -- ./compiler/lua54.can:351 -r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:352 +end, -- ./compiler/lua54.can:333 +["While"] = function(t) -- ./compiler/lua54.can:337 +local r = "" -- ./compiler/lua54.can:338 +local hasContinue = any(t[2], { "Continue" }, loop) -- ./compiler/lua54.can:339 +local lets = search({ t[1] }, { "LetExpr" }) -- ./compiler/lua54.can:340 +if # lets > 0 then -- ./compiler/lua54.can:341 +r = r .. ("do" .. indent()) -- ./compiler/lua54.can:342 +for _, l in ipairs(lets) do -- ./compiler/lua54.can:343 +r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:344 +end -- ./compiler/lua54.can:344 +end -- ./compiler/lua54.can:344 +r = r .. ("while " .. lua(t[1]) .. " do" .. indent()) -- ./compiler/lua54.can:347 +if # lets > 0 then -- ./compiler/lua54.can:348 +r = r .. ("do" .. indent()) -- ./compiler/lua54.can:349 +end -- ./compiler/lua54.can:349 +if hasContinue then -- ./compiler/lua54.can:351 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:352 end -- ./compiler/lua54.can:352 -end -- ./compiler/lua54.can:352 -r = r .. ("while " .. lua(t[1]) .. " do" .. indent()) -- ./compiler/lua54.can:355 -if # lets > 0 then -- ./compiler/lua54.can:356 -r = r .. ("do" .. indent()) -- ./compiler/lua54.can:357 -end -- ./compiler/lua54.can:357 -if hasContinue then -- ./compiler/lua54.can:359 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:360 -end -- ./compiler/lua54.can:360 -r = r .. (lua(t[2])) -- ./compiler/lua54.can:362 -if hasContinue then -- ./compiler/lua54.can:363 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:364 -end -- ./compiler/lua54.can:364 -r = r .. (unindent() .. "end") -- ./compiler/lua54.can:366 -if # lets > 0 then -- ./compiler/lua54.can:367 -for _, l in ipairs(lets) do -- ./compiler/lua54.can:368 -r = r .. (newline() .. lua(l, "Set")) -- ./compiler/lua54.can:369 -end -- ./compiler/lua54.can:369 -r = r .. (unindent() .. "end" .. unindent() .. "end") -- ./compiler/lua54.can:371 -end -- ./compiler/lua54.can:371 -return r -- ./compiler/lua54.can:373 -end, -- ./compiler/lua54.can:373 -["Repeat"] = function(t) -- ./compiler/lua54.can:376 -local hasContinue = any(t[1], { "Continue" }, loop) -- ./compiler/lua54.can:377 -local r = "repeat" .. indent() -- ./compiler/lua54.can:378 -if hasContinue then -- ./compiler/lua54.can:379 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:380 -end -- ./compiler/lua54.can:380 -r = r .. (lua(t[1])) -- ./compiler/lua54.can:382 -if hasContinue then -- ./compiler/lua54.can:383 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:384 -end -- ./compiler/lua54.can:384 -r = r .. (unindent() .. "until " .. lua(t[2])) -- ./compiler/lua54.can:386 -return r -- ./compiler/lua54.can:387 -end, -- ./compiler/lua54.can:387 -["If"] = function(t) -- ./compiler/lua54.can:390 -local r = "" -- ./compiler/lua54.can:391 -local toClose = 0 -- ./compiler/lua54.can:392 -local lets = search({ t[1] }, { "LetExpr" }) -- ./compiler/lua54.can:393 -if # lets > 0 then -- ./compiler/lua54.can:394 -r = r .. ("do" .. indent()) -- ./compiler/lua54.can:395 -toClose = toClose + (1) -- ./compiler/lua54.can:396 -for _, l in ipairs(lets) do -- ./compiler/lua54.can:397 -r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:398 -end -- ./compiler/lua54.can:398 -end -- ./compiler/lua54.can:398 -r = r .. ("if " .. lua(t[1]) .. " then" .. indent() .. lua(t[2]) .. unindent()) -- ./compiler/lua54.can:401 -for i = 3, # t - 1, 2 do -- ./compiler/lua54.can:402 -lets = search({ t[i] }, { "LetExpr" }) -- ./compiler/lua54.can:403 -if # lets > 0 then -- ./compiler/lua54.can:404 -r = r .. ("else" .. indent()) -- ./compiler/lua54.can:405 -toClose = toClose + (1) -- ./compiler/lua54.can:406 -for _, l in ipairs(lets) do -- ./compiler/lua54.can:407 -r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:408 +r = r .. (lua(t[2])) -- ./compiler/lua54.can:354 +if hasContinue then -- ./compiler/lua54.can:355 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:356 +end -- ./compiler/lua54.can:356 +r = r .. (unindent() .. "end") -- ./compiler/lua54.can:358 +if # lets > 0 then -- ./compiler/lua54.can:359 +for _, l in ipairs(lets) do -- ./compiler/lua54.can:360 +r = r .. (newline() .. lua(l, "Set")) -- ./compiler/lua54.can:361 +end -- ./compiler/lua54.can:361 +r = r .. (unindent() .. "end" .. unindent() .. "end") -- ./compiler/lua54.can:363 +end -- ./compiler/lua54.can:363 +return r -- ./compiler/lua54.can:365 +end, -- ./compiler/lua54.can:365 +["Repeat"] = function(t) -- ./compiler/lua54.can:368 +local hasContinue = any(t[1], { "Continue" }, loop) -- ./compiler/lua54.can:369 +local r = "repeat" .. indent() -- ./compiler/lua54.can:370 +if hasContinue then -- ./compiler/lua54.can:371 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:372 +end -- ./compiler/lua54.can:372 +r = r .. (lua(t[1])) -- ./compiler/lua54.can:374 +if hasContinue then -- ./compiler/lua54.can:375 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:376 +end -- ./compiler/lua54.can:376 +r = r .. (unindent() .. "until " .. lua(t[2])) -- ./compiler/lua54.can:378 +return r -- ./compiler/lua54.can:379 +end, -- ./compiler/lua54.can:379 +["If"] = function(t) -- ./compiler/lua54.can:382 +local r = "" -- ./compiler/lua54.can:383 +local toClose = 0 -- ./compiler/lua54.can:384 +local lets = search({ t[1] }, { "LetExpr" }) -- ./compiler/lua54.can:385 +if # lets > 0 then -- ./compiler/lua54.can:386 +r = r .. ("do" .. indent()) -- ./compiler/lua54.can:387 +toClose = toClose + (1) -- ./compiler/lua54.can:388 +for _, l in ipairs(lets) do -- ./compiler/lua54.can:389 +r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:390 +end -- ./compiler/lua54.can:390 +end -- ./compiler/lua54.can:390 +r = r .. ("if " .. lua(t[1]) .. " then" .. indent() .. lua(t[2]) .. unindent()) -- ./compiler/lua54.can:393 +for i = 3, # t - 1, 2 do -- ./compiler/lua54.can:394 +lets = search({ t[i] }, { "LetExpr" }) -- ./compiler/lua54.can:395 +if # lets > 0 then -- ./compiler/lua54.can:396 +r = r .. ("else" .. indent()) -- ./compiler/lua54.can:397 +toClose = toClose + (1) -- ./compiler/lua54.can:398 +for _, l in ipairs(lets) do -- ./compiler/lua54.can:399 +r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:400 +end -- ./compiler/lua54.can:400 +else -- ./compiler/lua54.can:400 +r = r .. ("else") -- ./compiler/lua54.can:403 +end -- ./compiler/lua54.can:403 +r = r .. ("if " .. lua(t[i]) .. " then" .. indent() .. lua(t[i + 1]) .. unindent()) -- ./compiler/lua54.can:405 +end -- ./compiler/lua54.can:405 +if # t % 2 == 1 then -- ./compiler/lua54.can:407 +r = r .. ("else" .. indent() .. lua(t[# t]) .. unindent()) -- ./compiler/lua54.can:408 end -- ./compiler/lua54.can:408 -else -- ./compiler/lua54.can:408 -r = r .. ("else") -- ./compiler/lua54.can:411 -end -- ./compiler/lua54.can:411 -r = r .. ("if " .. lua(t[i]) .. " then" .. indent() .. lua(t[i + 1]) .. unindent()) -- ./compiler/lua54.can:413 -end -- ./compiler/lua54.can:413 -if # t % 2 == 1 then -- ./compiler/lua54.can:415 -r = r .. ("else" .. indent() .. lua(t[# t]) .. unindent()) -- ./compiler/lua54.can:416 -end -- ./compiler/lua54.can:416 -r = r .. ("end") -- ./compiler/lua54.can:418 -for i = 1, toClose do -- ./compiler/lua54.can:419 -r = r .. (unindent() .. "end") -- ./compiler/lua54.can:420 -end -- ./compiler/lua54.can:420 -return r -- ./compiler/lua54.can:422 -end, -- ./compiler/lua54.can:422 -["Fornum"] = function(t) -- ./compiler/lua54.can:425 -local r = "for " .. lua(t[1]) .. " = " .. lua(t[2]) .. ", " .. lua(t[3]) -- ./compiler/lua54.can:426 -if # t == 5 then -- ./compiler/lua54.can:427 -local hasContinue = any(t[5], { "Continue" }, loop) -- ./compiler/lua54.can:428 -r = r .. (", " .. lua(t[4]) .. " do" .. indent()) -- ./compiler/lua54.can:429 -if hasContinue then -- ./compiler/lua54.can:430 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:431 -end -- ./compiler/lua54.can:431 -r = r .. (lua(t[5])) -- ./compiler/lua54.can:433 -if hasContinue then -- ./compiler/lua54.can:434 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:435 -end -- ./compiler/lua54.can:435 -return r .. unindent() .. "end" -- ./compiler/lua54.can:437 -else -- ./compiler/lua54.can:437 -local hasContinue = any(t[4], { "Continue" }, loop) -- ./compiler/lua54.can:439 -r = r .. (" do" .. indent()) -- ./compiler/lua54.can:440 -if hasContinue then -- ./compiler/lua54.can:441 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:442 -end -- ./compiler/lua54.can:442 -r = r .. (lua(t[4])) -- ./compiler/lua54.can:444 -if hasContinue then -- ./compiler/lua54.can:445 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:446 -end -- ./compiler/lua54.can:446 -return r .. unindent() .. "end" -- ./compiler/lua54.can:448 -end -- ./compiler/lua54.can:448 -end, -- ./compiler/lua54.can:448 -["Forin"] = function(t) -- ./compiler/lua54.can:452 -local destructured = {} -- ./compiler/lua54.can:453 -local hasContinue = any(t[3], { "Continue" }, loop) -- ./compiler/lua54.can:454 -local r = "for " .. push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") .. " in " .. lua(t[2], "_lhs") .. " do" .. indent() -- ./compiler/lua54.can:455 -if hasContinue then -- ./compiler/lua54.can:456 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:457 -end -- ./compiler/lua54.can:457 -r = r .. (DESTRUCTURING_ASSIGN(destructured, true) .. lua(t[3])) -- ./compiler/lua54.can:459 -if hasContinue then -- ./compiler/lua54.can:460 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:461 -end -- ./compiler/lua54.can:461 -return r .. unindent() .. "end" -- ./compiler/lua54.can:463 -end, -- ./compiler/lua54.can:463 -["Local"] = function(t) -- ./compiler/lua54.can:466 -local destructured = {} -- ./compiler/lua54.can:467 -local r = "local " .. push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") -- ./compiler/lua54.can:468 -if t[2][1] then -- ./compiler/lua54.can:469 -r = r .. (" = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:470 -end -- ./compiler/lua54.can:470 -return r .. DESTRUCTURING_ASSIGN(destructured) -- ./compiler/lua54.can:472 -end, -- ./compiler/lua54.can:472 -["Let"] = function(t) -- ./compiler/lua54.can:475 -local destructured = {} -- ./compiler/lua54.can:476 -local nameList = push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") -- ./compiler/lua54.can:477 -local r = "local " .. nameList -- ./compiler/lua54.can:478 -if t[2][1] then -- ./compiler/lua54.can:479 -if all(t[2], { -- ./compiler/lua54.can:480 -"Nil", -- ./compiler/lua54.can:480 -"Dots", -- ./compiler/lua54.can:480 -"Boolean", -- ./compiler/lua54.can:480 -"Number", -- ./compiler/lua54.can:480 -"String" -- ./compiler/lua54.can:480 -}) then -- ./compiler/lua54.can:480 -r = r .. (" = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:481 -else -- ./compiler/lua54.can:481 -r = r .. (newline() .. nameList .. " = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:483 -end -- ./compiler/lua54.can:483 -end -- ./compiler/lua54.can:483 -return r .. DESTRUCTURING_ASSIGN(destructured) -- ./compiler/lua54.can:486 +r = r .. ("end") -- ./compiler/lua54.can:410 +for i = 1, toClose do -- ./compiler/lua54.can:411 +r = r .. (unindent() .. "end") -- ./compiler/lua54.can:412 +end -- ./compiler/lua54.can:412 +return r -- ./compiler/lua54.can:414 +end, -- ./compiler/lua54.can:414 +["Fornum"] = function(t) -- ./compiler/lua54.can:417 +local r = "for " .. lua(t[1]) .. " = " .. lua(t[2]) .. ", " .. lua(t[3]) -- ./compiler/lua54.can:418 +if # t == 5 then -- ./compiler/lua54.can:419 +local hasContinue = any(t[5], { "Continue" }, loop) -- ./compiler/lua54.can:420 +r = r .. (", " .. lua(t[4]) .. " do" .. indent()) -- ./compiler/lua54.can:421 +if hasContinue then -- ./compiler/lua54.can:422 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:423 +end -- ./compiler/lua54.can:423 +r = r .. (lua(t[5])) -- ./compiler/lua54.can:425 +if hasContinue then -- ./compiler/lua54.can:426 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:427 +end -- ./compiler/lua54.can:427 +return r .. unindent() .. "end" -- ./compiler/lua54.can:429 +else -- ./compiler/lua54.can:429 +local hasContinue = any(t[4], { "Continue" }, loop) -- ./compiler/lua54.can:431 +r = r .. (" do" .. indent()) -- ./compiler/lua54.can:432 +if hasContinue then -- ./compiler/lua54.can:433 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:434 +end -- ./compiler/lua54.can:434 +r = r .. (lua(t[4])) -- ./compiler/lua54.can:436 +if hasContinue then -- ./compiler/lua54.can:437 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:438 +end -- ./compiler/lua54.can:438 +return r .. unindent() .. "end" -- ./compiler/lua54.can:440 +end -- ./compiler/lua54.can:440 +end, -- ./compiler/lua54.can:440 +["Forin"] = function(t) -- ./compiler/lua54.can:444 +local destructured = {} -- ./compiler/lua54.can:445 +local hasContinue = any(t[3], { "Continue" }, loop) -- ./compiler/lua54.can:446 +local r = "for " .. push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") .. " in " .. lua(t[2], "_lhs") .. " do" .. indent() -- ./compiler/lua54.can:447 +if hasContinue then -- ./compiler/lua54.can:448 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:449 +end -- ./compiler/lua54.can:449 +r = r .. (DESTRUCTURING_ASSIGN(destructured, true) .. lua(t[3])) -- ./compiler/lua54.can:451 +if hasContinue then -- ./compiler/lua54.can:452 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:453 +end -- ./compiler/lua54.can:453 +return r .. unindent() .. "end" -- ./compiler/lua54.can:455 +end, -- ./compiler/lua54.can:455 +["Local"] = function(t) -- ./compiler/lua54.can:458 +local destructured = {} -- ./compiler/lua54.can:459 +local r = "local " .. push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") -- ./compiler/lua54.can:460 +if t[2][1] then -- ./compiler/lua54.can:461 +r = r .. (" = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:462 +end -- ./compiler/lua54.can:462 +return r .. DESTRUCTURING_ASSIGN(destructured) -- ./compiler/lua54.can:464 +end, -- ./compiler/lua54.can:464 +["Let"] = function(t) -- ./compiler/lua54.can:467 +local destructured = {} -- ./compiler/lua54.can:468 +local nameList = push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") -- ./compiler/lua54.can:469 +local r = "local " .. nameList -- ./compiler/lua54.can:470 +if t[2][1] then -- ./compiler/lua54.can:471 +if all(t[2], { -- ./compiler/lua54.can:472 +"Nil", -- ./compiler/lua54.can:472 +"Dots", -- ./compiler/lua54.can:472 +"Boolean", -- ./compiler/lua54.can:472 +"Number", -- ./compiler/lua54.can:472 +"String" -- ./compiler/lua54.can:472 +}) then -- ./compiler/lua54.can:472 +r = r .. (" = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:473 +else -- ./compiler/lua54.can:473 +r = r .. (newline() .. nameList .. " = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:475 +end -- ./compiler/lua54.can:475 +end -- ./compiler/lua54.can:475 +return r .. DESTRUCTURING_ASSIGN(destructured) -- ./compiler/lua54.can:478 +end, -- ./compiler/lua54.can:478 +["Localrec"] = function(t) -- ./compiler/lua54.can:481 +return "local function " .. lua(t[1][1]) .. lua(t[2][1], "_functionWithoutKeyword") -- ./compiler/lua54.can:482 +end, -- ./compiler/lua54.can:482 +["Goto"] = function(t) -- ./compiler/lua54.can:485 +return "goto " .. lua(t, "Id") -- ./compiler/lua54.can:486 end, -- ./compiler/lua54.can:486 -["Localrec"] = function(t) -- ./compiler/lua54.can:489 -return "local function " .. lua(t[1][1]) .. lua(t[2][1], "_functionWithoutKeyword") -- ./compiler/lua54.can:490 +["Label"] = function(t) -- ./compiler/lua54.can:489 +return "::" .. lua(t, "Id") .. "::" -- ./compiler/lua54.can:490 end, -- ./compiler/lua54.can:490 -["Goto"] = function(t) -- ./compiler/lua54.can:493 -return "goto " .. lua(t, "Id") -- ./compiler/lua54.can:494 -end, -- ./compiler/lua54.can:494 -["Label"] = function(t) -- ./compiler/lua54.can:497 -return "::" .. lua(t, "Id") .. "::" -- ./compiler/lua54.can:498 -end, -- ./compiler/lua54.can:498 -["Return"] = function(t) -- ./compiler/lua54.can:501 -local push = peek("push") -- ./compiler/lua54.can:502 -if push then -- ./compiler/lua54.can:503 -local r = "" -- ./compiler/lua54.can:504 -for _, val in ipairs(t) do -- ./compiler/lua54.can:505 -r = r .. (push .. "[#" .. push .. "+1] = " .. lua(val) .. newline()) -- ./compiler/lua54.can:506 -end -- ./compiler/lua54.can:506 -return r .. "return " .. UNPACK(push) -- ./compiler/lua54.can:508 -else -- ./compiler/lua54.can:508 -return "return " .. lua(t, "_lhs") -- ./compiler/lua54.can:510 +["Return"] = function(t) -- ./compiler/lua54.can:493 +local push = peek("push") -- ./compiler/lua54.can:494 +if push then -- ./compiler/lua54.can:495 +local r = "" -- ./compiler/lua54.can:496 +for _, val in ipairs(t) do -- ./compiler/lua54.can:497 +r = r .. (push .. "[#" .. push .. "+1] = " .. lua(val) .. newline()) -- ./compiler/lua54.can:498 +end -- ./compiler/lua54.can:498 +return r .. "return " .. UNPACK(push) -- ./compiler/lua54.can:500 +else -- ./compiler/lua54.can:500 +return "return " .. lua(t, "_lhs") -- ./compiler/lua54.can:502 +end -- ./compiler/lua54.can:502 +end, -- ./compiler/lua54.can:502 +["Push"] = function(t) -- ./compiler/lua54.can:506 +local var = assert(peek("push"), "no context given for push") -- ./compiler/lua54.can:507 +r = "" -- ./compiler/lua54.can:508 +for i = 1, # t - 1, 1 do -- ./compiler/lua54.can:509 +r = r .. (var .. "[#" .. var .. "+1] = " .. lua(t[i]) .. newline()) -- ./compiler/lua54.can:510 end -- ./compiler/lua54.can:510 -end, -- ./compiler/lua54.can:510 -["Push"] = function(t) -- ./compiler/lua54.can:514 -local var = assert(peek("push"), "no context given for push") -- ./compiler/lua54.can:515 -r = "" -- ./compiler/lua54.can:516 -for i = 1, # t - 1, 1 do -- ./compiler/lua54.can:517 -r = r .. (var .. "[#" .. var .. "+1] = " .. lua(t[i]) .. newline()) -- ./compiler/lua54.can:518 -end -- ./compiler/lua54.can:518 -if t[# t] then -- ./compiler/lua54.can:520 -if t[# t]["tag"] == "Call" then -- ./compiler/lua54.can:521 -r = r .. (APPEND(var, lua(t[# t]))) -- ./compiler/lua54.can:522 -else -- ./compiler/lua54.can:522 -r = r .. (var .. "[#" .. var .. "+1] = " .. lua(t[# t])) -- ./compiler/lua54.can:524 -end -- ./compiler/lua54.can:524 -end -- ./compiler/lua54.can:524 -return r -- ./compiler/lua54.can:527 +if t[# t] then -- ./compiler/lua54.can:512 +if t[# t]["tag"] == "Call" then -- ./compiler/lua54.can:513 +r = r .. (APPEND(var, lua(t[# t]))) -- ./compiler/lua54.can:514 +else -- ./compiler/lua54.can:514 +r = r .. (var .. "[#" .. var .. "+1] = " .. lua(t[# t])) -- ./compiler/lua54.can:516 +end -- ./compiler/lua54.can:516 +end -- ./compiler/lua54.can:516 +return r -- ./compiler/lua54.can:519 +end, -- ./compiler/lua54.can:519 +["Break"] = function() -- ./compiler/lua54.can:522 +return "break" -- ./compiler/lua54.can:523 +end, -- ./compiler/lua54.can:523 +["Continue"] = function() -- ./compiler/lua54.can:526 +return "goto " .. var("continue") -- ./compiler/lua54.can:527 end, -- ./compiler/lua54.can:527 -["Break"] = function() -- ./compiler/lua54.can:530 -return "break" -- ./compiler/lua54.can:531 -end, -- ./compiler/lua54.can:531 -["Continue"] = function() -- ./compiler/lua54.can:534 -return "goto " .. var("continue") -- ./compiler/lua54.can:535 +["Nil"] = function() -- ./compiler/lua54.can:534 +return "nil" -- ./compiler/lua54.can:535 end, -- ./compiler/lua54.can:535 -["Nil"] = function() -- ./compiler/lua54.can:542 -return "nil" -- ./compiler/lua54.can:543 +["Dots"] = function() -- ./compiler/lua54.can:538 +return "..." -- ./compiler/lua54.can:539 +end, -- ./compiler/lua54.can:539 +["Boolean"] = function(t) -- ./compiler/lua54.can:542 +return tostring(t[1]) -- ./compiler/lua54.can:543 end, -- ./compiler/lua54.can:543 -["Dots"] = function() -- ./compiler/lua54.can:546 -local macroargs = peek("macroargs") -- ./compiler/lua54.can:547 -if macroargs and not nomacro["variables"]["..."] and macroargs["..."] then -- ./compiler/lua54.can:548 -nomacro["variables"]["..."] = true -- ./compiler/lua54.can:549 -local r = lua(macroargs["..."], "_lhs") -- ./compiler/lua54.can:550 -nomacro["variables"]["..."] = nil -- ./compiler/lua54.can:551 -return r -- ./compiler/lua54.can:552 -else -- ./compiler/lua54.can:552 -return "..." -- ./compiler/lua54.can:554 -end -- ./compiler/lua54.can:554 -end, -- ./compiler/lua54.can:554 -["Boolean"] = function(t) -- ./compiler/lua54.can:558 -return tostring(t[1]) -- ./compiler/lua54.can:559 -end, -- ./compiler/lua54.can:559 -["Number"] = function(t) -- ./compiler/lua54.can:562 -return tostring(t[1]) -- ./compiler/lua54.can:563 -end, -- ./compiler/lua54.can:563 -["String"] = function(t) -- ./compiler/lua54.can:566 -return ("%q"):format(t[1]) -- ./compiler/lua54.can:567 -end, -- ./compiler/lua54.can:567 -["_functionWithoutKeyword"] = function(t) -- ./compiler/lua54.can:570 -local r = "(" -- ./compiler/lua54.can:571 -local decl = {} -- ./compiler/lua54.can:572 -if t[1][1] then -- ./compiler/lua54.can:573 -if t[1][1]["tag"] == "ParPair" then -- ./compiler/lua54.can:574 -local id = lua(t[1][1][1]) -- ./compiler/lua54.can:575 -indentLevel = indentLevel + (1) -- ./compiler/lua54.can:576 -table["insert"](decl, "if " .. id .. " == nil then " .. id .. " = " .. lua(t[1][1][2]) .. " end") -- ./compiler/lua54.can:577 -indentLevel = indentLevel - (1) -- ./compiler/lua54.can:578 -r = r .. (id) -- ./compiler/lua54.can:579 -else -- ./compiler/lua54.can:579 -r = r .. (lua(t[1][1])) -- ./compiler/lua54.can:581 +["Number"] = function(t) -- ./compiler/lua54.can:546 +return tostring(t[1]) -- ./compiler/lua54.can:547 +end, -- ./compiler/lua54.can:547 +["String"] = function(t) -- ./compiler/lua54.can:550 +return ("%q"):format(t[1]) -- ./compiler/lua54.can:551 +end, -- ./compiler/lua54.can:551 +["_functionWithoutKeyword"] = function(t) -- ./compiler/lua54.can:554 +local r = "(" -- ./compiler/lua54.can:555 +local decl = {} -- ./compiler/lua54.can:556 +if t[1][1] then -- ./compiler/lua54.can:557 +if t[1][1]["tag"] == "ParPair" then -- ./compiler/lua54.can:558 +local id = lua(t[1][1][1]) -- ./compiler/lua54.can:559 +indentLevel = indentLevel + (1) -- ./compiler/lua54.can:560 +table["insert"](decl, "if " .. id .. " == nil then " .. id .. " = " .. lua(t[1][1][2]) .. " end") -- ./compiler/lua54.can:561 +indentLevel = indentLevel - (1) -- ./compiler/lua54.can:562 +r = r .. (id) -- ./compiler/lua54.can:563 +else -- ./compiler/lua54.can:563 +r = r .. (lua(t[1][1])) -- ./compiler/lua54.can:565 +end -- ./compiler/lua54.can:565 +for i = 2, # t[1], 1 do -- ./compiler/lua54.can:567 +if t[1][i]["tag"] == "ParPair" then -- ./compiler/lua54.can:568 +local id = lua(t[1][i][1]) -- ./compiler/lua54.can:569 +indentLevel = indentLevel + (1) -- ./compiler/lua54.can:570 +table["insert"](decl, "if " .. id .. " == nil then " .. id .. " = " .. lua(t[1][i][2]) .. " end") -- ./compiler/lua54.can:571 +indentLevel = indentLevel - (1) -- ./compiler/lua54.can:572 +r = r .. (", " .. id) -- ./compiler/lua54.can:573 +else -- ./compiler/lua54.can:573 +r = r .. (", " .. lua(t[1][i])) -- ./compiler/lua54.can:575 +end -- ./compiler/lua54.can:575 +end -- ./compiler/lua54.can:575 +end -- ./compiler/lua54.can:575 +r = r .. (")" .. indent()) -- ./compiler/lua54.can:579 +for _, d in ipairs(decl) do -- ./compiler/lua54.can:580 +r = r .. (d .. newline()) -- ./compiler/lua54.can:581 end -- ./compiler/lua54.can:581 -for i = 2, # t[1], 1 do -- ./compiler/lua54.can:583 -if t[1][i]["tag"] == "ParPair" then -- ./compiler/lua54.can:584 -local id = lua(t[1][i][1]) -- ./compiler/lua54.can:585 -indentLevel = indentLevel + (1) -- ./compiler/lua54.can:586 -table["insert"](decl, "if " .. id .. " == nil then " .. id .. " = " .. lua(t[1][i][2]) .. " end") -- ./compiler/lua54.can:587 -indentLevel = indentLevel - (1) -- ./compiler/lua54.can:588 -r = r .. (", " .. id) -- ./compiler/lua54.can:589 -else -- ./compiler/lua54.can:589 -r = r .. (", " .. lua(t[1][i])) -- ./compiler/lua54.can:591 -end -- ./compiler/lua54.can:591 -end -- ./compiler/lua54.can:591 -end -- ./compiler/lua54.can:591 -r = r .. (")" .. indent()) -- ./compiler/lua54.can:595 -for _, d in ipairs(decl) do -- ./compiler/lua54.can:596 -r = r .. (d .. newline()) -- ./compiler/lua54.can:597 -end -- ./compiler/lua54.can:597 -if t[2][# t[2]] and t[2][# t[2]]["tag"] == "Push" then -- ./compiler/lua54.can:599 -t[2][# t[2]]["tag"] = "Return" -- ./compiler/lua54.can:600 -end -- ./compiler/lua54.can:600 -local hasPush = any(t[2], { "Push" }, func) -- ./compiler/lua54.can:602 -if hasPush then -- ./compiler/lua54.can:603 -r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:604 -else -- ./compiler/lua54.can:604 -push("push", false) -- ./compiler/lua54.can:606 -end -- ./compiler/lua54.can:606 -r = r .. (lua(t[2])) -- ./compiler/lua54.can:608 -if hasPush and (t[2][# t[2]] and t[2][# t[2]]["tag"] ~= "Return") then -- ./compiler/lua54.can:609 -r = r .. (newline() .. "return " .. UNPACK(var("push"))) -- ./compiler/lua54.can:610 -end -- ./compiler/lua54.can:610 -pop("push") -- ./compiler/lua54.can:612 -return r .. unindent() .. "end" -- ./compiler/lua54.can:613 -end, -- ./compiler/lua54.can:613 -["Function"] = function(t) -- ./compiler/lua54.can:615 -return "function" .. lua(t, "_functionWithoutKeyword") -- ./compiler/lua54.can:616 -end, -- ./compiler/lua54.can:616 -["Pair"] = function(t) -- ./compiler/lua54.can:619 -return "[" .. lua(t[1]) .. "] = " .. lua(t[2]) -- ./compiler/lua54.can:620 -end, -- ./compiler/lua54.can:620 -["Table"] = function(t) -- ./compiler/lua54.can:622 -if # t == 0 then -- ./compiler/lua54.can:623 -return "{}" -- ./compiler/lua54.can:624 -elseif # t == 1 then -- ./compiler/lua54.can:625 -return "{ " .. lua(t, "_lhs") .. " }" -- ./compiler/lua54.can:626 +if t[2][# t[2]] and t[2][# t[2]]["tag"] == "Push" then -- ./compiler/lua54.can:583 +t[2][# t[2]]["tag"] = "Return" -- ./compiler/lua54.can:584 +end -- ./compiler/lua54.can:584 +local hasPush = any(t[2], { "Push" }, func) -- ./compiler/lua54.can:586 +if hasPush then -- ./compiler/lua54.can:587 +r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:588 +else -- ./compiler/lua54.can:588 +push("push", false) -- ./compiler/lua54.can:590 +end -- ./compiler/lua54.can:590 +r = r .. (lua(t[2])) -- ./compiler/lua54.can:592 +if hasPush and (t[2][# t[2]] and t[2][# t[2]]["tag"] ~= "Return") then -- ./compiler/lua54.can:593 +r = r .. (newline() .. "return " .. UNPACK(var("push"))) -- ./compiler/lua54.can:594 +end -- ./compiler/lua54.can:594 +pop("push") -- ./compiler/lua54.can:596 +return r .. unindent() .. "end" -- ./compiler/lua54.can:597 +end, -- ./compiler/lua54.can:597 +["Function"] = function(t) -- ./compiler/lua54.can:599 +return "function" .. lua(t, "_functionWithoutKeyword") -- ./compiler/lua54.can:600 +end, -- ./compiler/lua54.can:600 +["Pair"] = function(t) -- ./compiler/lua54.can:603 +return "[" .. lua(t[1]) .. "] = " .. lua(t[2]) -- ./compiler/lua54.can:604 +end, -- ./compiler/lua54.can:604 +["Table"] = function(t) -- ./compiler/lua54.can:606 +if # t == 0 then -- ./compiler/lua54.can:607 +return "{}" -- ./compiler/lua54.can:608 +elseif # t == 1 then -- ./compiler/lua54.can:609 +return "{ " .. lua(t, "_lhs") .. " }" -- ./compiler/lua54.can:610 +else -- ./compiler/lua54.can:610 +return "{" .. indent() .. lua(t, "_lhs", nil, true) .. unindent() .. "}" -- ./compiler/lua54.can:612 +end -- ./compiler/lua54.can:612 +end, -- ./compiler/lua54.can:612 +["TableCompr"] = function(t) -- ./compiler/lua54.can:616 +return push("push", "self") .. "(function()" .. indent() .. "local self = {}" .. newline() .. lua(t[1]) .. newline() .. "return self" .. unindent() .. "end)()" .. pop("push") -- ./compiler/lua54.can:617 +end, -- ./compiler/lua54.can:617 +["Op"] = function(t) -- ./compiler/lua54.can:620 +local r -- ./compiler/lua54.can:621 +if # t == 2 then -- ./compiler/lua54.can:622 +if type(tags["_opid"][t[1]]) == "string" then -- ./compiler/lua54.can:623 +r = tags["_opid"][t[1]] .. " " .. lua(t[2]) -- ./compiler/lua54.can:624 +else -- ./compiler/lua54.can:624 +r = tags["_opid"][t[1]](t[2]) -- ./compiler/lua54.can:626 +end -- ./compiler/lua54.can:626 else -- ./compiler/lua54.can:626 -return "{" .. indent() .. lua(t, "_lhs", nil, true) .. unindent() .. "}" -- ./compiler/lua54.can:628 -end -- ./compiler/lua54.can:628 -end, -- ./compiler/lua54.can:628 -["TableCompr"] = function(t) -- ./compiler/lua54.can:632 -return push("push", "self") .. "(function()" .. indent() .. "local self = {}" .. newline() .. lua(t[1]) .. newline() .. "return self" .. unindent() .. "end)()" .. pop("push") -- ./compiler/lua54.can:633 -end, -- ./compiler/lua54.can:633 -["Op"] = function(t) -- ./compiler/lua54.can:636 -local r -- ./compiler/lua54.can:637 -if # t == 2 then -- ./compiler/lua54.can:638 -if type(tags["_opid"][t[1]]) == "string" then -- ./compiler/lua54.can:639 -r = tags["_opid"][t[1]] .. " " .. lua(t[2]) -- ./compiler/lua54.can:640 -else -- ./compiler/lua54.can:640 -r = tags["_opid"][t[1]](t[2]) -- ./compiler/lua54.can:642 -end -- ./compiler/lua54.can:642 -else -- ./compiler/lua54.can:642 -if type(tags["_opid"][t[1]]) == "string" then -- ./compiler/lua54.can:645 -r = lua(t[2]) .. " " .. tags["_opid"][t[1]] .. " " .. lua(t[3]) -- ./compiler/lua54.can:646 -else -- ./compiler/lua54.can:646 -r = tags["_opid"][t[1]](t[2], t[3]) -- ./compiler/lua54.can:648 -end -- ./compiler/lua54.can:648 -end -- ./compiler/lua54.can:648 -return r -- ./compiler/lua54.can:651 -end, -- ./compiler/lua54.can:651 -["Paren"] = function(t) -- ./compiler/lua54.can:654 -return "(" .. lua(t[1]) .. ")" -- ./compiler/lua54.can:655 -end, -- ./compiler/lua54.can:655 -["MethodStub"] = function(t) -- ./compiler/lua54.can:658 -return "(function()" .. indent() .. "local " .. var("object") .. " = " .. lua(t[1]) .. newline() .. "local " .. var("method") .. " = " .. var("object") .. "." .. lua(t[2], "Id") .. newline() .. "if " .. var("method") .. " == nil then return nil end" .. newline() .. "return function(...) return " .. var("method") .. "(" .. var("object") .. ", ...) end" .. unindent() .. "end)()" -- ./compiler/lua54.can:664 -end, -- ./compiler/lua54.can:664 -["SafeMethodStub"] = function(t) -- ./compiler/lua54.can:667 -return "(function()" .. indent() .. "local " .. var("object") .. " = " .. lua(t[1]) .. newline() .. "if " .. var("object") .. " == nil then return nil end" .. newline() .. "local " .. var("method") .. " = " .. var("object") .. "." .. lua(t[2], "Id") .. newline() .. "if " .. var("method") .. " == nil then return nil end" .. newline() .. "return function(...) return " .. var("method") .. "(" .. var("object") .. ", ...) end" .. unindent() .. "end)()" -- ./compiler/lua54.can:674 -end, -- ./compiler/lua54.can:674 -["LetExpr"] = function(t) -- ./compiler/lua54.can:681 -return lua(t[1][1]) -- ./compiler/lua54.can:682 -end, -- ./compiler/lua54.can:682 -["_statexpr"] = function(t, stat) -- ./compiler/lua54.can:686 -local hasPush = any(t, { "Push" }, func) -- ./compiler/lua54.can:687 -local r = "(function()" .. indent() -- ./compiler/lua54.can:688 -if hasPush then -- ./compiler/lua54.can:689 -r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:690 -else -- ./compiler/lua54.can:690 -push("push", false) -- ./compiler/lua54.can:692 -end -- ./compiler/lua54.can:692 -r = r .. (lua(t, stat)) -- ./compiler/lua54.can:694 -if hasPush then -- ./compiler/lua54.can:695 -r = r .. (newline() .. "return " .. UNPACK(var("push"))) -- ./compiler/lua54.can:696 -end -- ./compiler/lua54.can:696 -pop("push") -- ./compiler/lua54.can:698 -r = r .. (unindent() .. "end)()") -- ./compiler/lua54.can:699 -return r -- ./compiler/lua54.can:700 -end, -- ./compiler/lua54.can:700 -["DoExpr"] = function(t) -- ./compiler/lua54.can:703 -if t[# t]["tag"] == "Push" then -- ./compiler/lua54.can:704 -t[# t]["tag"] = "Return" -- ./compiler/lua54.can:705 -end -- ./compiler/lua54.can:705 -return lua(t, "_statexpr", "Do") -- ./compiler/lua54.can:707 -end, -- ./compiler/lua54.can:707 -["WhileExpr"] = function(t) -- ./compiler/lua54.can:710 -return lua(t, "_statexpr", "While") -- ./compiler/lua54.can:711 -end, -- ./compiler/lua54.can:711 -["RepeatExpr"] = function(t) -- ./compiler/lua54.can:714 -return lua(t, "_statexpr", "Repeat") -- ./compiler/lua54.can:715 -end, -- ./compiler/lua54.can:715 -["IfExpr"] = function(t) -- ./compiler/lua54.can:718 -for i = 2, # t do -- ./compiler/lua54.can:719 -local block = t[i] -- ./compiler/lua54.can:720 -if block[# block] and block[# block]["tag"] == "Push" then -- ./compiler/lua54.can:721 -block[# block]["tag"] = "Return" -- ./compiler/lua54.can:722 -end -- ./compiler/lua54.can:722 -end -- ./compiler/lua54.can:722 -return lua(t, "_statexpr", "If") -- ./compiler/lua54.can:725 -end, -- ./compiler/lua54.can:725 -["FornumExpr"] = function(t) -- ./compiler/lua54.can:728 -return lua(t, "_statexpr", "Fornum") -- ./compiler/lua54.can:729 -end, -- ./compiler/lua54.can:729 -["ForinExpr"] = function(t) -- ./compiler/lua54.can:732 -return lua(t, "_statexpr", "Forin") -- ./compiler/lua54.can:733 +if type(tags["_opid"][t[1]]) == "string" then -- ./compiler/lua54.can:629 +r = lua(t[2]) .. " " .. tags["_opid"][t[1]] .. " " .. lua(t[3]) -- ./compiler/lua54.can:630 +else -- ./compiler/lua54.can:630 +r = tags["_opid"][t[1]](t[2], t[3]) -- ./compiler/lua54.can:632 +end -- ./compiler/lua54.can:632 +end -- ./compiler/lua54.can:632 +return r -- ./compiler/lua54.can:635 +end, -- ./compiler/lua54.can:635 +["Paren"] = function(t) -- ./compiler/lua54.can:638 +return "(" .. lua(t[1]) .. ")" -- ./compiler/lua54.can:639 +end, -- ./compiler/lua54.can:639 +["MethodStub"] = function(t) -- ./compiler/lua54.can:642 +return "(function()" .. indent() .. "local " .. var("object") .. " = " .. lua(t[1]) .. newline() .. "local " .. var("method") .. " = " .. var("object") .. "." .. lua(t[2], "Id") .. newline() .. "if " .. var("method") .. " == nil then return nil end" .. newline() .. "return function(...) return " .. var("method") .. "(" .. var("object") .. ", ...) end" .. unindent() .. "end)()" -- ./compiler/lua54.can:648 +end, -- ./compiler/lua54.can:648 +["SafeMethodStub"] = function(t) -- ./compiler/lua54.can:651 +return "(function()" .. indent() .. "local " .. var("object") .. " = " .. lua(t[1]) .. newline() .. "if " .. var("object") .. " == nil then return nil end" .. newline() .. "local " .. var("method") .. " = " .. var("object") .. "." .. lua(t[2], "Id") .. newline() .. "if " .. var("method") .. " == nil then return nil end" .. newline() .. "return function(...) return " .. var("method") .. "(" .. var("object") .. ", ...) end" .. unindent() .. "end)()" -- ./compiler/lua54.can:658 +end, -- ./compiler/lua54.can:658 +["LetExpr"] = function(t) -- ./compiler/lua54.can:665 +return lua(t[1][1]) -- ./compiler/lua54.can:666 +end, -- ./compiler/lua54.can:666 +["_statexpr"] = function(t, stat) -- ./compiler/lua54.can:670 +local hasPush = any(t, { "Push" }, func) -- ./compiler/lua54.can:671 +local r = "(function()" .. indent() -- ./compiler/lua54.can:672 +if hasPush then -- ./compiler/lua54.can:673 +r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:674 +else -- ./compiler/lua54.can:674 +push("push", false) -- ./compiler/lua54.can:676 +end -- ./compiler/lua54.can:676 +r = r .. (lua(t, stat)) -- ./compiler/lua54.can:678 +if hasPush then -- ./compiler/lua54.can:679 +r = r .. (newline() .. "return " .. UNPACK(var("push"))) -- ./compiler/lua54.can:680 +end -- ./compiler/lua54.can:680 +pop("push") -- ./compiler/lua54.can:682 +r = r .. (unindent() .. "end)()") -- ./compiler/lua54.can:683 +return r -- ./compiler/lua54.can:684 +end, -- ./compiler/lua54.can:684 +["DoExpr"] = function(t) -- ./compiler/lua54.can:687 +if t[# t]["tag"] == "Push" then -- ./compiler/lua54.can:688 +t[# t]["tag"] = "Return" -- ./compiler/lua54.can:689 +end -- ./compiler/lua54.can:689 +return lua(t, "_statexpr", "Do") -- ./compiler/lua54.can:691 +end, -- ./compiler/lua54.can:691 +["WhileExpr"] = function(t) -- ./compiler/lua54.can:694 +return lua(t, "_statexpr", "While") -- ./compiler/lua54.can:695 +end, -- ./compiler/lua54.can:695 +["RepeatExpr"] = function(t) -- ./compiler/lua54.can:698 +return lua(t, "_statexpr", "Repeat") -- ./compiler/lua54.can:699 +end, -- ./compiler/lua54.can:699 +["IfExpr"] = function(t) -- ./compiler/lua54.can:702 +for i = 2, # t do -- ./compiler/lua54.can:703 +local block = t[i] -- ./compiler/lua54.can:704 +if block[# block] and block[# block]["tag"] == "Push" then -- ./compiler/lua54.can:705 +block[# block]["tag"] = "Return" -- ./compiler/lua54.can:706 +end -- ./compiler/lua54.can:706 +end -- ./compiler/lua54.can:706 +return lua(t, "_statexpr", "If") -- ./compiler/lua54.can:709 +end, -- ./compiler/lua54.can:709 +["FornumExpr"] = function(t) -- ./compiler/lua54.can:712 +return lua(t, "_statexpr", "Fornum") -- ./compiler/lua54.can:713 +end, -- ./compiler/lua54.can:713 +["ForinExpr"] = function(t) -- ./compiler/lua54.can:716 +return lua(t, "_statexpr", "Forin") -- ./compiler/lua54.can:717 +end, -- ./compiler/lua54.can:717 +["Call"] = function(t) -- ./compiler/lua54.can:723 +if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua54.can:724 +return "(" .. lua(t[1]) .. ")(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:725 +elseif t[1]["tag"] == "MethodStub" then -- ./compiler/lua54.can:726 +if t[1][1]["tag"] == "String" or t[1][1]["tag"] == "Table" then -- ./compiler/lua54.can:727 +return "(" .. lua(t[1][1]) .. "):" .. lua(t[1][2], "Id") .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:728 +else -- ./compiler/lua54.can:728 +return lua(t[1][1]) .. ":" .. lua(t[1][2], "Id") .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:730 +end -- ./compiler/lua54.can:730 +else -- ./compiler/lua54.can:730 +return lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:733 +end -- ./compiler/lua54.can:733 end, -- ./compiler/lua54.can:733 -["Call"] = function(t) -- ./compiler/lua54.can:739 -if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua54.can:740 -return "(" .. lua(t[1]) .. ")(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:741 -elseif t[1]["tag"] == "Id" and not nomacro["functions"][t[1][1]] and macros["functions"][t[1][1]] then -- ./compiler/lua54.can:742 -local macro = macros["functions"][t[1][1]] -- ./compiler/lua54.can:743 -local replacement = macro["replacement"] -- ./compiler/lua54.can:744 -local r -- ./compiler/lua54.can:745 -nomacro["functions"][t[1][1]] = true -- ./compiler/lua54.can:746 -if type(replacement) == "function" then -- ./compiler/lua54.can:747 -local args = {} -- ./compiler/lua54.can:748 -for i = 2, # t do -- ./compiler/lua54.can:749 -table["insert"](args, lua(t[i])) -- ./compiler/lua54.can:750 -end -- ./compiler/lua54.can:750 -r = replacement(unpack(args)) -- ./compiler/lua54.can:752 -else -- ./compiler/lua54.can:752 -local macroargs = util["merge"](peek("macroargs")) -- ./compiler/lua54.can:754 -for i, arg in ipairs(macro["args"]) do -- ./compiler/lua54.can:755 -if arg["tag"] == "Dots" then -- ./compiler/lua54.can:756 -macroargs["..."] = (function() -- ./compiler/lua54.can:757 -local self = {} -- ./compiler/lua54.can:757 -for j = i + 1, # t do -- ./compiler/lua54.can:757 -self[#self+1] = t[j] -- ./compiler/lua54.can:757 -end -- ./compiler/lua54.can:757 -return self -- ./compiler/lua54.can:757 -end)() -- ./compiler/lua54.can:757 -elseif arg["tag"] == "Id" then -- ./compiler/lua54.can:758 -if t[i + 1] == nil then -- ./compiler/lua54.can:759 -error(("bad argument #%s to macro %s (value expected)"):format(i, t[1][1])) -- ./compiler/lua54.can:760 -end -- ./compiler/lua54.can:760 -macroargs[arg[1]] = t[i + 1] -- ./compiler/lua54.can:762 -else -- ./compiler/lua54.can:762 -error(("unexpected argument type %s in macro %s"):format(arg["tag"], t[1][1])) -- ./compiler/lua54.can:764 -end -- ./compiler/lua54.can:764 -end -- ./compiler/lua54.can:764 -push("macroargs", macroargs) -- ./compiler/lua54.can:767 -r = lua(replacement) -- ./compiler/lua54.can:768 -pop("macroargs") -- ./compiler/lua54.can:769 -end -- ./compiler/lua54.can:769 -nomacro["functions"][t[1][1]] = nil -- ./compiler/lua54.can:771 -return r -- ./compiler/lua54.can:772 -elseif t[1]["tag"] == "MethodStub" then -- ./compiler/lua54.can:773 -if t[1][1]["tag"] == "String" or t[1][1]["tag"] == "Table" then -- ./compiler/lua54.can:774 -return "(" .. lua(t[1][1]) .. "):" .. lua(t[1][2], "Id") .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:775 -else -- ./compiler/lua54.can:775 -return lua(t[1][1]) .. ":" .. lua(t[1][2], "Id") .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:777 -end -- ./compiler/lua54.can:777 -else -- ./compiler/lua54.can:777 -return lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:780 -end -- ./compiler/lua54.can:780 -end, -- ./compiler/lua54.can:780 -["SafeCall"] = function(t) -- ./compiler/lua54.can:784 -if t[1]["tag"] ~= "Id" then -- ./compiler/lua54.can:785 -return lua(t, "SafeIndex") -- ./compiler/lua54.can:786 -else -- ./compiler/lua54.can:786 -return "(" .. lua(t[1]) .. " ~= nil and " .. lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ") or nil)" -- ./compiler/lua54.can:788 -end -- ./compiler/lua54.can:788 -end, -- ./compiler/lua54.can:788 -["_lhs"] = function(t, start, newlines) -- ./compiler/lua54.can:793 -if start == nil then start = 1 end -- ./compiler/lua54.can:793 -local r -- ./compiler/lua54.can:794 -if t[start] then -- ./compiler/lua54.can:795 -r = lua(t[start]) -- ./compiler/lua54.can:796 -for i = start + 1, # t, 1 do -- ./compiler/lua54.can:797 -r = r .. ("," .. (newlines and newline() or " ") .. lua(t[i])) -- ./compiler/lua54.can:798 -end -- ./compiler/lua54.can:798 -else -- ./compiler/lua54.can:798 -r = "" -- ./compiler/lua54.can:801 -end -- ./compiler/lua54.can:801 -return r -- ./compiler/lua54.can:803 -end, -- ./compiler/lua54.can:803 -["Id"] = function(t) -- ./compiler/lua54.can:806 -local r = t[1] -- ./compiler/lua54.can:807 -local macroargs = peek("macroargs") -- ./compiler/lua54.can:808 -if not nomacro["variables"][t[1]] then -- ./compiler/lua54.can:809 -nomacro["variables"][t[1]] = true -- ./compiler/lua54.can:810 -if macroargs and macroargs[t[1]] then -- ./compiler/lua54.can:811 -r = lua(macroargs[t[1]]) -- ./compiler/lua54.can:812 -elseif macros["variables"][t[1]] ~= nil then -- ./compiler/lua54.can:813 -local macro = macros["variables"][t[1]] -- ./compiler/lua54.can:814 -if type(macro) == "function" then -- ./compiler/lua54.can:815 -r = macro() -- ./compiler/lua54.can:816 -else -- ./compiler/lua54.can:816 -r = lua(macro) -- ./compiler/lua54.can:818 -end -- ./compiler/lua54.can:818 -end -- ./compiler/lua54.can:818 -nomacro["variables"][t[1]] = nil -- ./compiler/lua54.can:821 -end -- ./compiler/lua54.can:821 -return r -- ./compiler/lua54.can:823 -end, -- ./compiler/lua54.can:823 -["AttributeId"] = function(t) -- ./compiler/lua54.can:826 -if t[2] then -- ./compiler/lua54.can:827 -return t[1] .. " <" .. t[2] .. ">" -- ./compiler/lua54.can:828 -else -- ./compiler/lua54.can:828 -return t[1] -- ./compiler/lua54.can:830 -end -- ./compiler/lua54.can:830 -end, -- ./compiler/lua54.can:830 -["DestructuringId"] = function(t) -- ./compiler/lua54.can:834 -if t["id"] then -- ./compiler/lua54.can:835 -return t["id"] -- ./compiler/lua54.can:836 -else -- ./compiler/lua54.can:836 -local d = assert(peek("destructuring"), "DestructuringId not in a destructurable assignement") -- ./compiler/lua54.can:838 -local vars = { ["id"] = tmp() } -- ./compiler/lua54.can:839 -for j = 1, # t, 1 do -- ./compiler/lua54.can:840 -table["insert"](vars, t[j]) -- ./compiler/lua54.can:841 -end -- ./compiler/lua54.can:841 -table["insert"](d, vars) -- ./compiler/lua54.can:843 -t["id"] = vars["id"] -- ./compiler/lua54.can:844 -return vars["id"] -- ./compiler/lua54.can:845 -end -- ./compiler/lua54.can:845 -end, -- ./compiler/lua54.can:845 -["Index"] = function(t) -- ./compiler/lua54.can:849 -if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua54.can:850 -return "(" .. lua(t[1]) .. ")[" .. lua(t[2]) .. "]" -- ./compiler/lua54.can:851 -else -- ./compiler/lua54.can:851 -return lua(t[1]) .. "[" .. lua(t[2]) .. "]" -- ./compiler/lua54.can:853 -end -- ./compiler/lua54.can:853 -end, -- ./compiler/lua54.can:853 -["SafeIndex"] = function(t) -- ./compiler/lua54.can:857 -if t[1]["tag"] ~= "Id" then -- ./compiler/lua54.can:858 -local l = {} -- ./compiler/lua54.can:859 -while t["tag"] == "SafeIndex" or t["tag"] == "SafeCall" do -- ./compiler/lua54.can:860 -table["insert"](l, 1, t) -- ./compiler/lua54.can:861 -t = t[1] -- ./compiler/lua54.can:862 -end -- ./compiler/lua54.can:862 -local r = "(function()" .. indent() .. "local " .. var("safe") .. " = " .. lua(l[1][1]) .. newline() -- ./compiler/lua54.can:864 -for _, e in ipairs(l) do -- ./compiler/lua54.can:865 -r = r .. ("if " .. var("safe") .. " == nil then return nil end" .. newline()) -- ./compiler/lua54.can:866 -if e["tag"] == "SafeIndex" then -- ./compiler/lua54.can:867 -r = r .. (var("safe") .. " = " .. var("safe") .. "[" .. lua(e[2]) .. "]" .. newline()) -- ./compiler/lua54.can:868 -else -- ./compiler/lua54.can:868 -r = r .. (var("safe") .. " = " .. var("safe") .. "(" .. lua(e, "_lhs", 2) .. ")" .. newline()) -- ./compiler/lua54.can:870 -end -- ./compiler/lua54.can:870 -end -- ./compiler/lua54.can:870 -r = r .. ("return " .. var("safe") .. unindent() .. "end)()") -- ./compiler/lua54.can:873 -return r -- ./compiler/lua54.can:874 -else -- ./compiler/lua54.can:874 -return "(" .. lua(t[1]) .. " ~= nil and " .. lua(t[1]) .. "[" .. lua(t[2]) .. "] or nil)" -- ./compiler/lua54.can:876 -end -- ./compiler/lua54.can:876 -end, -- ./compiler/lua54.can:876 -["_opid"] = { -- ./compiler/lua54.can:881 -["add"] = "+", -- ./compiler/lua54.can:882 -["sub"] = "-", -- ./compiler/lua54.can:882 -["mul"] = "*", -- ./compiler/lua54.can:882 -["div"] = "/", -- ./compiler/lua54.can:882 -["idiv"] = "//", -- ./compiler/lua54.can:883 -["mod"] = "%", -- ./compiler/lua54.can:883 -["pow"] = "^", -- ./compiler/lua54.can:883 -["concat"] = "..", -- ./compiler/lua54.can:883 -["band"] = "&", -- ./compiler/lua54.can:884 -["bor"] = "|", -- ./compiler/lua54.can:884 -["bxor"] = "~", -- ./compiler/lua54.can:884 -["shl"] = "<<", -- ./compiler/lua54.can:884 -["shr"] = ">>", -- ./compiler/lua54.can:884 -["eq"] = "==", -- ./compiler/lua54.can:885 -["ne"] = "~=", -- ./compiler/lua54.can:885 -["lt"] = "<", -- ./compiler/lua54.can:885 -["gt"] = ">", -- ./compiler/lua54.can:885 -["le"] = "<=", -- ./compiler/lua54.can:885 -["ge"] = ">=", -- ./compiler/lua54.can:885 -["and"] = "and", -- ./compiler/lua54.can:886 -["or"] = "or", -- ./compiler/lua54.can:886 -["unm"] = "-", -- ./compiler/lua54.can:886 -["len"] = "#", -- ./compiler/lua54.can:886 -["bnot"] = "~", -- ./compiler/lua54.can:886 -["not"] = "not" -- ./compiler/lua54.can:886 -} -- ./compiler/lua54.can:886 -}, { ["__index"] = function(self, key) -- ./compiler/lua54.can:889 -error("don't know how to compile a " .. tostring(key) .. " to " .. targetName) -- ./compiler/lua54.can:890 -end }) -- ./compiler/lua54.can:890 +["SafeCall"] = function(t) -- ./compiler/lua54.can:737 +if t[1]["tag"] ~= "Id" then -- ./compiler/lua54.can:738 +return lua(t, "SafeIndex") -- ./compiler/lua54.can:739 +else -- ./compiler/lua54.can:739 +return "(" .. lua(t[1]) .. " ~= nil and " .. lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ") or nil)" -- ./compiler/lua54.can:741 +end -- ./compiler/lua54.can:741 +end, -- ./compiler/lua54.can:741 +["_lhs"] = function(t, start, newlines) -- ./compiler/lua54.can:746 +if start == nil then start = 1 end -- ./compiler/lua54.can:746 +local r -- ./compiler/lua54.can:747 +if t[start] then -- ./compiler/lua54.can:748 +r = lua(t[start]) -- ./compiler/lua54.can:749 +for i = start + 1, # t, 1 do -- ./compiler/lua54.can:750 +r = r .. ("," .. (newlines and newline() or " ") .. lua(t[i])) -- ./compiler/lua54.can:751 +end -- ./compiler/lua54.can:751 +else -- ./compiler/lua54.can:751 +r = "" -- ./compiler/lua54.can:754 +end -- ./compiler/lua54.can:754 +return r -- ./compiler/lua54.can:756 +end, -- ./compiler/lua54.can:756 +["Id"] = function(t) -- ./compiler/lua54.can:759 +return t[1] -- ./compiler/lua54.can:760 +end, -- ./compiler/lua54.can:760 +["AttributeId"] = function(t) -- ./compiler/lua54.can:763 +if t[2] then -- ./compiler/lua54.can:764 +return t[1] .. " <" .. t[2] .. ">" -- ./compiler/lua54.can:765 +else -- ./compiler/lua54.can:765 +return t[1] -- ./compiler/lua54.can:767 +end -- ./compiler/lua54.can:767 +end, -- ./compiler/lua54.can:767 +["DestructuringId"] = function(t) -- ./compiler/lua54.can:771 +if t["id"] then -- ./compiler/lua54.can:772 +return t["id"] -- ./compiler/lua54.can:773 +else -- ./compiler/lua54.can:773 +local d = assert(peek("destructuring"), "DestructuringId not in a destructurable assignement") -- ./compiler/lua54.can:775 +local vars = { ["id"] = tmp() } -- ./compiler/lua54.can:776 +for j = 1, # t, 1 do -- ./compiler/lua54.can:777 +table["insert"](vars, t[j]) -- ./compiler/lua54.can:778 +end -- ./compiler/lua54.can:778 +table["insert"](d, vars) -- ./compiler/lua54.can:780 +t["id"] = vars["id"] -- ./compiler/lua54.can:781 +return vars["id"] -- ./compiler/lua54.can:782 +end -- ./compiler/lua54.can:782 +end, -- ./compiler/lua54.can:782 +["Index"] = function(t) -- ./compiler/lua54.can:786 +if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua54.can:787 +return "(" .. lua(t[1]) .. ")[" .. lua(t[2]) .. "]" -- ./compiler/lua54.can:788 +else -- ./compiler/lua54.can:788 +return lua(t[1]) .. "[" .. lua(t[2]) .. "]" -- ./compiler/lua54.can:790 +end -- ./compiler/lua54.can:790 +end, -- ./compiler/lua54.can:790 +["SafeIndex"] = function(t) -- ./compiler/lua54.can:794 +if t[1]["tag"] ~= "Id" then -- ./compiler/lua54.can:795 +local l = {} -- ./compiler/lua54.can:796 +while t["tag"] == "SafeIndex" or t["tag"] == "SafeCall" do -- ./compiler/lua54.can:797 +table["insert"](l, 1, t) -- ./compiler/lua54.can:798 +t = t[1] -- ./compiler/lua54.can:799 +end -- ./compiler/lua54.can:799 +local r = "(function()" .. indent() .. "local " .. var("safe") .. " = " .. lua(l[1][1]) .. newline() -- ./compiler/lua54.can:801 +for _, e in ipairs(l) do -- ./compiler/lua54.can:802 +r = r .. ("if " .. var("safe") .. " == nil then return nil end" .. newline()) -- ./compiler/lua54.can:803 +if e["tag"] == "SafeIndex" then -- ./compiler/lua54.can:804 +r = r .. (var("safe") .. " = " .. var("safe") .. "[" .. lua(e[2]) .. "]" .. newline()) -- ./compiler/lua54.can:805 +else -- ./compiler/lua54.can:805 +r = r .. (var("safe") .. " = " .. var("safe") .. "(" .. lua(e, "_lhs", 2) .. ")" .. newline()) -- ./compiler/lua54.can:807 +end -- ./compiler/lua54.can:807 +end -- ./compiler/lua54.can:807 +r = r .. ("return " .. var("safe") .. unindent() .. "end)()") -- ./compiler/lua54.can:810 +return r -- ./compiler/lua54.can:811 +else -- ./compiler/lua54.can:811 +return "(" .. lua(t[1]) .. " ~= nil and " .. lua(t[1]) .. "[" .. lua(t[2]) .. "] or nil)" -- ./compiler/lua54.can:813 +end -- ./compiler/lua54.can:813 +end, -- ./compiler/lua54.can:813 +["_opid"] = { -- ./compiler/lua54.can:818 +["add"] = "+", -- ./compiler/lua54.can:819 +["sub"] = "-", -- ./compiler/lua54.can:819 +["mul"] = "*", -- ./compiler/lua54.can:819 +["div"] = "/", -- ./compiler/lua54.can:819 +["idiv"] = "//", -- ./compiler/lua54.can:820 +["mod"] = "%", -- ./compiler/lua54.can:820 +["pow"] = "^", -- ./compiler/lua54.can:820 +["concat"] = "..", -- ./compiler/lua54.can:820 +["band"] = "&", -- ./compiler/lua54.can:821 +["bor"] = "|", -- ./compiler/lua54.can:821 +["bxor"] = "~", -- ./compiler/lua54.can:821 +["shl"] = "<<", -- ./compiler/lua54.can:821 +["shr"] = ">>", -- ./compiler/lua54.can:821 +["eq"] = "==", -- ./compiler/lua54.can:822 +["ne"] = "~=", -- ./compiler/lua54.can:822 +["lt"] = "<", -- ./compiler/lua54.can:822 +["gt"] = ">", -- ./compiler/lua54.can:822 +["le"] = "<=", -- ./compiler/lua54.can:822 +["ge"] = ">=", -- ./compiler/lua54.can:822 +["and"] = "and", -- ./compiler/lua54.can:823 +["or"] = "or", -- ./compiler/lua54.can:823 +["unm"] = "-", -- ./compiler/lua54.can:823 +["len"] = "#", -- ./compiler/lua54.can:823 +["bnot"] = "~", -- ./compiler/lua54.can:823 +["not"] = "not" -- ./compiler/lua54.can:823 +} -- ./compiler/lua54.can:823 +}, { ["__index"] = function(self, key) -- ./compiler/lua54.can:826 +error("don't know how to compile a " .. tostring(key) .. " to " .. targetName) -- ./compiler/lua54.can:827 +end }) -- ./compiler/lua54.can:827 targetName = "Lua 5.3" -- ./compiler/lua53.can:1 tags["AttributeId"] = function(t) -- ./compiler/lua53.can:4 if t[2] then -- ./compiler/lua53.can:5 @@ -3200,11 +2755,11 @@ end -- ./compiler/lua52.can:23 tags["_opid"]["bnot"] = function(right) -- ./compiler/lua52.can:25 return "bit32.bnot(" .. lua(right) .. ")" -- ./compiler/lua52.can:26 end -- ./compiler/lua52.can:26 -local code = lua(ast) .. newline() -- ./compiler/lua54.can:896 -return requireStr .. code -- ./compiler/lua54.can:897 -end -- ./compiler/lua54.can:897 -end -- ./compiler/lua54.can:897 -local lua54 = _() or lua54 -- ./compiler/lua54.can:902 +local code = lua(ast) .. newline() -- ./compiler/lua54.can:833 +return requireStr .. code -- ./compiler/lua54.can:834 +end -- ./compiler/lua54.can:834 +end -- ./compiler/lua54.can:834 +local lua54 = _() or lua54 -- ./compiler/lua54.can:839 return lua54 -- ./compiler/lua53.can:18 end -- ./compiler/lua53.can:18 local lua53 = _() or lua53 -- ./compiler/lua53.can:22 @@ -3216,933 +2771,861 @@ local function _() -- ./compiler/lua52.can:43 local function _() -- ./compiler/lua52.can:45 local function _() -- ./compiler/lua52.can:47 local function _() -- ./compiler/lua52.can:49 -local util = require("candran.util") -- ./compiler/lua54.can:1 -local targetName = "Lua 5.4" -- ./compiler/lua54.can:3 -local unpack = unpack or table["unpack"] -- ./compiler/lua54.can:5 -return function(code, ast, options, macros) -- ./compiler/lua54.can:7 -if macros == nil then macros = { -- ./compiler/lua54.can:7 -["functions"] = {}, -- ./compiler/lua54.can:7 -["variables"] = {} -- ./compiler/lua54.can:7 -} end -- ./compiler/lua54.can:7 -local lastInputPos = 1 -- ./compiler/lua54.can:9 -local prevLinePos = 1 -- ./compiler/lua54.can:10 -local lastSource = options["chunkname"] or "nil" -- ./compiler/lua54.can:11 -local lastLine = 1 -- ./compiler/lua54.can:12 -local indentLevel = 0 -- ./compiler/lua54.can:15 -local function newline() -- ./compiler/lua54.can:17 -local r = options["newline"] .. string["rep"](options["indentation"], indentLevel) -- ./compiler/lua54.can:18 -if options["mapLines"] then -- ./compiler/lua54.can:19 -local sub = code:sub(lastInputPos) -- ./compiler/lua54.can:20 +local targetName = "Lua 5.4" -- ./compiler/lua54.can:1 +return function(code, ast, options) -- ./compiler/lua54.can:3 +local lastInputPos = 1 -- ./compiler/lua54.can:5 +local prevLinePos = 1 -- ./compiler/lua54.can:6 +local lastSource = options["chunkname"] or "nil" -- ./compiler/lua54.can:7 +local lastLine = 1 -- ./compiler/lua54.can:8 +local indentLevel = 0 -- ./compiler/lua54.can:11 +local function newline() -- ./compiler/lua54.can:13 +local r = options["newline"] .. string["rep"](options["indentation"], indentLevel) -- ./compiler/lua54.can:14 +if options["mapLines"] then -- ./compiler/lua54.can:15 +local sub = code:sub(lastInputPos) -- ./compiler/lua54.can:16 local source, line = sub:sub(1, sub:find("\ ")):match(".*%-%- (.-)%:(%d+)\ -") -- ./compiler/lua54.can:21 -if source and line then -- ./compiler/lua54.can:23 -lastSource = source -- ./compiler/lua54.can:24 -lastLine = tonumber(line) -- ./compiler/lua54.can:25 -else -- ./compiler/lua54.can:25 +") -- ./compiler/lua54.can:17 +if source and line then -- ./compiler/lua54.can:19 +lastSource = source -- ./compiler/lua54.can:20 +lastLine = tonumber(line) -- ./compiler/lua54.can:21 +else -- ./compiler/lua54.can:21 for _ in code:sub(prevLinePos, lastInputPos):gmatch("\ -") do -- ./compiler/lua54.can:27 -lastLine = lastLine + (1) -- ./compiler/lua54.can:28 -end -- ./compiler/lua54.can:28 -end -- ./compiler/lua54.can:28 -prevLinePos = lastInputPos -- ./compiler/lua54.can:32 -r = " -- " .. lastSource .. ":" .. lastLine .. r -- ./compiler/lua54.can:34 -end -- ./compiler/lua54.can:34 -return r -- ./compiler/lua54.can:36 -end -- ./compiler/lua54.can:36 -local function indent() -- ./compiler/lua54.can:39 -indentLevel = indentLevel + (1) -- ./compiler/lua54.can:40 -return newline() -- ./compiler/lua54.can:41 -end -- ./compiler/lua54.can:41 -local function unindent() -- ./compiler/lua54.can:44 -indentLevel = indentLevel - (1) -- ./compiler/lua54.can:45 -return newline() -- ./compiler/lua54.can:46 -end -- ./compiler/lua54.can:46 -local states = { -- ./compiler/lua54.can:51 -["push"] = {}, -- ./compiler/lua54.can:52 -["destructuring"] = {}, -- ./compiler/lua54.can:53 -["scope"] = {}, -- ./compiler/lua54.can:54 -["macroargs"] = {} -- ./compiler/lua54.can:55 -} -- ./compiler/lua54.can:55 -local function push(name, state) -- ./compiler/lua54.can:58 -table["insert"](states[name], state) -- ./compiler/lua54.can:59 +") do -- ./compiler/lua54.can:23 +lastLine = lastLine + (1) -- ./compiler/lua54.can:24 +end -- ./compiler/lua54.can:24 +end -- ./compiler/lua54.can:24 +prevLinePos = lastInputPos -- ./compiler/lua54.can:28 +r = " -- " .. lastSource .. ":" .. lastLine .. r -- ./compiler/lua54.can:30 +end -- ./compiler/lua54.can:30 +return r -- ./compiler/lua54.can:32 +end -- ./compiler/lua54.can:32 +local function indent() -- ./compiler/lua54.can:35 +indentLevel = indentLevel + (1) -- ./compiler/lua54.can:36 +return newline() -- ./compiler/lua54.can:37 +end -- ./compiler/lua54.can:37 +local function unindent() -- ./compiler/lua54.can:40 +indentLevel = indentLevel - (1) -- ./compiler/lua54.can:41 +return newline() -- ./compiler/lua54.can:42 +end -- ./compiler/lua54.can:42 +local states = { -- ./compiler/lua54.can:47 +["push"] = {}, -- ./compiler/lua54.can:48 +["destructuring"] = {}, -- ./compiler/lua54.can:49 +["scope"] = {} -- ./compiler/lua54.can:50 +} -- ./compiler/lua54.can:50 +local function push(name, state) -- ./compiler/lua54.can:53 +table["insert"](states[name], state) -- ./compiler/lua54.can:54 +return "" -- ./compiler/lua54.can:55 +end -- ./compiler/lua54.can:55 +local function pop(name) -- ./compiler/lua54.can:58 +table["remove"](states[name]) -- ./compiler/lua54.can:59 return "" -- ./compiler/lua54.can:60 end -- ./compiler/lua54.can:60 -local function pop(name) -- ./compiler/lua54.can:63 -table["remove"](states[name]) -- ./compiler/lua54.can:64 +local function set(name, state) -- ./compiler/lua54.can:63 +states[name][# states[name]] = state -- ./compiler/lua54.can:64 return "" -- ./compiler/lua54.can:65 end -- ./compiler/lua54.can:65 -local function set(name, state) -- ./compiler/lua54.can:68 -states[name][# states[name]] = state -- ./compiler/lua54.can:69 -return "" -- ./compiler/lua54.can:70 -end -- ./compiler/lua54.can:70 -local function peek(name) -- ./compiler/lua54.can:73 -return states[name][# states[name]] -- ./compiler/lua54.can:74 -end -- ./compiler/lua54.can:74 -local function var(name) -- ./compiler/lua54.can:79 -return options["variablePrefix"] .. name -- ./compiler/lua54.can:80 -end -- ./compiler/lua54.can:80 -local function tmp() -- ./compiler/lua54.can:84 -local scope = peek("scope") -- ./compiler/lua54.can:85 -local var = ("%s_%s"):format(options["variablePrefix"], # scope) -- ./compiler/lua54.can:86 -table["insert"](scope, var) -- ./compiler/lua54.can:87 -return var -- ./compiler/lua54.can:88 -end -- ./compiler/lua54.can:88 -local nomacro = { -- ./compiler/lua54.can:92 -["variables"] = {}, -- ./compiler/lua54.can:92 -["functions"] = {} -- ./compiler/lua54.can:92 -} -- ./compiler/lua54.can:92 -local required = {} -- ./compiler/lua54.can:95 -local requireStr = "" -- ./compiler/lua54.can:96 -local function addRequire(mod, name, field) -- ./compiler/lua54.can:98 -local req = ("require(%q)%s"):format(mod, field and "." .. field or "") -- ./compiler/lua54.can:99 -if not required[req] then -- ./compiler/lua54.can:100 -requireStr = requireStr .. (("local %s = %s%s"):format(var(name), req, options["newline"])) -- ./compiler/lua54.can:101 -required[req] = true -- ./compiler/lua54.can:102 -end -- ./compiler/lua54.can:102 -end -- ./compiler/lua54.can:102 -local loop = { -- ./compiler/lua54.can:107 -"While", -- ./compiler/lua54.can:107 -"Repeat", -- ./compiler/lua54.can:107 -"Fornum", -- ./compiler/lua54.can:107 -"Forin", -- ./compiler/lua54.can:107 -"WhileExpr", -- ./compiler/lua54.can:107 -"RepeatExpr", -- ./compiler/lua54.can:107 -"FornumExpr", -- ./compiler/lua54.can:107 -"ForinExpr" -- ./compiler/lua54.can:107 -} -- ./compiler/lua54.can:107 -local func = { -- ./compiler/lua54.can:108 -"Function", -- ./compiler/lua54.can:108 -"TableCompr", -- ./compiler/lua54.can:108 -"DoExpr", -- ./compiler/lua54.can:108 -"WhileExpr", -- ./compiler/lua54.can:108 -"RepeatExpr", -- ./compiler/lua54.can:108 -"IfExpr", -- ./compiler/lua54.can:108 -"FornumExpr", -- ./compiler/lua54.can:108 -"ForinExpr" -- ./compiler/lua54.can:108 -} -- ./compiler/lua54.can:108 -local function any(list, tags, nofollow) -- ./compiler/lua54.can:112 -if nofollow == nil then nofollow = {} end -- ./compiler/lua54.can:112 -local tagsCheck = {} -- ./compiler/lua54.can:113 -for _, tag in ipairs(tags) do -- ./compiler/lua54.can:114 -tagsCheck[tag] = true -- ./compiler/lua54.can:115 -end -- ./compiler/lua54.can:115 -local nofollowCheck = {} -- ./compiler/lua54.can:117 -for _, tag in ipairs(nofollow) do -- ./compiler/lua54.can:118 -nofollowCheck[tag] = true -- ./compiler/lua54.can:119 -end -- ./compiler/lua54.can:119 -for _, node in ipairs(list) do -- ./compiler/lua54.can:121 -if type(node) == "table" then -- ./compiler/lua54.can:122 -if tagsCheck[node["tag"]] then -- ./compiler/lua54.can:123 -return node -- ./compiler/lua54.can:124 +local function peek(name) -- ./compiler/lua54.can:68 +return states[name][# states[name]] -- ./compiler/lua54.can:69 +end -- ./compiler/lua54.can:69 +local function var(name) -- ./compiler/lua54.can:74 +return options["variablePrefix"] .. name -- ./compiler/lua54.can:75 +end -- ./compiler/lua54.can:75 +local function tmp() -- ./compiler/lua54.can:79 +local scope = peek("scope") -- ./compiler/lua54.can:80 +local var = ("%s_%s"):format(options["variablePrefix"], # scope) -- ./compiler/lua54.can:81 +table["insert"](scope, var) -- ./compiler/lua54.can:82 +return var -- ./compiler/lua54.can:83 +end -- ./compiler/lua54.can:83 +local required = {} -- ./compiler/lua54.can:87 +local requireStr = "" -- ./compiler/lua54.can:88 +local function addRequire(mod, name, field) -- ./compiler/lua54.can:90 +local req = ("require(%q)%s"):format(mod, field and "." .. field or "") -- ./compiler/lua54.can:91 +if not required[req] then -- ./compiler/lua54.can:92 +requireStr = requireStr .. (("local %s = %s%s"):format(var(name), req, options["newline"])) -- ./compiler/lua54.can:93 +required[req] = true -- ./compiler/lua54.can:94 +end -- ./compiler/lua54.can:94 +end -- ./compiler/lua54.can:94 +local loop = { -- ./compiler/lua54.can:99 +"While", -- ./compiler/lua54.can:99 +"Repeat", -- ./compiler/lua54.can:99 +"Fornum", -- ./compiler/lua54.can:99 +"Forin", -- ./compiler/lua54.can:99 +"WhileExpr", -- ./compiler/lua54.can:99 +"RepeatExpr", -- ./compiler/lua54.can:99 +"FornumExpr", -- ./compiler/lua54.can:99 +"ForinExpr" -- ./compiler/lua54.can:99 +} -- ./compiler/lua54.can:99 +local func = { -- ./compiler/lua54.can:100 +"Function", -- ./compiler/lua54.can:100 +"TableCompr", -- ./compiler/lua54.can:100 +"DoExpr", -- ./compiler/lua54.can:100 +"WhileExpr", -- ./compiler/lua54.can:100 +"RepeatExpr", -- ./compiler/lua54.can:100 +"IfExpr", -- ./compiler/lua54.can:100 +"FornumExpr", -- ./compiler/lua54.can:100 +"ForinExpr" -- ./compiler/lua54.can:100 +} -- ./compiler/lua54.can:100 +local function any(list, tags, nofollow) -- ./compiler/lua54.can:104 +if nofollow == nil then nofollow = {} end -- ./compiler/lua54.can:104 +local tagsCheck = {} -- ./compiler/lua54.can:105 +for _, tag in ipairs(tags) do -- ./compiler/lua54.can:106 +tagsCheck[tag] = true -- ./compiler/lua54.can:107 +end -- ./compiler/lua54.can:107 +local nofollowCheck = {} -- ./compiler/lua54.can:109 +for _, tag in ipairs(nofollow) do -- ./compiler/lua54.can:110 +nofollowCheck[tag] = true -- ./compiler/lua54.can:111 +end -- ./compiler/lua54.can:111 +for _, node in ipairs(list) do -- ./compiler/lua54.can:113 +if type(node) == "table" then -- ./compiler/lua54.can:114 +if tagsCheck[node["tag"]] then -- ./compiler/lua54.can:115 +return node -- ./compiler/lua54.can:116 +end -- ./compiler/lua54.can:116 +if not nofollowCheck[node["tag"]] then -- ./compiler/lua54.can:118 +local r = any(node, tags, nofollow) -- ./compiler/lua54.can:119 +if r then -- ./compiler/lua54.can:120 +return r -- ./compiler/lua54.can:120 +end -- ./compiler/lua54.can:120 +end -- ./compiler/lua54.can:120 +end -- ./compiler/lua54.can:120 +end -- ./compiler/lua54.can:120 +return nil -- ./compiler/lua54.can:124 end -- ./compiler/lua54.can:124 -if not nofollowCheck[node["tag"]] then -- ./compiler/lua54.can:126 -local r = any(node, tags, nofollow) -- ./compiler/lua54.can:127 -if r then -- ./compiler/lua54.can:128 -return r -- ./compiler/lua54.can:128 -end -- ./compiler/lua54.can:128 -end -- ./compiler/lua54.can:128 -end -- ./compiler/lua54.can:128 -end -- ./compiler/lua54.can:128 -return nil -- ./compiler/lua54.can:132 +local function search(list, tags, nofollow) -- ./compiler/lua54.can:129 +if nofollow == nil then nofollow = {} end -- ./compiler/lua54.can:129 +local tagsCheck = {} -- ./compiler/lua54.can:130 +for _, tag in ipairs(tags) do -- ./compiler/lua54.can:131 +tagsCheck[tag] = true -- ./compiler/lua54.can:132 end -- ./compiler/lua54.can:132 -local function search(list, tags, nofollow) -- ./compiler/lua54.can:137 -if nofollow == nil then nofollow = {} end -- ./compiler/lua54.can:137 -local tagsCheck = {} -- ./compiler/lua54.can:138 -for _, tag in ipairs(tags) do -- ./compiler/lua54.can:139 -tagsCheck[tag] = true -- ./compiler/lua54.can:140 -end -- ./compiler/lua54.can:140 -local nofollowCheck = {} -- ./compiler/lua54.can:142 -for _, tag in ipairs(nofollow) do -- ./compiler/lua54.can:143 -nofollowCheck[tag] = true -- ./compiler/lua54.can:144 -end -- ./compiler/lua54.can:144 -local found = {} -- ./compiler/lua54.can:146 -for _, node in ipairs(list) do -- ./compiler/lua54.can:147 -if type(node) == "table" then -- ./compiler/lua54.can:148 -if not nofollowCheck[node["tag"]] then -- ./compiler/lua54.can:149 -for _, n in ipairs(search(node, tags, nofollow)) do -- ./compiler/lua54.can:150 -table["insert"](found, n) -- ./compiler/lua54.can:151 +local nofollowCheck = {} -- ./compiler/lua54.can:134 +for _, tag in ipairs(nofollow) do -- ./compiler/lua54.can:135 +nofollowCheck[tag] = true -- ./compiler/lua54.can:136 +end -- ./compiler/lua54.can:136 +local found = {} -- ./compiler/lua54.can:138 +for _, node in ipairs(list) do -- ./compiler/lua54.can:139 +if type(node) == "table" then -- ./compiler/lua54.can:140 +if not nofollowCheck[node["tag"]] then -- ./compiler/lua54.can:141 +for _, n in ipairs(search(node, tags, nofollow)) do -- ./compiler/lua54.can:142 +table["insert"](found, n) -- ./compiler/lua54.can:143 +end -- ./compiler/lua54.can:143 +end -- ./compiler/lua54.can:143 +if tagsCheck[node["tag"]] then -- ./compiler/lua54.can:146 +table["insert"](found, node) -- ./compiler/lua54.can:147 +end -- ./compiler/lua54.can:147 +end -- ./compiler/lua54.can:147 +end -- ./compiler/lua54.can:147 +return found -- ./compiler/lua54.can:151 end -- ./compiler/lua54.can:151 -end -- ./compiler/lua54.can:151 -if tagsCheck[node["tag"]] then -- ./compiler/lua54.can:154 -table["insert"](found, node) -- ./compiler/lua54.can:155 -end -- ./compiler/lua54.can:155 -end -- ./compiler/lua54.can:155 -end -- ./compiler/lua54.can:155 -return found -- ./compiler/lua54.can:159 -end -- ./compiler/lua54.can:159 -local function all(list, tags) -- ./compiler/lua54.can:163 -for _, node in ipairs(list) do -- ./compiler/lua54.can:164 -local ok = false -- ./compiler/lua54.can:165 -for _, tag in ipairs(tags) do -- ./compiler/lua54.can:166 -if node["tag"] == tag then -- ./compiler/lua54.can:167 -ok = true -- ./compiler/lua54.can:168 -break -- ./compiler/lua54.can:169 -end -- ./compiler/lua54.can:169 -end -- ./compiler/lua54.can:169 -if not ok then -- ./compiler/lua54.can:172 -return false -- ./compiler/lua54.can:173 -end -- ./compiler/lua54.can:173 -end -- ./compiler/lua54.can:173 -return true -- ./compiler/lua54.can:176 +local function all(list, tags) -- ./compiler/lua54.can:155 +for _, node in ipairs(list) do -- ./compiler/lua54.can:156 +local ok = false -- ./compiler/lua54.can:157 +for _, tag in ipairs(tags) do -- ./compiler/lua54.can:158 +if node["tag"] == tag then -- ./compiler/lua54.can:159 +ok = true -- ./compiler/lua54.can:160 +break -- ./compiler/lua54.can:161 +end -- ./compiler/lua54.can:161 +end -- ./compiler/lua54.can:161 +if not ok then -- ./compiler/lua54.can:164 +return false -- ./compiler/lua54.can:165 +end -- ./compiler/lua54.can:165 +end -- ./compiler/lua54.can:165 +return true -- ./compiler/lua54.can:168 +end -- ./compiler/lua54.can:168 +local tags -- ./compiler/lua54.can:172 +local function lua(ast, forceTag, ...) -- ./compiler/lua54.can:174 +if options["mapLines"] and ast["pos"] then -- ./compiler/lua54.can:175 +lastInputPos = ast["pos"] -- ./compiler/lua54.can:176 end -- ./compiler/lua54.can:176 -local tags -- ./compiler/lua54.can:180 -local function lua(ast, forceTag, ...) -- ./compiler/lua54.can:182 -if options["mapLines"] and ast["pos"] then -- ./compiler/lua54.can:183 -lastInputPos = ast["pos"] -- ./compiler/lua54.can:184 -end -- ./compiler/lua54.can:184 -return tags[forceTag or ast["tag"]](ast, ...) -- ./compiler/lua54.can:186 +return tags[forceTag or ast["tag"]](ast, ...) -- ./compiler/lua54.can:178 +end -- ./compiler/lua54.can:178 +local UNPACK = function(list, i, j) -- ./compiler/lua54.can:182 +return "table.unpack(" .. list .. (i and (", " .. i .. (j and (", " .. j) or "")) or "") .. ")" -- ./compiler/lua54.can:183 +end -- ./compiler/lua54.can:183 +local APPEND = function(t, toAppend) -- ./compiler/lua54.can:185 +return "do" .. indent() .. "local " .. var("a") .. " = table.pack(" .. toAppend .. ")" .. newline() .. "table.move(" .. var("a") .. ", 1, " .. var("a") .. ".n, #" .. t .. "+1, " .. t .. ")" .. unindent() .. "end" -- ./compiler/lua54.can:186 end -- ./compiler/lua54.can:186 -local UNPACK = function(list, i, j) -- ./compiler/lua54.can:190 -return "table.unpack(" .. list .. (i and (", " .. i .. (j and (", " .. j) or "")) or "") .. ")" -- ./compiler/lua54.can:191 -end -- ./compiler/lua54.can:191 -local APPEND = function(t, toAppend) -- ./compiler/lua54.can:193 -return "do" .. indent() .. "local " .. var("a") .. " = table.pack(" .. toAppend .. ")" .. newline() .. "table.move(" .. var("a") .. ", 1, " .. var("a") .. ".n, #" .. t .. "+1, " .. t .. ")" .. unindent() .. "end" -- ./compiler/lua54.can:194 -end -- ./compiler/lua54.can:194 -local CONTINUE_START = function() -- ./compiler/lua54.can:196 -return "do" .. indent() -- ./compiler/lua54.can:197 -end -- ./compiler/lua54.can:197 -local CONTINUE_STOP = function() -- ./compiler/lua54.can:199 -return unindent() .. "end" .. newline() .. "::" .. var("continue") .. "::" -- ./compiler/lua54.can:200 -end -- ./compiler/lua54.can:200 -local DESTRUCTURING_ASSIGN = function(destructured, newlineAfter, noLocal) -- ./compiler/lua54.can:202 -if newlineAfter == nil then newlineAfter = false end -- ./compiler/lua54.can:202 -if noLocal == nil then noLocal = false end -- ./compiler/lua54.can:202 -local vars = {} -- ./compiler/lua54.can:203 -local values = {} -- ./compiler/lua54.can:204 -for _, list in ipairs(destructured) do -- ./compiler/lua54.can:205 -for _, v in ipairs(list) do -- ./compiler/lua54.can:206 -local var, val -- ./compiler/lua54.can:207 -if v["tag"] == "Id" or v["tag"] == "AttributeId" then -- ./compiler/lua54.can:208 -var = v -- ./compiler/lua54.can:209 +local CONTINUE_START = function() -- ./compiler/lua54.can:188 +return "do" .. indent() -- ./compiler/lua54.can:189 +end -- ./compiler/lua54.can:189 +local CONTINUE_STOP = function() -- ./compiler/lua54.can:191 +return unindent() .. "end" .. newline() .. "::" .. var("continue") .. "::" -- ./compiler/lua54.can:192 +end -- ./compiler/lua54.can:192 +local DESTRUCTURING_ASSIGN = function(destructured, newlineAfter, noLocal) -- ./compiler/lua54.can:194 +if newlineAfter == nil then newlineAfter = false end -- ./compiler/lua54.can:194 +if noLocal == nil then noLocal = false end -- ./compiler/lua54.can:194 +local vars = {} -- ./compiler/lua54.can:195 +local values = {} -- ./compiler/lua54.can:196 +for _, list in ipairs(destructured) do -- ./compiler/lua54.can:197 +for _, v in ipairs(list) do -- ./compiler/lua54.can:198 +local var, val -- ./compiler/lua54.can:199 +if v["tag"] == "Id" or v["tag"] == "AttributeId" then -- ./compiler/lua54.can:200 +var = v -- ./compiler/lua54.can:201 +val = { -- ./compiler/lua54.can:202 +["tag"] = "Index", -- ./compiler/lua54.can:202 +{ -- ./compiler/lua54.can:202 +["tag"] = "Id", -- ./compiler/lua54.can:202 +list["id"] -- ./compiler/lua54.can:202 +}, -- ./compiler/lua54.can:202 +{ -- ./compiler/lua54.can:202 +["tag"] = "String", -- ./compiler/lua54.can:202 +v[1] -- ./compiler/lua54.can:202 +} -- ./compiler/lua54.can:202 +} -- ./compiler/lua54.can:202 +elseif v["tag"] == "Pair" then -- ./compiler/lua54.can:203 +var = v[2] -- ./compiler/lua54.can:204 +val = { -- ./compiler/lua54.can:205 +["tag"] = "Index", -- ./compiler/lua54.can:205 +{ -- ./compiler/lua54.can:205 +["tag"] = "Id", -- ./compiler/lua54.can:205 +list["id"] -- ./compiler/lua54.can:205 +}, -- ./compiler/lua54.can:205 +v[1] -- ./compiler/lua54.can:205 +} -- ./compiler/lua54.can:205 +else -- ./compiler/lua54.can:205 +error("unknown destructuring element type: " .. tostring(v["tag"])) -- ./compiler/lua54.can:207 +end -- ./compiler/lua54.can:207 +if destructured["rightOp"] and destructured["leftOp"] then -- ./compiler/lua54.can:209 val = { -- ./compiler/lua54.can:210 -["tag"] = "Index", -- ./compiler/lua54.can:210 +["tag"] = "Op", -- ./compiler/lua54.can:210 +destructured["rightOp"], -- ./compiler/lua54.can:210 +var, -- ./compiler/lua54.can:210 { -- ./compiler/lua54.can:210 -["tag"] = "Id", -- ./compiler/lua54.can:210 -list["id"] -- ./compiler/lua54.can:210 -}, -- ./compiler/lua54.can:210 -{ -- ./compiler/lua54.can:210 -["tag"] = "String", -- ./compiler/lua54.can:210 -v[1] -- ./compiler/lua54.can:210 +["tag"] = "Op", -- ./compiler/lua54.can:210 +destructured["leftOp"], -- ./compiler/lua54.can:210 +val, -- ./compiler/lua54.can:210 +var -- ./compiler/lua54.can:210 } -- ./compiler/lua54.can:210 } -- ./compiler/lua54.can:210 -elseif v["tag"] == "Pair" then -- ./compiler/lua54.can:211 -var = v[2] -- ./compiler/lua54.can:212 -val = { -- ./compiler/lua54.can:213 -["tag"] = "Index", -- ./compiler/lua54.can:213 -{ -- ./compiler/lua54.can:213 -["tag"] = "Id", -- ./compiler/lua54.can:213 -list["id"] -- ./compiler/lua54.can:213 -}, -- ./compiler/lua54.can:213 -v[1] -- ./compiler/lua54.can:213 -} -- ./compiler/lua54.can:213 -else -- ./compiler/lua54.can:213 -error("unknown destructuring element type: " .. tostring(v["tag"])) -- ./compiler/lua54.can:215 -end -- ./compiler/lua54.can:215 -if destructured["rightOp"] and destructured["leftOp"] then -- ./compiler/lua54.can:217 -val = { -- ./compiler/lua54.can:218 -["tag"] = "Op", -- ./compiler/lua54.can:218 -destructured["rightOp"], -- ./compiler/lua54.can:218 -var, -- ./compiler/lua54.can:218 -{ -- ./compiler/lua54.can:218 -["tag"] = "Op", -- ./compiler/lua54.can:218 -destructured["leftOp"], -- ./compiler/lua54.can:218 -val, -- ./compiler/lua54.can:218 -var -- ./compiler/lua54.can:218 -} -- ./compiler/lua54.can:218 -} -- ./compiler/lua54.can:218 -elseif destructured["rightOp"] then -- ./compiler/lua54.can:219 -val = { -- ./compiler/lua54.can:220 -["tag"] = "Op", -- ./compiler/lua54.can:220 -destructured["rightOp"], -- ./compiler/lua54.can:220 -var, -- ./compiler/lua54.can:220 -val -- ./compiler/lua54.can:220 -} -- ./compiler/lua54.can:220 -elseif destructured["leftOp"] then -- ./compiler/lua54.can:221 -val = { -- ./compiler/lua54.can:222 -["tag"] = "Op", -- ./compiler/lua54.can:222 -destructured["leftOp"], -- ./compiler/lua54.can:222 -val, -- ./compiler/lua54.can:222 -var -- ./compiler/lua54.can:222 -} -- ./compiler/lua54.can:222 -end -- ./compiler/lua54.can:222 -table["insert"](vars, lua(var)) -- ./compiler/lua54.can:224 -table["insert"](values, lua(val)) -- ./compiler/lua54.can:225 +elseif destructured["rightOp"] then -- ./compiler/lua54.can:211 +val = { -- ./compiler/lua54.can:212 +["tag"] = "Op", -- ./compiler/lua54.can:212 +destructured["rightOp"], -- ./compiler/lua54.can:212 +var, -- ./compiler/lua54.can:212 +val -- ./compiler/lua54.can:212 +} -- ./compiler/lua54.can:212 +elseif destructured["leftOp"] then -- ./compiler/lua54.can:213 +val = { -- ./compiler/lua54.can:214 +["tag"] = "Op", -- ./compiler/lua54.can:214 +destructured["leftOp"], -- ./compiler/lua54.can:214 +val, -- ./compiler/lua54.can:214 +var -- ./compiler/lua54.can:214 +} -- ./compiler/lua54.can:214 +end -- ./compiler/lua54.can:214 +table["insert"](vars, lua(var)) -- ./compiler/lua54.can:216 +table["insert"](values, lua(val)) -- ./compiler/lua54.can:217 +end -- ./compiler/lua54.can:217 +end -- ./compiler/lua54.can:217 +if # vars > 0 then -- ./compiler/lua54.can:220 +local decl = noLocal and "" or "local " -- ./compiler/lua54.can:221 +if newlineAfter then -- ./compiler/lua54.can:222 +return decl .. table["concat"](vars, ", ") .. " = " .. table["concat"](values, ", ") .. newline() -- ./compiler/lua54.can:223 +else -- ./compiler/lua54.can:223 +return newline() .. decl .. table["concat"](vars, ", ") .. " = " .. table["concat"](values, ", ") -- ./compiler/lua54.can:225 end -- ./compiler/lua54.can:225 -end -- ./compiler/lua54.can:225 -if # vars > 0 then -- ./compiler/lua54.can:228 -local decl = noLocal and "" or "local " -- ./compiler/lua54.can:229 -if newlineAfter then -- ./compiler/lua54.can:230 -return decl .. table["concat"](vars, ", ") .. " = " .. table["concat"](values, ", ") .. newline() -- ./compiler/lua54.can:231 -else -- ./compiler/lua54.can:231 -return newline() .. decl .. table["concat"](vars, ", ") .. " = " .. table["concat"](values, ", ") -- ./compiler/lua54.can:233 -end -- ./compiler/lua54.can:233 -else -- ./compiler/lua54.can:233 -return "" -- ./compiler/lua54.can:236 -end -- ./compiler/lua54.can:236 -end -- ./compiler/lua54.can:236 -tags = setmetatable({ -- ./compiler/lua54.can:241 -["Block"] = function(t) -- ./compiler/lua54.can:243 -local hasPush = peek("push") == nil and any(t, { "Push" }, func) -- ./compiler/lua54.can:244 -if hasPush and hasPush == t[# t] then -- ./compiler/lua54.can:245 -hasPush["tag"] = "Return" -- ./compiler/lua54.can:246 -hasPush = false -- ./compiler/lua54.can:247 -end -- ./compiler/lua54.can:247 -local r = push("scope", {}) -- ./compiler/lua54.can:249 -if hasPush then -- ./compiler/lua54.can:250 -r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:251 -end -- ./compiler/lua54.can:251 -for i = 1, # t - 1, 1 do -- ./compiler/lua54.can:253 -r = r .. (lua(t[i]) .. newline()) -- ./compiler/lua54.can:254 -end -- ./compiler/lua54.can:254 -if t[# t] then -- ./compiler/lua54.can:256 -r = r .. (lua(t[# t])) -- ./compiler/lua54.can:257 -end -- ./compiler/lua54.can:257 -if hasPush and (t[# t] and t[# t]["tag"] ~= "Return") then -- ./compiler/lua54.can:259 -r = r .. (newline() .. "return " .. UNPACK(var("push")) .. pop("push")) -- ./compiler/lua54.can:260 -end -- ./compiler/lua54.can:260 -return r .. pop("scope") -- ./compiler/lua54.can:262 -end, -- ./compiler/lua54.can:262 -["Do"] = function(t) -- ./compiler/lua54.can:268 -return "do" .. indent() .. lua(t, "Block") .. unindent() .. "end" -- ./compiler/lua54.can:269 -end, -- ./compiler/lua54.can:269 -["Set"] = function(t) -- ./compiler/lua54.can:272 -local expr = t[# t] -- ./compiler/lua54.can:274 -local vars, values = {}, {} -- ./compiler/lua54.can:275 -local destructuringVars, destructuringValues = {}, {} -- ./compiler/lua54.can:276 -for i, n in ipairs(t[1]) do -- ./compiler/lua54.can:277 -if n["tag"] == "DestructuringId" then -- ./compiler/lua54.can:278 -table["insert"](destructuringVars, n) -- ./compiler/lua54.can:279 -table["insert"](destructuringValues, expr[i]) -- ./compiler/lua54.can:280 -else -- ./compiler/lua54.can:280 -table["insert"](vars, n) -- ./compiler/lua54.can:282 -table["insert"](values, expr[i]) -- ./compiler/lua54.can:283 -end -- ./compiler/lua54.can:283 -end -- ./compiler/lua54.can:283 -if # t == 2 or # t == 3 then -- ./compiler/lua54.can:287 -local r = "" -- ./compiler/lua54.can:288 -if # vars > 0 then -- ./compiler/lua54.can:289 -r = lua(vars, "_lhs") .. " = " .. lua(values, "_lhs") -- ./compiler/lua54.can:290 -end -- ./compiler/lua54.can:290 -if # destructuringVars > 0 then -- ./compiler/lua54.can:292 -local destructured = {} -- ./compiler/lua54.can:293 -r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:294 -return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:295 -end -- ./compiler/lua54.can:295 -return r -- ./compiler/lua54.can:297 -elseif # t == 4 then -- ./compiler/lua54.can:298 -if t[3] == "=" then -- ./compiler/lua54.can:299 -local r = "" -- ./compiler/lua54.can:300 -if # vars > 0 then -- ./compiler/lua54.can:301 -r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:302 -t[2], -- ./compiler/lua54.can:302 -vars[1], -- ./compiler/lua54.can:302 -{ -- ./compiler/lua54.can:302 -["tag"] = "Paren", -- ./compiler/lua54.can:302 -values[1] -- ./compiler/lua54.can:302 -} -- ./compiler/lua54.can:302 -}, "Op")) -- ./compiler/lua54.can:302 -for i = 2, math["min"](# t[4], # vars), 1 do -- ./compiler/lua54.can:303 -r = r .. (", " .. lua({ -- ./compiler/lua54.can:304 -t[2], -- ./compiler/lua54.can:304 -vars[i], -- ./compiler/lua54.can:304 -{ -- ./compiler/lua54.can:304 -["tag"] = "Paren", -- ./compiler/lua54.can:304 -values[i] -- ./compiler/lua54.can:304 -} -- ./compiler/lua54.can:304 -}, "Op")) -- ./compiler/lua54.can:304 -end -- ./compiler/lua54.can:304 -end -- ./compiler/lua54.can:304 -if # destructuringVars > 0 then -- ./compiler/lua54.can:307 -local destructured = { ["rightOp"] = t[2] } -- ./compiler/lua54.can:308 -r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:309 -return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:310 +else -- ./compiler/lua54.can:225 +return "" -- ./compiler/lua54.can:228 +end -- ./compiler/lua54.can:228 +end -- ./compiler/lua54.can:228 +tags = setmetatable({ -- ./compiler/lua54.can:233 +["Block"] = function(t) -- ./compiler/lua54.can:235 +local hasPush = peek("push") == nil and any(t, { "Push" }, func) -- ./compiler/lua54.can:236 +if hasPush and hasPush == t[# t] then -- ./compiler/lua54.can:237 +hasPush["tag"] = "Return" -- ./compiler/lua54.can:238 +hasPush = false -- ./compiler/lua54.can:239 +end -- ./compiler/lua54.can:239 +local r = push("scope", {}) -- ./compiler/lua54.can:241 +if hasPush then -- ./compiler/lua54.can:242 +r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:243 +end -- ./compiler/lua54.can:243 +for i = 1, # t - 1, 1 do -- ./compiler/lua54.can:245 +r = r .. (lua(t[i]) .. newline()) -- ./compiler/lua54.can:246 +end -- ./compiler/lua54.can:246 +if t[# t] then -- ./compiler/lua54.can:248 +r = r .. (lua(t[# t])) -- ./compiler/lua54.can:249 +end -- ./compiler/lua54.can:249 +if hasPush and (t[# t] and t[# t]["tag"] ~= "Return") then -- ./compiler/lua54.can:251 +r = r .. (newline() .. "return " .. UNPACK(var("push")) .. pop("push")) -- ./compiler/lua54.can:252 +end -- ./compiler/lua54.can:252 +return r .. pop("scope") -- ./compiler/lua54.can:254 +end, -- ./compiler/lua54.can:254 +["Do"] = function(t) -- ./compiler/lua54.can:260 +return "do" .. indent() .. lua(t, "Block") .. unindent() .. "end" -- ./compiler/lua54.can:261 +end, -- ./compiler/lua54.can:261 +["Set"] = function(t) -- ./compiler/lua54.can:264 +local expr = t[# t] -- ./compiler/lua54.can:266 +local vars, values = {}, {} -- ./compiler/lua54.can:267 +local destructuringVars, destructuringValues = {}, {} -- ./compiler/lua54.can:268 +for i, n in ipairs(t[1]) do -- ./compiler/lua54.can:269 +if n["tag"] == "DestructuringId" then -- ./compiler/lua54.can:270 +table["insert"](destructuringVars, n) -- ./compiler/lua54.can:271 +table["insert"](destructuringValues, expr[i]) -- ./compiler/lua54.can:272 +else -- ./compiler/lua54.can:272 +table["insert"](vars, n) -- ./compiler/lua54.can:274 +table["insert"](values, expr[i]) -- ./compiler/lua54.can:275 +end -- ./compiler/lua54.can:275 +end -- ./compiler/lua54.can:275 +if # t == 2 or # t == 3 then -- ./compiler/lua54.can:279 +local r = "" -- ./compiler/lua54.can:280 +if # vars > 0 then -- ./compiler/lua54.can:281 +r = lua(vars, "_lhs") .. " = " .. lua(values, "_lhs") -- ./compiler/lua54.can:282 +end -- ./compiler/lua54.can:282 +if # destructuringVars > 0 then -- ./compiler/lua54.can:284 +local destructured = {} -- ./compiler/lua54.can:285 +r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:286 +return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:287 +end -- ./compiler/lua54.can:287 +return r -- ./compiler/lua54.can:289 +elseif # t == 4 then -- ./compiler/lua54.can:290 +if t[3] == "=" then -- ./compiler/lua54.can:291 +local r = "" -- ./compiler/lua54.can:292 +if # vars > 0 then -- ./compiler/lua54.can:293 +r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:294 +t[2], -- ./compiler/lua54.can:294 +vars[1], -- ./compiler/lua54.can:294 +{ -- ./compiler/lua54.can:294 +["tag"] = "Paren", -- ./compiler/lua54.can:294 +values[1] -- ./compiler/lua54.can:294 +} -- ./compiler/lua54.can:294 +}, "Op")) -- ./compiler/lua54.can:294 +for i = 2, math["min"](# t[4], # vars), 1 do -- ./compiler/lua54.can:295 +r = r .. (", " .. lua({ -- ./compiler/lua54.can:296 +t[2], -- ./compiler/lua54.can:296 +vars[i], -- ./compiler/lua54.can:296 +{ -- ./compiler/lua54.can:296 +["tag"] = "Paren", -- ./compiler/lua54.can:296 +values[i] -- ./compiler/lua54.can:296 +} -- ./compiler/lua54.can:296 +}, "Op")) -- ./compiler/lua54.can:296 +end -- ./compiler/lua54.can:296 +end -- ./compiler/lua54.can:296 +if # destructuringVars > 0 then -- ./compiler/lua54.can:299 +local destructured = { ["rightOp"] = t[2] } -- ./compiler/lua54.can:300 +r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:301 +return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:302 +end -- ./compiler/lua54.can:302 +return r -- ./compiler/lua54.can:304 +else -- ./compiler/lua54.can:304 +local r = "" -- ./compiler/lua54.can:306 +if # vars > 0 then -- ./compiler/lua54.can:307 +r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:308 +t[3], -- ./compiler/lua54.can:308 +{ -- ./compiler/lua54.can:308 +["tag"] = "Paren", -- ./compiler/lua54.can:308 +values[1] -- ./compiler/lua54.can:308 +}, -- ./compiler/lua54.can:308 +vars[1] -- ./compiler/lua54.can:308 +}, "Op")) -- ./compiler/lua54.can:308 +for i = 2, math["min"](# t[4], # t[1]), 1 do -- ./compiler/lua54.can:309 +r = r .. (", " .. lua({ -- ./compiler/lua54.can:310 +t[3], -- ./compiler/lua54.can:310 +{ -- ./compiler/lua54.can:310 +["tag"] = "Paren", -- ./compiler/lua54.can:310 +values[i] -- ./compiler/lua54.can:310 +}, -- ./compiler/lua54.can:310 +vars[i] -- ./compiler/lua54.can:310 +}, "Op")) -- ./compiler/lua54.can:310 end -- ./compiler/lua54.can:310 -return r -- ./compiler/lua54.can:312 -else -- ./compiler/lua54.can:312 -local r = "" -- ./compiler/lua54.can:314 -if # vars > 0 then -- ./compiler/lua54.can:315 -r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:316 -t[3], -- ./compiler/lua54.can:316 -{ -- ./compiler/lua54.can:316 -["tag"] = "Paren", -- ./compiler/lua54.can:316 -values[1] -- ./compiler/lua54.can:316 -}, -- ./compiler/lua54.can:316 -vars[1] -- ./compiler/lua54.can:316 -}, "Op")) -- ./compiler/lua54.can:316 -for i = 2, math["min"](# t[4], # t[1]), 1 do -- ./compiler/lua54.can:317 -r = r .. (", " .. lua({ -- ./compiler/lua54.can:318 -t[3], -- ./compiler/lua54.can:318 -{ -- ./compiler/lua54.can:318 -["tag"] = "Paren", -- ./compiler/lua54.can:318 -values[i] -- ./compiler/lua54.can:318 -}, -- ./compiler/lua54.can:318 -vars[i] -- ./compiler/lua54.can:318 -}, "Op")) -- ./compiler/lua54.can:318 +end -- ./compiler/lua54.can:310 +if # destructuringVars > 0 then -- ./compiler/lua54.can:313 +local destructured = { ["leftOp"] = t[3] } -- ./compiler/lua54.can:314 +r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:315 +return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:316 +end -- ./compiler/lua54.can:316 +return r -- ./compiler/lua54.can:318 end -- ./compiler/lua54.can:318 -end -- ./compiler/lua54.can:318 -if # destructuringVars > 0 then -- ./compiler/lua54.can:321 -local destructured = { ["leftOp"] = t[3] } -- ./compiler/lua54.can:322 -r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:323 -return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:324 -end -- ./compiler/lua54.can:324 -return r -- ./compiler/lua54.can:326 -end -- ./compiler/lua54.can:326 -else -- ./compiler/lua54.can:326 -local r = "" -- ./compiler/lua54.can:329 -if # vars > 0 then -- ./compiler/lua54.can:330 -r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:331 -t[2], -- ./compiler/lua54.can:331 -vars[1], -- ./compiler/lua54.can:331 -{ -- ./compiler/lua54.can:331 -["tag"] = "Op", -- ./compiler/lua54.can:331 -t[4], -- ./compiler/lua54.can:331 -{ -- ./compiler/lua54.can:331 -["tag"] = "Paren", -- ./compiler/lua54.can:331 -values[1] -- ./compiler/lua54.can:331 -}, -- ./compiler/lua54.can:331 -vars[1] -- ./compiler/lua54.can:331 -} -- ./compiler/lua54.can:331 -}, "Op")) -- ./compiler/lua54.can:331 -for i = 2, math["min"](# t[5], # t[1]), 1 do -- ./compiler/lua54.can:332 -r = r .. (", " .. lua({ -- ./compiler/lua54.can:333 -t[2], -- ./compiler/lua54.can:333 -vars[i], -- ./compiler/lua54.can:333 -{ -- ./compiler/lua54.can:333 -["tag"] = "Op", -- ./compiler/lua54.can:333 -t[4], -- ./compiler/lua54.can:333 -{ -- ./compiler/lua54.can:333 -["tag"] = "Paren", -- ./compiler/lua54.can:333 -values[i] -- ./compiler/lua54.can:333 -}, -- ./compiler/lua54.can:333 -vars[i] -- ./compiler/lua54.can:333 -} -- ./compiler/lua54.can:333 -}, "Op")) -- ./compiler/lua54.can:333 +else -- ./compiler/lua54.can:318 +local r = "" -- ./compiler/lua54.can:321 +if # vars > 0 then -- ./compiler/lua54.can:322 +r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:323 +t[2], -- ./compiler/lua54.can:323 +vars[1], -- ./compiler/lua54.can:323 +{ -- ./compiler/lua54.can:323 +["tag"] = "Op", -- ./compiler/lua54.can:323 +t[4], -- ./compiler/lua54.can:323 +{ -- ./compiler/lua54.can:323 +["tag"] = "Paren", -- ./compiler/lua54.can:323 +values[1] -- ./compiler/lua54.can:323 +}, -- ./compiler/lua54.can:323 +vars[1] -- ./compiler/lua54.can:323 +} -- ./compiler/lua54.can:323 +}, "Op")) -- ./compiler/lua54.can:323 +for i = 2, math["min"](# t[5], # t[1]), 1 do -- ./compiler/lua54.can:324 +r = r .. (", " .. lua({ -- ./compiler/lua54.can:325 +t[2], -- ./compiler/lua54.can:325 +vars[i], -- ./compiler/lua54.can:325 +{ -- ./compiler/lua54.can:325 +["tag"] = "Op", -- ./compiler/lua54.can:325 +t[4], -- ./compiler/lua54.can:325 +{ -- ./compiler/lua54.can:325 +["tag"] = "Paren", -- ./compiler/lua54.can:325 +values[i] -- ./compiler/lua54.can:325 +}, -- ./compiler/lua54.can:325 +vars[i] -- ./compiler/lua54.can:325 +} -- ./compiler/lua54.can:325 +}, "Op")) -- ./compiler/lua54.can:325 +end -- ./compiler/lua54.can:325 +end -- ./compiler/lua54.can:325 +if # destructuringVars > 0 then -- ./compiler/lua54.can:328 +local destructured = { -- ./compiler/lua54.can:329 +["rightOp"] = t[2], -- ./compiler/lua54.can:329 +["leftOp"] = t[4] -- ./compiler/lua54.can:329 +} -- ./compiler/lua54.can:329 +r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:330 +return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:331 +end -- ./compiler/lua54.can:331 +return r -- ./compiler/lua54.can:333 end -- ./compiler/lua54.can:333 -end -- ./compiler/lua54.can:333 -if # destructuringVars > 0 then -- ./compiler/lua54.can:336 -local destructured = { -- ./compiler/lua54.can:337 -["rightOp"] = t[2], -- ./compiler/lua54.can:337 -["leftOp"] = t[4] -- ./compiler/lua54.can:337 -} -- ./compiler/lua54.can:337 -r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:338 -return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:339 -end -- ./compiler/lua54.can:339 -return r -- ./compiler/lua54.can:341 -end -- ./compiler/lua54.can:341 -end, -- ./compiler/lua54.can:341 -["While"] = function(t) -- ./compiler/lua54.can:345 -local r = "" -- ./compiler/lua54.can:346 -local hasContinue = any(t[2], { "Continue" }, loop) -- ./compiler/lua54.can:347 -local lets = search({ t[1] }, { "LetExpr" }) -- ./compiler/lua54.can:348 -if # lets > 0 then -- ./compiler/lua54.can:349 -r = r .. ("do" .. indent()) -- ./compiler/lua54.can:350 -for _, l in ipairs(lets) do -- ./compiler/lua54.can:351 -r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:352 +end, -- ./compiler/lua54.can:333 +["While"] = function(t) -- ./compiler/lua54.can:337 +local r = "" -- ./compiler/lua54.can:338 +local hasContinue = any(t[2], { "Continue" }, loop) -- ./compiler/lua54.can:339 +local lets = search({ t[1] }, { "LetExpr" }) -- ./compiler/lua54.can:340 +if # lets > 0 then -- ./compiler/lua54.can:341 +r = r .. ("do" .. indent()) -- ./compiler/lua54.can:342 +for _, l in ipairs(lets) do -- ./compiler/lua54.can:343 +r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:344 +end -- ./compiler/lua54.can:344 +end -- ./compiler/lua54.can:344 +r = r .. ("while " .. lua(t[1]) .. " do" .. indent()) -- ./compiler/lua54.can:347 +if # lets > 0 then -- ./compiler/lua54.can:348 +r = r .. ("do" .. indent()) -- ./compiler/lua54.can:349 +end -- ./compiler/lua54.can:349 +if hasContinue then -- ./compiler/lua54.can:351 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:352 end -- ./compiler/lua54.can:352 -end -- ./compiler/lua54.can:352 -r = r .. ("while " .. lua(t[1]) .. " do" .. indent()) -- ./compiler/lua54.can:355 -if # lets > 0 then -- ./compiler/lua54.can:356 -r = r .. ("do" .. indent()) -- ./compiler/lua54.can:357 -end -- ./compiler/lua54.can:357 -if hasContinue then -- ./compiler/lua54.can:359 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:360 -end -- ./compiler/lua54.can:360 -r = r .. (lua(t[2])) -- ./compiler/lua54.can:362 -if hasContinue then -- ./compiler/lua54.can:363 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:364 -end -- ./compiler/lua54.can:364 -r = r .. (unindent() .. "end") -- ./compiler/lua54.can:366 -if # lets > 0 then -- ./compiler/lua54.can:367 -for _, l in ipairs(lets) do -- ./compiler/lua54.can:368 -r = r .. (newline() .. lua(l, "Set")) -- ./compiler/lua54.can:369 -end -- ./compiler/lua54.can:369 -r = r .. (unindent() .. "end" .. unindent() .. "end") -- ./compiler/lua54.can:371 -end -- ./compiler/lua54.can:371 -return r -- ./compiler/lua54.can:373 -end, -- ./compiler/lua54.can:373 -["Repeat"] = function(t) -- ./compiler/lua54.can:376 -local hasContinue = any(t[1], { "Continue" }, loop) -- ./compiler/lua54.can:377 -local r = "repeat" .. indent() -- ./compiler/lua54.can:378 -if hasContinue then -- ./compiler/lua54.can:379 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:380 -end -- ./compiler/lua54.can:380 -r = r .. (lua(t[1])) -- ./compiler/lua54.can:382 -if hasContinue then -- ./compiler/lua54.can:383 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:384 -end -- ./compiler/lua54.can:384 -r = r .. (unindent() .. "until " .. lua(t[2])) -- ./compiler/lua54.can:386 -return r -- ./compiler/lua54.can:387 -end, -- ./compiler/lua54.can:387 -["If"] = function(t) -- ./compiler/lua54.can:390 -local r = "" -- ./compiler/lua54.can:391 -local toClose = 0 -- ./compiler/lua54.can:392 -local lets = search({ t[1] }, { "LetExpr" }) -- ./compiler/lua54.can:393 -if # lets > 0 then -- ./compiler/lua54.can:394 -r = r .. ("do" .. indent()) -- ./compiler/lua54.can:395 -toClose = toClose + (1) -- ./compiler/lua54.can:396 -for _, l in ipairs(lets) do -- ./compiler/lua54.can:397 -r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:398 -end -- ./compiler/lua54.can:398 -end -- ./compiler/lua54.can:398 -r = r .. ("if " .. lua(t[1]) .. " then" .. indent() .. lua(t[2]) .. unindent()) -- ./compiler/lua54.can:401 -for i = 3, # t - 1, 2 do -- ./compiler/lua54.can:402 -lets = search({ t[i] }, { "LetExpr" }) -- ./compiler/lua54.can:403 -if # lets > 0 then -- ./compiler/lua54.can:404 -r = r .. ("else" .. indent()) -- ./compiler/lua54.can:405 -toClose = toClose + (1) -- ./compiler/lua54.can:406 -for _, l in ipairs(lets) do -- ./compiler/lua54.can:407 -r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:408 +r = r .. (lua(t[2])) -- ./compiler/lua54.can:354 +if hasContinue then -- ./compiler/lua54.can:355 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:356 +end -- ./compiler/lua54.can:356 +r = r .. (unindent() .. "end") -- ./compiler/lua54.can:358 +if # lets > 0 then -- ./compiler/lua54.can:359 +for _, l in ipairs(lets) do -- ./compiler/lua54.can:360 +r = r .. (newline() .. lua(l, "Set")) -- ./compiler/lua54.can:361 +end -- ./compiler/lua54.can:361 +r = r .. (unindent() .. "end" .. unindent() .. "end") -- ./compiler/lua54.can:363 +end -- ./compiler/lua54.can:363 +return r -- ./compiler/lua54.can:365 +end, -- ./compiler/lua54.can:365 +["Repeat"] = function(t) -- ./compiler/lua54.can:368 +local hasContinue = any(t[1], { "Continue" }, loop) -- ./compiler/lua54.can:369 +local r = "repeat" .. indent() -- ./compiler/lua54.can:370 +if hasContinue then -- ./compiler/lua54.can:371 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:372 +end -- ./compiler/lua54.can:372 +r = r .. (lua(t[1])) -- ./compiler/lua54.can:374 +if hasContinue then -- ./compiler/lua54.can:375 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:376 +end -- ./compiler/lua54.can:376 +r = r .. (unindent() .. "until " .. lua(t[2])) -- ./compiler/lua54.can:378 +return r -- ./compiler/lua54.can:379 +end, -- ./compiler/lua54.can:379 +["If"] = function(t) -- ./compiler/lua54.can:382 +local r = "" -- ./compiler/lua54.can:383 +local toClose = 0 -- ./compiler/lua54.can:384 +local lets = search({ t[1] }, { "LetExpr" }) -- ./compiler/lua54.can:385 +if # lets > 0 then -- ./compiler/lua54.can:386 +r = r .. ("do" .. indent()) -- ./compiler/lua54.can:387 +toClose = toClose + (1) -- ./compiler/lua54.can:388 +for _, l in ipairs(lets) do -- ./compiler/lua54.can:389 +r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:390 +end -- ./compiler/lua54.can:390 +end -- ./compiler/lua54.can:390 +r = r .. ("if " .. lua(t[1]) .. " then" .. indent() .. lua(t[2]) .. unindent()) -- ./compiler/lua54.can:393 +for i = 3, # t - 1, 2 do -- ./compiler/lua54.can:394 +lets = search({ t[i] }, { "LetExpr" }) -- ./compiler/lua54.can:395 +if # lets > 0 then -- ./compiler/lua54.can:396 +r = r .. ("else" .. indent()) -- ./compiler/lua54.can:397 +toClose = toClose + (1) -- ./compiler/lua54.can:398 +for _, l in ipairs(lets) do -- ./compiler/lua54.can:399 +r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:400 +end -- ./compiler/lua54.can:400 +else -- ./compiler/lua54.can:400 +r = r .. ("else") -- ./compiler/lua54.can:403 +end -- ./compiler/lua54.can:403 +r = r .. ("if " .. lua(t[i]) .. " then" .. indent() .. lua(t[i + 1]) .. unindent()) -- ./compiler/lua54.can:405 +end -- ./compiler/lua54.can:405 +if # t % 2 == 1 then -- ./compiler/lua54.can:407 +r = r .. ("else" .. indent() .. lua(t[# t]) .. unindent()) -- ./compiler/lua54.can:408 end -- ./compiler/lua54.can:408 -else -- ./compiler/lua54.can:408 -r = r .. ("else") -- ./compiler/lua54.can:411 -end -- ./compiler/lua54.can:411 -r = r .. ("if " .. lua(t[i]) .. " then" .. indent() .. lua(t[i + 1]) .. unindent()) -- ./compiler/lua54.can:413 -end -- ./compiler/lua54.can:413 -if # t % 2 == 1 then -- ./compiler/lua54.can:415 -r = r .. ("else" .. indent() .. lua(t[# t]) .. unindent()) -- ./compiler/lua54.can:416 -end -- ./compiler/lua54.can:416 -r = r .. ("end") -- ./compiler/lua54.can:418 -for i = 1, toClose do -- ./compiler/lua54.can:419 -r = r .. (unindent() .. "end") -- ./compiler/lua54.can:420 -end -- ./compiler/lua54.can:420 -return r -- ./compiler/lua54.can:422 -end, -- ./compiler/lua54.can:422 -["Fornum"] = function(t) -- ./compiler/lua54.can:425 -local r = "for " .. lua(t[1]) .. " = " .. lua(t[2]) .. ", " .. lua(t[3]) -- ./compiler/lua54.can:426 -if # t == 5 then -- ./compiler/lua54.can:427 -local hasContinue = any(t[5], { "Continue" }, loop) -- ./compiler/lua54.can:428 -r = r .. (", " .. lua(t[4]) .. " do" .. indent()) -- ./compiler/lua54.can:429 -if hasContinue then -- ./compiler/lua54.can:430 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:431 -end -- ./compiler/lua54.can:431 -r = r .. (lua(t[5])) -- ./compiler/lua54.can:433 -if hasContinue then -- ./compiler/lua54.can:434 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:435 -end -- ./compiler/lua54.can:435 -return r .. unindent() .. "end" -- ./compiler/lua54.can:437 -else -- ./compiler/lua54.can:437 -local hasContinue = any(t[4], { "Continue" }, loop) -- ./compiler/lua54.can:439 -r = r .. (" do" .. indent()) -- ./compiler/lua54.can:440 -if hasContinue then -- ./compiler/lua54.can:441 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:442 -end -- ./compiler/lua54.can:442 -r = r .. (lua(t[4])) -- ./compiler/lua54.can:444 -if hasContinue then -- ./compiler/lua54.can:445 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:446 -end -- ./compiler/lua54.can:446 -return r .. unindent() .. "end" -- ./compiler/lua54.can:448 -end -- ./compiler/lua54.can:448 -end, -- ./compiler/lua54.can:448 -["Forin"] = function(t) -- ./compiler/lua54.can:452 -local destructured = {} -- ./compiler/lua54.can:453 -local hasContinue = any(t[3], { "Continue" }, loop) -- ./compiler/lua54.can:454 -local r = "for " .. push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") .. " in " .. lua(t[2], "_lhs") .. " do" .. indent() -- ./compiler/lua54.can:455 -if hasContinue then -- ./compiler/lua54.can:456 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:457 -end -- ./compiler/lua54.can:457 -r = r .. (DESTRUCTURING_ASSIGN(destructured, true) .. lua(t[3])) -- ./compiler/lua54.can:459 -if hasContinue then -- ./compiler/lua54.can:460 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:461 -end -- ./compiler/lua54.can:461 -return r .. unindent() .. "end" -- ./compiler/lua54.can:463 -end, -- ./compiler/lua54.can:463 -["Local"] = function(t) -- ./compiler/lua54.can:466 -local destructured = {} -- ./compiler/lua54.can:467 -local r = "local " .. push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") -- ./compiler/lua54.can:468 -if t[2][1] then -- ./compiler/lua54.can:469 -r = r .. (" = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:470 -end -- ./compiler/lua54.can:470 -return r .. DESTRUCTURING_ASSIGN(destructured) -- ./compiler/lua54.can:472 -end, -- ./compiler/lua54.can:472 -["Let"] = function(t) -- ./compiler/lua54.can:475 -local destructured = {} -- ./compiler/lua54.can:476 -local nameList = push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") -- ./compiler/lua54.can:477 -local r = "local " .. nameList -- ./compiler/lua54.can:478 -if t[2][1] then -- ./compiler/lua54.can:479 -if all(t[2], { -- ./compiler/lua54.can:480 -"Nil", -- ./compiler/lua54.can:480 -"Dots", -- ./compiler/lua54.can:480 -"Boolean", -- ./compiler/lua54.can:480 -"Number", -- ./compiler/lua54.can:480 -"String" -- ./compiler/lua54.can:480 -}) then -- ./compiler/lua54.can:480 -r = r .. (" = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:481 -else -- ./compiler/lua54.can:481 -r = r .. (newline() .. nameList .. " = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:483 -end -- ./compiler/lua54.can:483 -end -- ./compiler/lua54.can:483 -return r .. DESTRUCTURING_ASSIGN(destructured) -- ./compiler/lua54.can:486 +r = r .. ("end") -- ./compiler/lua54.can:410 +for i = 1, toClose do -- ./compiler/lua54.can:411 +r = r .. (unindent() .. "end") -- ./compiler/lua54.can:412 +end -- ./compiler/lua54.can:412 +return r -- ./compiler/lua54.can:414 +end, -- ./compiler/lua54.can:414 +["Fornum"] = function(t) -- ./compiler/lua54.can:417 +local r = "for " .. lua(t[1]) .. " = " .. lua(t[2]) .. ", " .. lua(t[3]) -- ./compiler/lua54.can:418 +if # t == 5 then -- ./compiler/lua54.can:419 +local hasContinue = any(t[5], { "Continue" }, loop) -- ./compiler/lua54.can:420 +r = r .. (", " .. lua(t[4]) .. " do" .. indent()) -- ./compiler/lua54.can:421 +if hasContinue then -- ./compiler/lua54.can:422 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:423 +end -- ./compiler/lua54.can:423 +r = r .. (lua(t[5])) -- ./compiler/lua54.can:425 +if hasContinue then -- ./compiler/lua54.can:426 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:427 +end -- ./compiler/lua54.can:427 +return r .. unindent() .. "end" -- ./compiler/lua54.can:429 +else -- ./compiler/lua54.can:429 +local hasContinue = any(t[4], { "Continue" }, loop) -- ./compiler/lua54.can:431 +r = r .. (" do" .. indent()) -- ./compiler/lua54.can:432 +if hasContinue then -- ./compiler/lua54.can:433 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:434 +end -- ./compiler/lua54.can:434 +r = r .. (lua(t[4])) -- ./compiler/lua54.can:436 +if hasContinue then -- ./compiler/lua54.can:437 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:438 +end -- ./compiler/lua54.can:438 +return r .. unindent() .. "end" -- ./compiler/lua54.can:440 +end -- ./compiler/lua54.can:440 +end, -- ./compiler/lua54.can:440 +["Forin"] = function(t) -- ./compiler/lua54.can:444 +local destructured = {} -- ./compiler/lua54.can:445 +local hasContinue = any(t[3], { "Continue" }, loop) -- ./compiler/lua54.can:446 +local r = "for " .. push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") .. " in " .. lua(t[2], "_lhs") .. " do" .. indent() -- ./compiler/lua54.can:447 +if hasContinue then -- ./compiler/lua54.can:448 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:449 +end -- ./compiler/lua54.can:449 +r = r .. (DESTRUCTURING_ASSIGN(destructured, true) .. lua(t[3])) -- ./compiler/lua54.can:451 +if hasContinue then -- ./compiler/lua54.can:452 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:453 +end -- ./compiler/lua54.can:453 +return r .. unindent() .. "end" -- ./compiler/lua54.can:455 +end, -- ./compiler/lua54.can:455 +["Local"] = function(t) -- ./compiler/lua54.can:458 +local destructured = {} -- ./compiler/lua54.can:459 +local r = "local " .. push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") -- ./compiler/lua54.can:460 +if t[2][1] then -- ./compiler/lua54.can:461 +r = r .. (" = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:462 +end -- ./compiler/lua54.can:462 +return r .. DESTRUCTURING_ASSIGN(destructured) -- ./compiler/lua54.can:464 +end, -- ./compiler/lua54.can:464 +["Let"] = function(t) -- ./compiler/lua54.can:467 +local destructured = {} -- ./compiler/lua54.can:468 +local nameList = push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") -- ./compiler/lua54.can:469 +local r = "local " .. nameList -- ./compiler/lua54.can:470 +if t[2][1] then -- ./compiler/lua54.can:471 +if all(t[2], { -- ./compiler/lua54.can:472 +"Nil", -- ./compiler/lua54.can:472 +"Dots", -- ./compiler/lua54.can:472 +"Boolean", -- ./compiler/lua54.can:472 +"Number", -- ./compiler/lua54.can:472 +"String" -- ./compiler/lua54.can:472 +}) then -- ./compiler/lua54.can:472 +r = r .. (" = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:473 +else -- ./compiler/lua54.can:473 +r = r .. (newline() .. nameList .. " = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:475 +end -- ./compiler/lua54.can:475 +end -- ./compiler/lua54.can:475 +return r .. DESTRUCTURING_ASSIGN(destructured) -- ./compiler/lua54.can:478 +end, -- ./compiler/lua54.can:478 +["Localrec"] = function(t) -- ./compiler/lua54.can:481 +return "local function " .. lua(t[1][1]) .. lua(t[2][1], "_functionWithoutKeyword") -- ./compiler/lua54.can:482 +end, -- ./compiler/lua54.can:482 +["Goto"] = function(t) -- ./compiler/lua54.can:485 +return "goto " .. lua(t, "Id") -- ./compiler/lua54.can:486 end, -- ./compiler/lua54.can:486 -["Localrec"] = function(t) -- ./compiler/lua54.can:489 -return "local function " .. lua(t[1][1]) .. lua(t[2][1], "_functionWithoutKeyword") -- ./compiler/lua54.can:490 +["Label"] = function(t) -- ./compiler/lua54.can:489 +return "::" .. lua(t, "Id") .. "::" -- ./compiler/lua54.can:490 end, -- ./compiler/lua54.can:490 -["Goto"] = function(t) -- ./compiler/lua54.can:493 -return "goto " .. lua(t, "Id") -- ./compiler/lua54.can:494 -end, -- ./compiler/lua54.can:494 -["Label"] = function(t) -- ./compiler/lua54.can:497 -return "::" .. lua(t, "Id") .. "::" -- ./compiler/lua54.can:498 -end, -- ./compiler/lua54.can:498 -["Return"] = function(t) -- ./compiler/lua54.can:501 -local push = peek("push") -- ./compiler/lua54.can:502 -if push then -- ./compiler/lua54.can:503 -local r = "" -- ./compiler/lua54.can:504 -for _, val in ipairs(t) do -- ./compiler/lua54.can:505 -r = r .. (push .. "[#" .. push .. "+1] = " .. lua(val) .. newline()) -- ./compiler/lua54.can:506 -end -- ./compiler/lua54.can:506 -return r .. "return " .. UNPACK(push) -- ./compiler/lua54.can:508 -else -- ./compiler/lua54.can:508 -return "return " .. lua(t, "_lhs") -- ./compiler/lua54.can:510 +["Return"] = function(t) -- ./compiler/lua54.can:493 +local push = peek("push") -- ./compiler/lua54.can:494 +if push then -- ./compiler/lua54.can:495 +local r = "" -- ./compiler/lua54.can:496 +for _, val in ipairs(t) do -- ./compiler/lua54.can:497 +r = r .. (push .. "[#" .. push .. "+1] = " .. lua(val) .. newline()) -- ./compiler/lua54.can:498 +end -- ./compiler/lua54.can:498 +return r .. "return " .. UNPACK(push) -- ./compiler/lua54.can:500 +else -- ./compiler/lua54.can:500 +return "return " .. lua(t, "_lhs") -- ./compiler/lua54.can:502 +end -- ./compiler/lua54.can:502 +end, -- ./compiler/lua54.can:502 +["Push"] = function(t) -- ./compiler/lua54.can:506 +local var = assert(peek("push"), "no context given for push") -- ./compiler/lua54.can:507 +r = "" -- ./compiler/lua54.can:508 +for i = 1, # t - 1, 1 do -- ./compiler/lua54.can:509 +r = r .. (var .. "[#" .. var .. "+1] = " .. lua(t[i]) .. newline()) -- ./compiler/lua54.can:510 end -- ./compiler/lua54.can:510 -end, -- ./compiler/lua54.can:510 -["Push"] = function(t) -- ./compiler/lua54.can:514 -local var = assert(peek("push"), "no context given for push") -- ./compiler/lua54.can:515 -r = "" -- ./compiler/lua54.can:516 -for i = 1, # t - 1, 1 do -- ./compiler/lua54.can:517 -r = r .. (var .. "[#" .. var .. "+1] = " .. lua(t[i]) .. newline()) -- ./compiler/lua54.can:518 -end -- ./compiler/lua54.can:518 -if t[# t] then -- ./compiler/lua54.can:520 -if t[# t]["tag"] == "Call" then -- ./compiler/lua54.can:521 -r = r .. (APPEND(var, lua(t[# t]))) -- ./compiler/lua54.can:522 -else -- ./compiler/lua54.can:522 -r = r .. (var .. "[#" .. var .. "+1] = " .. lua(t[# t])) -- ./compiler/lua54.can:524 -end -- ./compiler/lua54.can:524 -end -- ./compiler/lua54.can:524 -return r -- ./compiler/lua54.can:527 +if t[# t] then -- ./compiler/lua54.can:512 +if t[# t]["tag"] == "Call" then -- ./compiler/lua54.can:513 +r = r .. (APPEND(var, lua(t[# t]))) -- ./compiler/lua54.can:514 +else -- ./compiler/lua54.can:514 +r = r .. (var .. "[#" .. var .. "+1] = " .. lua(t[# t])) -- ./compiler/lua54.can:516 +end -- ./compiler/lua54.can:516 +end -- ./compiler/lua54.can:516 +return r -- ./compiler/lua54.can:519 +end, -- ./compiler/lua54.can:519 +["Break"] = function() -- ./compiler/lua54.can:522 +return "break" -- ./compiler/lua54.can:523 +end, -- ./compiler/lua54.can:523 +["Continue"] = function() -- ./compiler/lua54.can:526 +return "goto " .. var("continue") -- ./compiler/lua54.can:527 end, -- ./compiler/lua54.can:527 -["Break"] = function() -- ./compiler/lua54.can:530 -return "break" -- ./compiler/lua54.can:531 -end, -- ./compiler/lua54.can:531 -["Continue"] = function() -- ./compiler/lua54.can:534 -return "goto " .. var("continue") -- ./compiler/lua54.can:535 +["Nil"] = function() -- ./compiler/lua54.can:534 +return "nil" -- ./compiler/lua54.can:535 end, -- ./compiler/lua54.can:535 -["Nil"] = function() -- ./compiler/lua54.can:542 -return "nil" -- ./compiler/lua54.can:543 +["Dots"] = function() -- ./compiler/lua54.can:538 +return "..." -- ./compiler/lua54.can:539 +end, -- ./compiler/lua54.can:539 +["Boolean"] = function(t) -- ./compiler/lua54.can:542 +return tostring(t[1]) -- ./compiler/lua54.can:543 end, -- ./compiler/lua54.can:543 -["Dots"] = function() -- ./compiler/lua54.can:546 -local macroargs = peek("macroargs") -- ./compiler/lua54.can:547 -if macroargs and not nomacro["variables"]["..."] and macroargs["..."] then -- ./compiler/lua54.can:548 -nomacro["variables"]["..."] = true -- ./compiler/lua54.can:549 -local r = lua(macroargs["..."], "_lhs") -- ./compiler/lua54.can:550 -nomacro["variables"]["..."] = nil -- ./compiler/lua54.can:551 -return r -- ./compiler/lua54.can:552 -else -- ./compiler/lua54.can:552 -return "..." -- ./compiler/lua54.can:554 -end -- ./compiler/lua54.can:554 -end, -- ./compiler/lua54.can:554 -["Boolean"] = function(t) -- ./compiler/lua54.can:558 -return tostring(t[1]) -- ./compiler/lua54.can:559 -end, -- ./compiler/lua54.can:559 -["Number"] = function(t) -- ./compiler/lua54.can:562 -return tostring(t[1]) -- ./compiler/lua54.can:563 -end, -- ./compiler/lua54.can:563 -["String"] = function(t) -- ./compiler/lua54.can:566 -return ("%q"):format(t[1]) -- ./compiler/lua54.can:567 -end, -- ./compiler/lua54.can:567 -["_functionWithoutKeyword"] = function(t) -- ./compiler/lua54.can:570 -local r = "(" -- ./compiler/lua54.can:571 -local decl = {} -- ./compiler/lua54.can:572 -if t[1][1] then -- ./compiler/lua54.can:573 -if t[1][1]["tag"] == "ParPair" then -- ./compiler/lua54.can:574 -local id = lua(t[1][1][1]) -- ./compiler/lua54.can:575 -indentLevel = indentLevel + (1) -- ./compiler/lua54.can:576 -table["insert"](decl, "if " .. id .. " == nil then " .. id .. " = " .. lua(t[1][1][2]) .. " end") -- ./compiler/lua54.can:577 -indentLevel = indentLevel - (1) -- ./compiler/lua54.can:578 -r = r .. (id) -- ./compiler/lua54.can:579 -else -- ./compiler/lua54.can:579 -r = r .. (lua(t[1][1])) -- ./compiler/lua54.can:581 +["Number"] = function(t) -- ./compiler/lua54.can:546 +return tostring(t[1]) -- ./compiler/lua54.can:547 +end, -- ./compiler/lua54.can:547 +["String"] = function(t) -- ./compiler/lua54.can:550 +return ("%q"):format(t[1]) -- ./compiler/lua54.can:551 +end, -- ./compiler/lua54.can:551 +["_functionWithoutKeyword"] = function(t) -- ./compiler/lua54.can:554 +local r = "(" -- ./compiler/lua54.can:555 +local decl = {} -- ./compiler/lua54.can:556 +if t[1][1] then -- ./compiler/lua54.can:557 +if t[1][1]["tag"] == "ParPair" then -- ./compiler/lua54.can:558 +local id = lua(t[1][1][1]) -- ./compiler/lua54.can:559 +indentLevel = indentLevel + (1) -- ./compiler/lua54.can:560 +table["insert"](decl, "if " .. id .. " == nil then " .. id .. " = " .. lua(t[1][1][2]) .. " end") -- ./compiler/lua54.can:561 +indentLevel = indentLevel - (1) -- ./compiler/lua54.can:562 +r = r .. (id) -- ./compiler/lua54.can:563 +else -- ./compiler/lua54.can:563 +r = r .. (lua(t[1][1])) -- ./compiler/lua54.can:565 +end -- ./compiler/lua54.can:565 +for i = 2, # t[1], 1 do -- ./compiler/lua54.can:567 +if t[1][i]["tag"] == "ParPair" then -- ./compiler/lua54.can:568 +local id = lua(t[1][i][1]) -- ./compiler/lua54.can:569 +indentLevel = indentLevel + (1) -- ./compiler/lua54.can:570 +table["insert"](decl, "if " .. id .. " == nil then " .. id .. " = " .. lua(t[1][i][2]) .. " end") -- ./compiler/lua54.can:571 +indentLevel = indentLevel - (1) -- ./compiler/lua54.can:572 +r = r .. (", " .. id) -- ./compiler/lua54.can:573 +else -- ./compiler/lua54.can:573 +r = r .. (", " .. lua(t[1][i])) -- ./compiler/lua54.can:575 +end -- ./compiler/lua54.can:575 +end -- ./compiler/lua54.can:575 +end -- ./compiler/lua54.can:575 +r = r .. (")" .. indent()) -- ./compiler/lua54.can:579 +for _, d in ipairs(decl) do -- ./compiler/lua54.can:580 +r = r .. (d .. newline()) -- ./compiler/lua54.can:581 end -- ./compiler/lua54.can:581 -for i = 2, # t[1], 1 do -- ./compiler/lua54.can:583 -if t[1][i]["tag"] == "ParPair" then -- ./compiler/lua54.can:584 -local id = lua(t[1][i][1]) -- ./compiler/lua54.can:585 -indentLevel = indentLevel + (1) -- ./compiler/lua54.can:586 -table["insert"](decl, "if " .. id .. " == nil then " .. id .. " = " .. lua(t[1][i][2]) .. " end") -- ./compiler/lua54.can:587 -indentLevel = indentLevel - (1) -- ./compiler/lua54.can:588 -r = r .. (", " .. id) -- ./compiler/lua54.can:589 -else -- ./compiler/lua54.can:589 -r = r .. (", " .. lua(t[1][i])) -- ./compiler/lua54.can:591 -end -- ./compiler/lua54.can:591 -end -- ./compiler/lua54.can:591 -end -- ./compiler/lua54.can:591 -r = r .. (")" .. indent()) -- ./compiler/lua54.can:595 -for _, d in ipairs(decl) do -- ./compiler/lua54.can:596 -r = r .. (d .. newline()) -- ./compiler/lua54.can:597 -end -- ./compiler/lua54.can:597 -if t[2][# t[2]] and t[2][# t[2]]["tag"] == "Push" then -- ./compiler/lua54.can:599 -t[2][# t[2]]["tag"] = "Return" -- ./compiler/lua54.can:600 -end -- ./compiler/lua54.can:600 -local hasPush = any(t[2], { "Push" }, func) -- ./compiler/lua54.can:602 -if hasPush then -- ./compiler/lua54.can:603 -r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:604 -else -- ./compiler/lua54.can:604 -push("push", false) -- ./compiler/lua54.can:606 -end -- ./compiler/lua54.can:606 -r = r .. (lua(t[2])) -- ./compiler/lua54.can:608 -if hasPush and (t[2][# t[2]] and t[2][# t[2]]["tag"] ~= "Return") then -- ./compiler/lua54.can:609 -r = r .. (newline() .. "return " .. UNPACK(var("push"))) -- ./compiler/lua54.can:610 -end -- ./compiler/lua54.can:610 -pop("push") -- ./compiler/lua54.can:612 -return r .. unindent() .. "end" -- ./compiler/lua54.can:613 -end, -- ./compiler/lua54.can:613 -["Function"] = function(t) -- ./compiler/lua54.can:615 -return "function" .. lua(t, "_functionWithoutKeyword") -- ./compiler/lua54.can:616 -end, -- ./compiler/lua54.can:616 -["Pair"] = function(t) -- ./compiler/lua54.can:619 -return "[" .. lua(t[1]) .. "] = " .. lua(t[2]) -- ./compiler/lua54.can:620 -end, -- ./compiler/lua54.can:620 -["Table"] = function(t) -- ./compiler/lua54.can:622 -if # t == 0 then -- ./compiler/lua54.can:623 -return "{}" -- ./compiler/lua54.can:624 -elseif # t == 1 then -- ./compiler/lua54.can:625 -return "{ " .. lua(t, "_lhs") .. " }" -- ./compiler/lua54.can:626 +if t[2][# t[2]] and t[2][# t[2]]["tag"] == "Push" then -- ./compiler/lua54.can:583 +t[2][# t[2]]["tag"] = "Return" -- ./compiler/lua54.can:584 +end -- ./compiler/lua54.can:584 +local hasPush = any(t[2], { "Push" }, func) -- ./compiler/lua54.can:586 +if hasPush then -- ./compiler/lua54.can:587 +r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:588 +else -- ./compiler/lua54.can:588 +push("push", false) -- ./compiler/lua54.can:590 +end -- ./compiler/lua54.can:590 +r = r .. (lua(t[2])) -- ./compiler/lua54.can:592 +if hasPush and (t[2][# t[2]] and t[2][# t[2]]["tag"] ~= "Return") then -- ./compiler/lua54.can:593 +r = r .. (newline() .. "return " .. UNPACK(var("push"))) -- ./compiler/lua54.can:594 +end -- ./compiler/lua54.can:594 +pop("push") -- ./compiler/lua54.can:596 +return r .. unindent() .. "end" -- ./compiler/lua54.can:597 +end, -- ./compiler/lua54.can:597 +["Function"] = function(t) -- ./compiler/lua54.can:599 +return "function" .. lua(t, "_functionWithoutKeyword") -- ./compiler/lua54.can:600 +end, -- ./compiler/lua54.can:600 +["Pair"] = function(t) -- ./compiler/lua54.can:603 +return "[" .. lua(t[1]) .. "] = " .. lua(t[2]) -- ./compiler/lua54.can:604 +end, -- ./compiler/lua54.can:604 +["Table"] = function(t) -- ./compiler/lua54.can:606 +if # t == 0 then -- ./compiler/lua54.can:607 +return "{}" -- ./compiler/lua54.can:608 +elseif # t == 1 then -- ./compiler/lua54.can:609 +return "{ " .. lua(t, "_lhs") .. " }" -- ./compiler/lua54.can:610 +else -- ./compiler/lua54.can:610 +return "{" .. indent() .. lua(t, "_lhs", nil, true) .. unindent() .. "}" -- ./compiler/lua54.can:612 +end -- ./compiler/lua54.can:612 +end, -- ./compiler/lua54.can:612 +["TableCompr"] = function(t) -- ./compiler/lua54.can:616 +return push("push", "self") .. "(function()" .. indent() .. "local self = {}" .. newline() .. lua(t[1]) .. newline() .. "return self" .. unindent() .. "end)()" .. pop("push") -- ./compiler/lua54.can:617 +end, -- ./compiler/lua54.can:617 +["Op"] = function(t) -- ./compiler/lua54.can:620 +local r -- ./compiler/lua54.can:621 +if # t == 2 then -- ./compiler/lua54.can:622 +if type(tags["_opid"][t[1]]) == "string" then -- ./compiler/lua54.can:623 +r = tags["_opid"][t[1]] .. " " .. lua(t[2]) -- ./compiler/lua54.can:624 +else -- ./compiler/lua54.can:624 +r = tags["_opid"][t[1]](t[2]) -- ./compiler/lua54.can:626 +end -- ./compiler/lua54.can:626 else -- ./compiler/lua54.can:626 -return "{" .. indent() .. lua(t, "_lhs", nil, true) .. unindent() .. "}" -- ./compiler/lua54.can:628 -end -- ./compiler/lua54.can:628 -end, -- ./compiler/lua54.can:628 -["TableCompr"] = function(t) -- ./compiler/lua54.can:632 -return push("push", "self") .. "(function()" .. indent() .. "local self = {}" .. newline() .. lua(t[1]) .. newline() .. "return self" .. unindent() .. "end)()" .. pop("push") -- ./compiler/lua54.can:633 -end, -- ./compiler/lua54.can:633 -["Op"] = function(t) -- ./compiler/lua54.can:636 -local r -- ./compiler/lua54.can:637 -if # t == 2 then -- ./compiler/lua54.can:638 -if type(tags["_opid"][t[1]]) == "string" then -- ./compiler/lua54.can:639 -r = tags["_opid"][t[1]] .. " " .. lua(t[2]) -- ./compiler/lua54.can:640 -else -- ./compiler/lua54.can:640 -r = tags["_opid"][t[1]](t[2]) -- ./compiler/lua54.can:642 -end -- ./compiler/lua54.can:642 -else -- ./compiler/lua54.can:642 -if type(tags["_opid"][t[1]]) == "string" then -- ./compiler/lua54.can:645 -r = lua(t[2]) .. " " .. tags["_opid"][t[1]] .. " " .. lua(t[3]) -- ./compiler/lua54.can:646 -else -- ./compiler/lua54.can:646 -r = tags["_opid"][t[1]](t[2], t[3]) -- ./compiler/lua54.can:648 -end -- ./compiler/lua54.can:648 -end -- ./compiler/lua54.can:648 -return r -- ./compiler/lua54.can:651 -end, -- ./compiler/lua54.can:651 -["Paren"] = function(t) -- ./compiler/lua54.can:654 -return "(" .. lua(t[1]) .. ")" -- ./compiler/lua54.can:655 -end, -- ./compiler/lua54.can:655 -["MethodStub"] = function(t) -- ./compiler/lua54.can:658 -return "(function()" .. indent() .. "local " .. var("object") .. " = " .. lua(t[1]) .. newline() .. "local " .. var("method") .. " = " .. var("object") .. "." .. lua(t[2], "Id") .. newline() .. "if " .. var("method") .. " == nil then return nil end" .. newline() .. "return function(...) return " .. var("method") .. "(" .. var("object") .. ", ...) end" .. unindent() .. "end)()" -- ./compiler/lua54.can:664 -end, -- ./compiler/lua54.can:664 -["SafeMethodStub"] = function(t) -- ./compiler/lua54.can:667 -return "(function()" .. indent() .. "local " .. var("object") .. " = " .. lua(t[1]) .. newline() .. "if " .. var("object") .. " == nil then return nil end" .. newline() .. "local " .. var("method") .. " = " .. var("object") .. "." .. lua(t[2], "Id") .. newline() .. "if " .. var("method") .. " == nil then return nil end" .. newline() .. "return function(...) return " .. var("method") .. "(" .. var("object") .. ", ...) end" .. unindent() .. "end)()" -- ./compiler/lua54.can:674 -end, -- ./compiler/lua54.can:674 -["LetExpr"] = function(t) -- ./compiler/lua54.can:681 -return lua(t[1][1]) -- ./compiler/lua54.can:682 -end, -- ./compiler/lua54.can:682 -["_statexpr"] = function(t, stat) -- ./compiler/lua54.can:686 -local hasPush = any(t, { "Push" }, func) -- ./compiler/lua54.can:687 -local r = "(function()" .. indent() -- ./compiler/lua54.can:688 -if hasPush then -- ./compiler/lua54.can:689 -r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:690 -else -- ./compiler/lua54.can:690 -push("push", false) -- ./compiler/lua54.can:692 -end -- ./compiler/lua54.can:692 -r = r .. (lua(t, stat)) -- ./compiler/lua54.can:694 -if hasPush then -- ./compiler/lua54.can:695 -r = r .. (newline() .. "return " .. UNPACK(var("push"))) -- ./compiler/lua54.can:696 -end -- ./compiler/lua54.can:696 -pop("push") -- ./compiler/lua54.can:698 -r = r .. (unindent() .. "end)()") -- ./compiler/lua54.can:699 -return r -- ./compiler/lua54.can:700 -end, -- ./compiler/lua54.can:700 -["DoExpr"] = function(t) -- ./compiler/lua54.can:703 -if t[# t]["tag"] == "Push" then -- ./compiler/lua54.can:704 -t[# t]["tag"] = "Return" -- ./compiler/lua54.can:705 -end -- ./compiler/lua54.can:705 -return lua(t, "_statexpr", "Do") -- ./compiler/lua54.can:707 -end, -- ./compiler/lua54.can:707 -["WhileExpr"] = function(t) -- ./compiler/lua54.can:710 -return lua(t, "_statexpr", "While") -- ./compiler/lua54.can:711 -end, -- ./compiler/lua54.can:711 -["RepeatExpr"] = function(t) -- ./compiler/lua54.can:714 -return lua(t, "_statexpr", "Repeat") -- ./compiler/lua54.can:715 -end, -- ./compiler/lua54.can:715 -["IfExpr"] = function(t) -- ./compiler/lua54.can:718 -for i = 2, # t do -- ./compiler/lua54.can:719 -local block = t[i] -- ./compiler/lua54.can:720 -if block[# block] and block[# block]["tag"] == "Push" then -- ./compiler/lua54.can:721 -block[# block]["tag"] = "Return" -- ./compiler/lua54.can:722 -end -- ./compiler/lua54.can:722 -end -- ./compiler/lua54.can:722 -return lua(t, "_statexpr", "If") -- ./compiler/lua54.can:725 -end, -- ./compiler/lua54.can:725 -["FornumExpr"] = function(t) -- ./compiler/lua54.can:728 -return lua(t, "_statexpr", "Fornum") -- ./compiler/lua54.can:729 -end, -- ./compiler/lua54.can:729 -["ForinExpr"] = function(t) -- ./compiler/lua54.can:732 -return lua(t, "_statexpr", "Forin") -- ./compiler/lua54.can:733 +if type(tags["_opid"][t[1]]) == "string" then -- ./compiler/lua54.can:629 +r = lua(t[2]) .. " " .. tags["_opid"][t[1]] .. " " .. lua(t[3]) -- ./compiler/lua54.can:630 +else -- ./compiler/lua54.can:630 +r = tags["_opid"][t[1]](t[2], t[3]) -- ./compiler/lua54.can:632 +end -- ./compiler/lua54.can:632 +end -- ./compiler/lua54.can:632 +return r -- ./compiler/lua54.can:635 +end, -- ./compiler/lua54.can:635 +["Paren"] = function(t) -- ./compiler/lua54.can:638 +return "(" .. lua(t[1]) .. ")" -- ./compiler/lua54.can:639 +end, -- ./compiler/lua54.can:639 +["MethodStub"] = function(t) -- ./compiler/lua54.can:642 +return "(function()" .. indent() .. "local " .. var("object") .. " = " .. lua(t[1]) .. newline() .. "local " .. var("method") .. " = " .. var("object") .. "." .. lua(t[2], "Id") .. newline() .. "if " .. var("method") .. " == nil then return nil end" .. newline() .. "return function(...) return " .. var("method") .. "(" .. var("object") .. ", ...) end" .. unindent() .. "end)()" -- ./compiler/lua54.can:648 +end, -- ./compiler/lua54.can:648 +["SafeMethodStub"] = function(t) -- ./compiler/lua54.can:651 +return "(function()" .. indent() .. "local " .. var("object") .. " = " .. lua(t[1]) .. newline() .. "if " .. var("object") .. " == nil then return nil end" .. newline() .. "local " .. var("method") .. " = " .. var("object") .. "." .. lua(t[2], "Id") .. newline() .. "if " .. var("method") .. " == nil then return nil end" .. newline() .. "return function(...) return " .. var("method") .. "(" .. var("object") .. ", ...) end" .. unindent() .. "end)()" -- ./compiler/lua54.can:658 +end, -- ./compiler/lua54.can:658 +["LetExpr"] = function(t) -- ./compiler/lua54.can:665 +return lua(t[1][1]) -- ./compiler/lua54.can:666 +end, -- ./compiler/lua54.can:666 +["_statexpr"] = function(t, stat) -- ./compiler/lua54.can:670 +local hasPush = any(t, { "Push" }, func) -- ./compiler/lua54.can:671 +local r = "(function()" .. indent() -- ./compiler/lua54.can:672 +if hasPush then -- ./compiler/lua54.can:673 +r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:674 +else -- ./compiler/lua54.can:674 +push("push", false) -- ./compiler/lua54.can:676 +end -- ./compiler/lua54.can:676 +r = r .. (lua(t, stat)) -- ./compiler/lua54.can:678 +if hasPush then -- ./compiler/lua54.can:679 +r = r .. (newline() .. "return " .. UNPACK(var("push"))) -- ./compiler/lua54.can:680 +end -- ./compiler/lua54.can:680 +pop("push") -- ./compiler/lua54.can:682 +r = r .. (unindent() .. "end)()") -- ./compiler/lua54.can:683 +return r -- ./compiler/lua54.can:684 +end, -- ./compiler/lua54.can:684 +["DoExpr"] = function(t) -- ./compiler/lua54.can:687 +if t[# t]["tag"] == "Push" then -- ./compiler/lua54.can:688 +t[# t]["tag"] = "Return" -- ./compiler/lua54.can:689 +end -- ./compiler/lua54.can:689 +return lua(t, "_statexpr", "Do") -- ./compiler/lua54.can:691 +end, -- ./compiler/lua54.can:691 +["WhileExpr"] = function(t) -- ./compiler/lua54.can:694 +return lua(t, "_statexpr", "While") -- ./compiler/lua54.can:695 +end, -- ./compiler/lua54.can:695 +["RepeatExpr"] = function(t) -- ./compiler/lua54.can:698 +return lua(t, "_statexpr", "Repeat") -- ./compiler/lua54.can:699 +end, -- ./compiler/lua54.can:699 +["IfExpr"] = function(t) -- ./compiler/lua54.can:702 +for i = 2, # t do -- ./compiler/lua54.can:703 +local block = t[i] -- ./compiler/lua54.can:704 +if block[# block] and block[# block]["tag"] == "Push" then -- ./compiler/lua54.can:705 +block[# block]["tag"] = "Return" -- ./compiler/lua54.can:706 +end -- ./compiler/lua54.can:706 +end -- ./compiler/lua54.can:706 +return lua(t, "_statexpr", "If") -- ./compiler/lua54.can:709 +end, -- ./compiler/lua54.can:709 +["FornumExpr"] = function(t) -- ./compiler/lua54.can:712 +return lua(t, "_statexpr", "Fornum") -- ./compiler/lua54.can:713 +end, -- ./compiler/lua54.can:713 +["ForinExpr"] = function(t) -- ./compiler/lua54.can:716 +return lua(t, "_statexpr", "Forin") -- ./compiler/lua54.can:717 +end, -- ./compiler/lua54.can:717 +["Call"] = function(t) -- ./compiler/lua54.can:723 +if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua54.can:724 +return "(" .. lua(t[1]) .. ")(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:725 +elseif t[1]["tag"] == "MethodStub" then -- ./compiler/lua54.can:726 +if t[1][1]["tag"] == "String" or t[1][1]["tag"] == "Table" then -- ./compiler/lua54.can:727 +return "(" .. lua(t[1][1]) .. "):" .. lua(t[1][2], "Id") .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:728 +else -- ./compiler/lua54.can:728 +return lua(t[1][1]) .. ":" .. lua(t[1][2], "Id") .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:730 +end -- ./compiler/lua54.can:730 +else -- ./compiler/lua54.can:730 +return lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:733 +end -- ./compiler/lua54.can:733 end, -- ./compiler/lua54.can:733 -["Call"] = function(t) -- ./compiler/lua54.can:739 -if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua54.can:740 -return "(" .. lua(t[1]) .. ")(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:741 -elseif t[1]["tag"] == "Id" and not nomacro["functions"][t[1][1]] and macros["functions"][t[1][1]] then -- ./compiler/lua54.can:742 -local macro = macros["functions"][t[1][1]] -- ./compiler/lua54.can:743 -local replacement = macro["replacement"] -- ./compiler/lua54.can:744 -local r -- ./compiler/lua54.can:745 -nomacro["functions"][t[1][1]] = true -- ./compiler/lua54.can:746 -if type(replacement) == "function" then -- ./compiler/lua54.can:747 -local args = {} -- ./compiler/lua54.can:748 -for i = 2, # t do -- ./compiler/lua54.can:749 -table["insert"](args, lua(t[i])) -- ./compiler/lua54.can:750 -end -- ./compiler/lua54.can:750 -r = replacement(unpack(args)) -- ./compiler/lua54.can:752 -else -- ./compiler/lua54.can:752 -local macroargs = util["merge"](peek("macroargs")) -- ./compiler/lua54.can:754 -for i, arg in ipairs(macro["args"]) do -- ./compiler/lua54.can:755 -if arg["tag"] == "Dots" then -- ./compiler/lua54.can:756 -macroargs["..."] = (function() -- ./compiler/lua54.can:757 -local self = {} -- ./compiler/lua54.can:757 -for j = i + 1, # t do -- ./compiler/lua54.can:757 -self[#self+1] = t[j] -- ./compiler/lua54.can:757 -end -- ./compiler/lua54.can:757 -return self -- ./compiler/lua54.can:757 -end)() -- ./compiler/lua54.can:757 -elseif arg["tag"] == "Id" then -- ./compiler/lua54.can:758 -if t[i + 1] == nil then -- ./compiler/lua54.can:759 -error(("bad argument #%s to macro %s (value expected)"):format(i, t[1][1])) -- ./compiler/lua54.can:760 -end -- ./compiler/lua54.can:760 -macroargs[arg[1]] = t[i + 1] -- ./compiler/lua54.can:762 -else -- ./compiler/lua54.can:762 -error(("unexpected argument type %s in macro %s"):format(arg["tag"], t[1][1])) -- ./compiler/lua54.can:764 -end -- ./compiler/lua54.can:764 -end -- ./compiler/lua54.can:764 -push("macroargs", macroargs) -- ./compiler/lua54.can:767 -r = lua(replacement) -- ./compiler/lua54.can:768 -pop("macroargs") -- ./compiler/lua54.can:769 -end -- ./compiler/lua54.can:769 -nomacro["functions"][t[1][1]] = nil -- ./compiler/lua54.can:771 -return r -- ./compiler/lua54.can:772 -elseif t[1]["tag"] == "MethodStub" then -- ./compiler/lua54.can:773 -if t[1][1]["tag"] == "String" or t[1][1]["tag"] == "Table" then -- ./compiler/lua54.can:774 -return "(" .. lua(t[1][1]) .. "):" .. lua(t[1][2], "Id") .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:775 -else -- ./compiler/lua54.can:775 -return lua(t[1][1]) .. ":" .. lua(t[1][2], "Id") .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:777 -end -- ./compiler/lua54.can:777 -else -- ./compiler/lua54.can:777 -return lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:780 -end -- ./compiler/lua54.can:780 -end, -- ./compiler/lua54.can:780 -["SafeCall"] = function(t) -- ./compiler/lua54.can:784 -if t[1]["tag"] ~= "Id" then -- ./compiler/lua54.can:785 -return lua(t, "SafeIndex") -- ./compiler/lua54.can:786 -else -- ./compiler/lua54.can:786 -return "(" .. lua(t[1]) .. " ~= nil and " .. lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ") or nil)" -- ./compiler/lua54.can:788 -end -- ./compiler/lua54.can:788 -end, -- ./compiler/lua54.can:788 -["_lhs"] = function(t, start, newlines) -- ./compiler/lua54.can:793 -if start == nil then start = 1 end -- ./compiler/lua54.can:793 -local r -- ./compiler/lua54.can:794 -if t[start] then -- ./compiler/lua54.can:795 -r = lua(t[start]) -- ./compiler/lua54.can:796 -for i = start + 1, # t, 1 do -- ./compiler/lua54.can:797 -r = r .. ("," .. (newlines and newline() or " ") .. lua(t[i])) -- ./compiler/lua54.can:798 -end -- ./compiler/lua54.can:798 -else -- ./compiler/lua54.can:798 -r = "" -- ./compiler/lua54.can:801 -end -- ./compiler/lua54.can:801 -return r -- ./compiler/lua54.can:803 -end, -- ./compiler/lua54.can:803 -["Id"] = function(t) -- ./compiler/lua54.can:806 -local r = t[1] -- ./compiler/lua54.can:807 -local macroargs = peek("macroargs") -- ./compiler/lua54.can:808 -if not nomacro["variables"][t[1]] then -- ./compiler/lua54.can:809 -nomacro["variables"][t[1]] = true -- ./compiler/lua54.can:810 -if macroargs and macroargs[t[1]] then -- ./compiler/lua54.can:811 -r = lua(macroargs[t[1]]) -- ./compiler/lua54.can:812 -elseif macros["variables"][t[1]] ~= nil then -- ./compiler/lua54.can:813 -local macro = macros["variables"][t[1]] -- ./compiler/lua54.can:814 -if type(macro) == "function" then -- ./compiler/lua54.can:815 -r = macro() -- ./compiler/lua54.can:816 -else -- ./compiler/lua54.can:816 -r = lua(macro) -- ./compiler/lua54.can:818 -end -- ./compiler/lua54.can:818 -end -- ./compiler/lua54.can:818 -nomacro["variables"][t[1]] = nil -- ./compiler/lua54.can:821 -end -- ./compiler/lua54.can:821 -return r -- ./compiler/lua54.can:823 -end, -- ./compiler/lua54.can:823 -["AttributeId"] = function(t) -- ./compiler/lua54.can:826 -if t[2] then -- ./compiler/lua54.can:827 -return t[1] .. " <" .. t[2] .. ">" -- ./compiler/lua54.can:828 -else -- ./compiler/lua54.can:828 -return t[1] -- ./compiler/lua54.can:830 -end -- ./compiler/lua54.can:830 -end, -- ./compiler/lua54.can:830 -["DestructuringId"] = function(t) -- ./compiler/lua54.can:834 -if t["id"] then -- ./compiler/lua54.can:835 -return t["id"] -- ./compiler/lua54.can:836 -else -- ./compiler/lua54.can:836 -local d = assert(peek("destructuring"), "DestructuringId not in a destructurable assignement") -- ./compiler/lua54.can:838 -local vars = { ["id"] = tmp() } -- ./compiler/lua54.can:839 -for j = 1, # t, 1 do -- ./compiler/lua54.can:840 -table["insert"](vars, t[j]) -- ./compiler/lua54.can:841 -end -- ./compiler/lua54.can:841 -table["insert"](d, vars) -- ./compiler/lua54.can:843 -t["id"] = vars["id"] -- ./compiler/lua54.can:844 -return vars["id"] -- ./compiler/lua54.can:845 -end -- ./compiler/lua54.can:845 -end, -- ./compiler/lua54.can:845 -["Index"] = function(t) -- ./compiler/lua54.can:849 -if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua54.can:850 -return "(" .. lua(t[1]) .. ")[" .. lua(t[2]) .. "]" -- ./compiler/lua54.can:851 -else -- ./compiler/lua54.can:851 -return lua(t[1]) .. "[" .. lua(t[2]) .. "]" -- ./compiler/lua54.can:853 -end -- ./compiler/lua54.can:853 -end, -- ./compiler/lua54.can:853 -["SafeIndex"] = function(t) -- ./compiler/lua54.can:857 -if t[1]["tag"] ~= "Id" then -- ./compiler/lua54.can:858 -local l = {} -- ./compiler/lua54.can:859 -while t["tag"] == "SafeIndex" or t["tag"] == "SafeCall" do -- ./compiler/lua54.can:860 -table["insert"](l, 1, t) -- ./compiler/lua54.can:861 -t = t[1] -- ./compiler/lua54.can:862 -end -- ./compiler/lua54.can:862 -local r = "(function()" .. indent() .. "local " .. var("safe") .. " = " .. lua(l[1][1]) .. newline() -- ./compiler/lua54.can:864 -for _, e in ipairs(l) do -- ./compiler/lua54.can:865 -r = r .. ("if " .. var("safe") .. " == nil then return nil end" .. newline()) -- ./compiler/lua54.can:866 -if e["tag"] == "SafeIndex" then -- ./compiler/lua54.can:867 -r = r .. (var("safe") .. " = " .. var("safe") .. "[" .. lua(e[2]) .. "]" .. newline()) -- ./compiler/lua54.can:868 -else -- ./compiler/lua54.can:868 -r = r .. (var("safe") .. " = " .. var("safe") .. "(" .. lua(e, "_lhs", 2) .. ")" .. newline()) -- ./compiler/lua54.can:870 -end -- ./compiler/lua54.can:870 -end -- ./compiler/lua54.can:870 -r = r .. ("return " .. var("safe") .. unindent() .. "end)()") -- ./compiler/lua54.can:873 -return r -- ./compiler/lua54.can:874 -else -- ./compiler/lua54.can:874 -return "(" .. lua(t[1]) .. " ~= nil and " .. lua(t[1]) .. "[" .. lua(t[2]) .. "] or nil)" -- ./compiler/lua54.can:876 -end -- ./compiler/lua54.can:876 -end, -- ./compiler/lua54.can:876 -["_opid"] = { -- ./compiler/lua54.can:881 -["add"] = "+", -- ./compiler/lua54.can:882 -["sub"] = "-", -- ./compiler/lua54.can:882 -["mul"] = "*", -- ./compiler/lua54.can:882 -["div"] = "/", -- ./compiler/lua54.can:882 -["idiv"] = "//", -- ./compiler/lua54.can:883 -["mod"] = "%", -- ./compiler/lua54.can:883 -["pow"] = "^", -- ./compiler/lua54.can:883 -["concat"] = "..", -- ./compiler/lua54.can:883 -["band"] = "&", -- ./compiler/lua54.can:884 -["bor"] = "|", -- ./compiler/lua54.can:884 -["bxor"] = "~", -- ./compiler/lua54.can:884 -["shl"] = "<<", -- ./compiler/lua54.can:884 -["shr"] = ">>", -- ./compiler/lua54.can:884 -["eq"] = "==", -- ./compiler/lua54.can:885 -["ne"] = "~=", -- ./compiler/lua54.can:885 -["lt"] = "<", -- ./compiler/lua54.can:885 -["gt"] = ">", -- ./compiler/lua54.can:885 -["le"] = "<=", -- ./compiler/lua54.can:885 -["ge"] = ">=", -- ./compiler/lua54.can:885 -["and"] = "and", -- ./compiler/lua54.can:886 -["or"] = "or", -- ./compiler/lua54.can:886 -["unm"] = "-", -- ./compiler/lua54.can:886 -["len"] = "#", -- ./compiler/lua54.can:886 -["bnot"] = "~", -- ./compiler/lua54.can:886 -["not"] = "not" -- ./compiler/lua54.can:886 -} -- ./compiler/lua54.can:886 -}, { ["__index"] = function(self, key) -- ./compiler/lua54.can:889 -error("don't know how to compile a " .. tostring(key) .. " to " .. targetName) -- ./compiler/lua54.can:890 -end }) -- ./compiler/lua54.can:890 +["SafeCall"] = function(t) -- ./compiler/lua54.can:737 +if t[1]["tag"] ~= "Id" then -- ./compiler/lua54.can:738 +return lua(t, "SafeIndex") -- ./compiler/lua54.can:739 +else -- ./compiler/lua54.can:739 +return "(" .. lua(t[1]) .. " ~= nil and " .. lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ") or nil)" -- ./compiler/lua54.can:741 +end -- ./compiler/lua54.can:741 +end, -- ./compiler/lua54.can:741 +["_lhs"] = function(t, start, newlines) -- ./compiler/lua54.can:746 +if start == nil then start = 1 end -- ./compiler/lua54.can:746 +local r -- ./compiler/lua54.can:747 +if t[start] then -- ./compiler/lua54.can:748 +r = lua(t[start]) -- ./compiler/lua54.can:749 +for i = start + 1, # t, 1 do -- ./compiler/lua54.can:750 +r = r .. ("," .. (newlines and newline() or " ") .. lua(t[i])) -- ./compiler/lua54.can:751 +end -- ./compiler/lua54.can:751 +else -- ./compiler/lua54.can:751 +r = "" -- ./compiler/lua54.can:754 +end -- ./compiler/lua54.can:754 +return r -- ./compiler/lua54.can:756 +end, -- ./compiler/lua54.can:756 +["Id"] = function(t) -- ./compiler/lua54.can:759 +return t[1] -- ./compiler/lua54.can:760 +end, -- ./compiler/lua54.can:760 +["AttributeId"] = function(t) -- ./compiler/lua54.can:763 +if t[2] then -- ./compiler/lua54.can:764 +return t[1] .. " <" .. t[2] .. ">" -- ./compiler/lua54.can:765 +else -- ./compiler/lua54.can:765 +return t[1] -- ./compiler/lua54.can:767 +end -- ./compiler/lua54.can:767 +end, -- ./compiler/lua54.can:767 +["DestructuringId"] = function(t) -- ./compiler/lua54.can:771 +if t["id"] then -- ./compiler/lua54.can:772 +return t["id"] -- ./compiler/lua54.can:773 +else -- ./compiler/lua54.can:773 +local d = assert(peek("destructuring"), "DestructuringId not in a destructurable assignement") -- ./compiler/lua54.can:775 +local vars = { ["id"] = tmp() } -- ./compiler/lua54.can:776 +for j = 1, # t, 1 do -- ./compiler/lua54.can:777 +table["insert"](vars, t[j]) -- ./compiler/lua54.can:778 +end -- ./compiler/lua54.can:778 +table["insert"](d, vars) -- ./compiler/lua54.can:780 +t["id"] = vars["id"] -- ./compiler/lua54.can:781 +return vars["id"] -- ./compiler/lua54.can:782 +end -- ./compiler/lua54.can:782 +end, -- ./compiler/lua54.can:782 +["Index"] = function(t) -- ./compiler/lua54.can:786 +if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua54.can:787 +return "(" .. lua(t[1]) .. ")[" .. lua(t[2]) .. "]" -- ./compiler/lua54.can:788 +else -- ./compiler/lua54.can:788 +return lua(t[1]) .. "[" .. lua(t[2]) .. "]" -- ./compiler/lua54.can:790 +end -- ./compiler/lua54.can:790 +end, -- ./compiler/lua54.can:790 +["SafeIndex"] = function(t) -- ./compiler/lua54.can:794 +if t[1]["tag"] ~= "Id" then -- ./compiler/lua54.can:795 +local l = {} -- ./compiler/lua54.can:796 +while t["tag"] == "SafeIndex" or t["tag"] == "SafeCall" do -- ./compiler/lua54.can:797 +table["insert"](l, 1, t) -- ./compiler/lua54.can:798 +t = t[1] -- ./compiler/lua54.can:799 +end -- ./compiler/lua54.can:799 +local r = "(function()" .. indent() .. "local " .. var("safe") .. " = " .. lua(l[1][1]) .. newline() -- ./compiler/lua54.can:801 +for _, e in ipairs(l) do -- ./compiler/lua54.can:802 +r = r .. ("if " .. var("safe") .. " == nil then return nil end" .. newline()) -- ./compiler/lua54.can:803 +if e["tag"] == "SafeIndex" then -- ./compiler/lua54.can:804 +r = r .. (var("safe") .. " = " .. var("safe") .. "[" .. lua(e[2]) .. "]" .. newline()) -- ./compiler/lua54.can:805 +else -- ./compiler/lua54.can:805 +r = r .. (var("safe") .. " = " .. var("safe") .. "(" .. lua(e, "_lhs", 2) .. ")" .. newline()) -- ./compiler/lua54.can:807 +end -- ./compiler/lua54.can:807 +end -- ./compiler/lua54.can:807 +r = r .. ("return " .. var("safe") .. unindent() .. "end)()") -- ./compiler/lua54.can:810 +return r -- ./compiler/lua54.can:811 +else -- ./compiler/lua54.can:811 +return "(" .. lua(t[1]) .. " ~= nil and " .. lua(t[1]) .. "[" .. lua(t[2]) .. "] or nil)" -- ./compiler/lua54.can:813 +end -- ./compiler/lua54.can:813 +end, -- ./compiler/lua54.can:813 +["_opid"] = { -- ./compiler/lua54.can:818 +["add"] = "+", -- ./compiler/lua54.can:819 +["sub"] = "-", -- ./compiler/lua54.can:819 +["mul"] = "*", -- ./compiler/lua54.can:819 +["div"] = "/", -- ./compiler/lua54.can:819 +["idiv"] = "//", -- ./compiler/lua54.can:820 +["mod"] = "%", -- ./compiler/lua54.can:820 +["pow"] = "^", -- ./compiler/lua54.can:820 +["concat"] = "..", -- ./compiler/lua54.can:820 +["band"] = "&", -- ./compiler/lua54.can:821 +["bor"] = "|", -- ./compiler/lua54.can:821 +["bxor"] = "~", -- ./compiler/lua54.can:821 +["shl"] = "<<", -- ./compiler/lua54.can:821 +["shr"] = ">>", -- ./compiler/lua54.can:821 +["eq"] = "==", -- ./compiler/lua54.can:822 +["ne"] = "~=", -- ./compiler/lua54.can:822 +["lt"] = "<", -- ./compiler/lua54.can:822 +["gt"] = ">", -- ./compiler/lua54.can:822 +["le"] = "<=", -- ./compiler/lua54.can:822 +["ge"] = ">=", -- ./compiler/lua54.can:822 +["and"] = "and", -- ./compiler/lua54.can:823 +["or"] = "or", -- ./compiler/lua54.can:823 +["unm"] = "-", -- ./compiler/lua54.can:823 +["len"] = "#", -- ./compiler/lua54.can:823 +["bnot"] = "~", -- ./compiler/lua54.can:823 +["not"] = "not" -- ./compiler/lua54.can:823 +} -- ./compiler/lua54.can:823 +}, { ["__index"] = function(self, key) -- ./compiler/lua54.can:826 +error("don't know how to compile a " .. tostring(key) .. " to " .. targetName) -- ./compiler/lua54.can:827 +end }) -- ./compiler/lua54.can:827 targetName = "Lua 5.3" -- ./compiler/lua53.can:1 tags["AttributeId"] = function(t) -- ./compiler/lua53.can:4 if t[2] then -- ./compiler/lua53.can:5 @@ -4204,11 +3687,11 @@ tags["_opid"]["bnot"] = function(right) -- ./compiler/luajit.can:27 addRequire("bit", "bnot", "bnot") -- ./compiler/luajit.can:28 return var("bnot") .. "(" .. lua(right) .. ")" -- ./compiler/luajit.can:29 end -- ./compiler/luajit.can:29 -local code = lua(ast) .. newline() -- ./compiler/lua54.can:896 -return requireStr .. code -- ./compiler/lua54.can:897 -end -- ./compiler/lua54.can:897 -end -- ./compiler/lua54.can:897 -local lua54 = _() or lua54 -- ./compiler/lua54.can:902 +local code = lua(ast) .. newline() -- ./compiler/lua54.can:833 +return requireStr .. code -- ./compiler/lua54.can:834 +end -- ./compiler/lua54.can:834 +end -- ./compiler/lua54.can:834 +local lua54 = _() or lua54 -- ./compiler/lua54.can:839 return lua54 -- ./compiler/lua53.can:18 end -- ./compiler/lua53.can:18 local lua53 = _() or lua53 -- ./compiler/lua53.can:22 @@ -4224,933 +3707,861 @@ local function _() -- ./compiler/luajit.can:48 local function _() -- ./compiler/luajit.can:50 local function _() -- ./compiler/luajit.can:52 local function _() -- ./compiler/luajit.can:54 -local util = require("candran.util") -- ./compiler/lua54.can:1 -local targetName = "Lua 5.4" -- ./compiler/lua54.can:3 -local unpack = unpack or table["unpack"] -- ./compiler/lua54.can:5 -return function(code, ast, options, macros) -- ./compiler/lua54.can:7 -if macros == nil then macros = { -- ./compiler/lua54.can:7 -["functions"] = {}, -- ./compiler/lua54.can:7 -["variables"] = {} -- ./compiler/lua54.can:7 -} end -- ./compiler/lua54.can:7 -local lastInputPos = 1 -- ./compiler/lua54.can:9 -local prevLinePos = 1 -- ./compiler/lua54.can:10 -local lastSource = options["chunkname"] or "nil" -- ./compiler/lua54.can:11 -local lastLine = 1 -- ./compiler/lua54.can:12 -local indentLevel = 0 -- ./compiler/lua54.can:15 -local function newline() -- ./compiler/lua54.can:17 -local r = options["newline"] .. string["rep"](options["indentation"], indentLevel) -- ./compiler/lua54.can:18 -if options["mapLines"] then -- ./compiler/lua54.can:19 -local sub = code:sub(lastInputPos) -- ./compiler/lua54.can:20 +local targetName = "Lua 5.4" -- ./compiler/lua54.can:1 +return function(code, ast, options) -- ./compiler/lua54.can:3 +local lastInputPos = 1 -- ./compiler/lua54.can:5 +local prevLinePos = 1 -- ./compiler/lua54.can:6 +local lastSource = options["chunkname"] or "nil" -- ./compiler/lua54.can:7 +local lastLine = 1 -- ./compiler/lua54.can:8 +local indentLevel = 0 -- ./compiler/lua54.can:11 +local function newline() -- ./compiler/lua54.can:13 +local r = options["newline"] .. string["rep"](options["indentation"], indentLevel) -- ./compiler/lua54.can:14 +if options["mapLines"] then -- ./compiler/lua54.can:15 +local sub = code:sub(lastInputPos) -- ./compiler/lua54.can:16 local source, line = sub:sub(1, sub:find("\ ")):match(".*%-%- (.-)%:(%d+)\ -") -- ./compiler/lua54.can:21 -if source and line then -- ./compiler/lua54.can:23 -lastSource = source -- ./compiler/lua54.can:24 -lastLine = tonumber(line) -- ./compiler/lua54.can:25 -else -- ./compiler/lua54.can:25 +") -- ./compiler/lua54.can:17 +if source and line then -- ./compiler/lua54.can:19 +lastSource = source -- ./compiler/lua54.can:20 +lastLine = tonumber(line) -- ./compiler/lua54.can:21 +else -- ./compiler/lua54.can:21 for _ in code:sub(prevLinePos, lastInputPos):gmatch("\ -") do -- ./compiler/lua54.can:27 -lastLine = lastLine + (1) -- ./compiler/lua54.can:28 -end -- ./compiler/lua54.can:28 -end -- ./compiler/lua54.can:28 -prevLinePos = lastInputPos -- ./compiler/lua54.can:32 -r = " -- " .. lastSource .. ":" .. lastLine .. r -- ./compiler/lua54.can:34 -end -- ./compiler/lua54.can:34 -return r -- ./compiler/lua54.can:36 -end -- ./compiler/lua54.can:36 -local function indent() -- ./compiler/lua54.can:39 -indentLevel = indentLevel + (1) -- ./compiler/lua54.can:40 -return newline() -- ./compiler/lua54.can:41 -end -- ./compiler/lua54.can:41 -local function unindent() -- ./compiler/lua54.can:44 -indentLevel = indentLevel - (1) -- ./compiler/lua54.can:45 -return newline() -- ./compiler/lua54.can:46 -end -- ./compiler/lua54.can:46 -local states = { -- ./compiler/lua54.can:51 -["push"] = {}, -- ./compiler/lua54.can:52 -["destructuring"] = {}, -- ./compiler/lua54.can:53 -["scope"] = {}, -- ./compiler/lua54.can:54 -["macroargs"] = {} -- ./compiler/lua54.can:55 -} -- ./compiler/lua54.can:55 -local function push(name, state) -- ./compiler/lua54.can:58 -table["insert"](states[name], state) -- ./compiler/lua54.can:59 +") do -- ./compiler/lua54.can:23 +lastLine = lastLine + (1) -- ./compiler/lua54.can:24 +end -- ./compiler/lua54.can:24 +end -- ./compiler/lua54.can:24 +prevLinePos = lastInputPos -- ./compiler/lua54.can:28 +r = " -- " .. lastSource .. ":" .. lastLine .. r -- ./compiler/lua54.can:30 +end -- ./compiler/lua54.can:30 +return r -- ./compiler/lua54.can:32 +end -- ./compiler/lua54.can:32 +local function indent() -- ./compiler/lua54.can:35 +indentLevel = indentLevel + (1) -- ./compiler/lua54.can:36 +return newline() -- ./compiler/lua54.can:37 +end -- ./compiler/lua54.can:37 +local function unindent() -- ./compiler/lua54.can:40 +indentLevel = indentLevel - (1) -- ./compiler/lua54.can:41 +return newline() -- ./compiler/lua54.can:42 +end -- ./compiler/lua54.can:42 +local states = { -- ./compiler/lua54.can:47 +["push"] = {}, -- ./compiler/lua54.can:48 +["destructuring"] = {}, -- ./compiler/lua54.can:49 +["scope"] = {} -- ./compiler/lua54.can:50 +} -- ./compiler/lua54.can:50 +local function push(name, state) -- ./compiler/lua54.can:53 +table["insert"](states[name], state) -- ./compiler/lua54.can:54 +return "" -- ./compiler/lua54.can:55 +end -- ./compiler/lua54.can:55 +local function pop(name) -- ./compiler/lua54.can:58 +table["remove"](states[name]) -- ./compiler/lua54.can:59 return "" -- ./compiler/lua54.can:60 end -- ./compiler/lua54.can:60 -local function pop(name) -- ./compiler/lua54.can:63 -table["remove"](states[name]) -- ./compiler/lua54.can:64 +local function set(name, state) -- ./compiler/lua54.can:63 +states[name][# states[name]] = state -- ./compiler/lua54.can:64 return "" -- ./compiler/lua54.can:65 end -- ./compiler/lua54.can:65 -local function set(name, state) -- ./compiler/lua54.can:68 -states[name][# states[name]] = state -- ./compiler/lua54.can:69 -return "" -- ./compiler/lua54.can:70 -end -- ./compiler/lua54.can:70 -local function peek(name) -- ./compiler/lua54.can:73 -return states[name][# states[name]] -- ./compiler/lua54.can:74 -end -- ./compiler/lua54.can:74 -local function var(name) -- ./compiler/lua54.can:79 -return options["variablePrefix"] .. name -- ./compiler/lua54.can:80 -end -- ./compiler/lua54.can:80 -local function tmp() -- ./compiler/lua54.can:84 -local scope = peek("scope") -- ./compiler/lua54.can:85 -local var = ("%s_%s"):format(options["variablePrefix"], # scope) -- ./compiler/lua54.can:86 -table["insert"](scope, var) -- ./compiler/lua54.can:87 -return var -- ./compiler/lua54.can:88 -end -- ./compiler/lua54.can:88 -local nomacro = { -- ./compiler/lua54.can:92 -["variables"] = {}, -- ./compiler/lua54.can:92 -["functions"] = {} -- ./compiler/lua54.can:92 -} -- ./compiler/lua54.can:92 -local required = {} -- ./compiler/lua54.can:95 -local requireStr = "" -- ./compiler/lua54.can:96 -local function addRequire(mod, name, field) -- ./compiler/lua54.can:98 -local req = ("require(%q)%s"):format(mod, field and "." .. field or "") -- ./compiler/lua54.can:99 -if not required[req] then -- ./compiler/lua54.can:100 -requireStr = requireStr .. (("local %s = %s%s"):format(var(name), req, options["newline"])) -- ./compiler/lua54.can:101 -required[req] = true -- ./compiler/lua54.can:102 -end -- ./compiler/lua54.can:102 -end -- ./compiler/lua54.can:102 -local loop = { -- ./compiler/lua54.can:107 -"While", -- ./compiler/lua54.can:107 -"Repeat", -- ./compiler/lua54.can:107 -"Fornum", -- ./compiler/lua54.can:107 -"Forin", -- ./compiler/lua54.can:107 -"WhileExpr", -- ./compiler/lua54.can:107 -"RepeatExpr", -- ./compiler/lua54.can:107 -"FornumExpr", -- ./compiler/lua54.can:107 -"ForinExpr" -- ./compiler/lua54.can:107 -} -- ./compiler/lua54.can:107 -local func = { -- ./compiler/lua54.can:108 -"Function", -- ./compiler/lua54.can:108 -"TableCompr", -- ./compiler/lua54.can:108 -"DoExpr", -- ./compiler/lua54.can:108 -"WhileExpr", -- ./compiler/lua54.can:108 -"RepeatExpr", -- ./compiler/lua54.can:108 -"IfExpr", -- ./compiler/lua54.can:108 -"FornumExpr", -- ./compiler/lua54.can:108 -"ForinExpr" -- ./compiler/lua54.can:108 -} -- ./compiler/lua54.can:108 -local function any(list, tags, nofollow) -- ./compiler/lua54.can:112 -if nofollow == nil then nofollow = {} end -- ./compiler/lua54.can:112 -local tagsCheck = {} -- ./compiler/lua54.can:113 -for _, tag in ipairs(tags) do -- ./compiler/lua54.can:114 -tagsCheck[tag] = true -- ./compiler/lua54.can:115 -end -- ./compiler/lua54.can:115 -local nofollowCheck = {} -- ./compiler/lua54.can:117 -for _, tag in ipairs(nofollow) do -- ./compiler/lua54.can:118 -nofollowCheck[tag] = true -- ./compiler/lua54.can:119 -end -- ./compiler/lua54.can:119 -for _, node in ipairs(list) do -- ./compiler/lua54.can:121 -if type(node) == "table" then -- ./compiler/lua54.can:122 -if tagsCheck[node["tag"]] then -- ./compiler/lua54.can:123 -return node -- ./compiler/lua54.can:124 +local function peek(name) -- ./compiler/lua54.can:68 +return states[name][# states[name]] -- ./compiler/lua54.can:69 +end -- ./compiler/lua54.can:69 +local function var(name) -- ./compiler/lua54.can:74 +return options["variablePrefix"] .. name -- ./compiler/lua54.can:75 +end -- ./compiler/lua54.can:75 +local function tmp() -- ./compiler/lua54.can:79 +local scope = peek("scope") -- ./compiler/lua54.can:80 +local var = ("%s_%s"):format(options["variablePrefix"], # scope) -- ./compiler/lua54.can:81 +table["insert"](scope, var) -- ./compiler/lua54.can:82 +return var -- ./compiler/lua54.can:83 +end -- ./compiler/lua54.can:83 +local required = {} -- ./compiler/lua54.can:87 +local requireStr = "" -- ./compiler/lua54.can:88 +local function addRequire(mod, name, field) -- ./compiler/lua54.can:90 +local req = ("require(%q)%s"):format(mod, field and "." .. field or "") -- ./compiler/lua54.can:91 +if not required[req] then -- ./compiler/lua54.can:92 +requireStr = requireStr .. (("local %s = %s%s"):format(var(name), req, options["newline"])) -- ./compiler/lua54.can:93 +required[req] = true -- ./compiler/lua54.can:94 +end -- ./compiler/lua54.can:94 +end -- ./compiler/lua54.can:94 +local loop = { -- ./compiler/lua54.can:99 +"While", -- ./compiler/lua54.can:99 +"Repeat", -- ./compiler/lua54.can:99 +"Fornum", -- ./compiler/lua54.can:99 +"Forin", -- ./compiler/lua54.can:99 +"WhileExpr", -- ./compiler/lua54.can:99 +"RepeatExpr", -- ./compiler/lua54.can:99 +"FornumExpr", -- ./compiler/lua54.can:99 +"ForinExpr" -- ./compiler/lua54.can:99 +} -- ./compiler/lua54.can:99 +local func = { -- ./compiler/lua54.can:100 +"Function", -- ./compiler/lua54.can:100 +"TableCompr", -- ./compiler/lua54.can:100 +"DoExpr", -- ./compiler/lua54.can:100 +"WhileExpr", -- ./compiler/lua54.can:100 +"RepeatExpr", -- ./compiler/lua54.can:100 +"IfExpr", -- ./compiler/lua54.can:100 +"FornumExpr", -- ./compiler/lua54.can:100 +"ForinExpr" -- ./compiler/lua54.can:100 +} -- ./compiler/lua54.can:100 +local function any(list, tags, nofollow) -- ./compiler/lua54.can:104 +if nofollow == nil then nofollow = {} end -- ./compiler/lua54.can:104 +local tagsCheck = {} -- ./compiler/lua54.can:105 +for _, tag in ipairs(tags) do -- ./compiler/lua54.can:106 +tagsCheck[tag] = true -- ./compiler/lua54.can:107 +end -- ./compiler/lua54.can:107 +local nofollowCheck = {} -- ./compiler/lua54.can:109 +for _, tag in ipairs(nofollow) do -- ./compiler/lua54.can:110 +nofollowCheck[tag] = true -- ./compiler/lua54.can:111 +end -- ./compiler/lua54.can:111 +for _, node in ipairs(list) do -- ./compiler/lua54.can:113 +if type(node) == "table" then -- ./compiler/lua54.can:114 +if tagsCheck[node["tag"]] then -- ./compiler/lua54.can:115 +return node -- ./compiler/lua54.can:116 +end -- ./compiler/lua54.can:116 +if not nofollowCheck[node["tag"]] then -- ./compiler/lua54.can:118 +local r = any(node, tags, nofollow) -- ./compiler/lua54.can:119 +if r then -- ./compiler/lua54.can:120 +return r -- ./compiler/lua54.can:120 +end -- ./compiler/lua54.can:120 +end -- ./compiler/lua54.can:120 +end -- ./compiler/lua54.can:120 +end -- ./compiler/lua54.can:120 +return nil -- ./compiler/lua54.can:124 end -- ./compiler/lua54.can:124 -if not nofollowCheck[node["tag"]] then -- ./compiler/lua54.can:126 -local r = any(node, tags, nofollow) -- ./compiler/lua54.can:127 -if r then -- ./compiler/lua54.can:128 -return r -- ./compiler/lua54.can:128 -end -- ./compiler/lua54.can:128 -end -- ./compiler/lua54.can:128 -end -- ./compiler/lua54.can:128 -end -- ./compiler/lua54.can:128 -return nil -- ./compiler/lua54.can:132 +local function search(list, tags, nofollow) -- ./compiler/lua54.can:129 +if nofollow == nil then nofollow = {} end -- ./compiler/lua54.can:129 +local tagsCheck = {} -- ./compiler/lua54.can:130 +for _, tag in ipairs(tags) do -- ./compiler/lua54.can:131 +tagsCheck[tag] = true -- ./compiler/lua54.can:132 end -- ./compiler/lua54.can:132 -local function search(list, tags, nofollow) -- ./compiler/lua54.can:137 -if nofollow == nil then nofollow = {} end -- ./compiler/lua54.can:137 -local tagsCheck = {} -- ./compiler/lua54.can:138 -for _, tag in ipairs(tags) do -- ./compiler/lua54.can:139 -tagsCheck[tag] = true -- ./compiler/lua54.can:140 -end -- ./compiler/lua54.can:140 -local nofollowCheck = {} -- ./compiler/lua54.can:142 -for _, tag in ipairs(nofollow) do -- ./compiler/lua54.can:143 -nofollowCheck[tag] = true -- ./compiler/lua54.can:144 -end -- ./compiler/lua54.can:144 -local found = {} -- ./compiler/lua54.can:146 -for _, node in ipairs(list) do -- ./compiler/lua54.can:147 -if type(node) == "table" then -- ./compiler/lua54.can:148 -if not nofollowCheck[node["tag"]] then -- ./compiler/lua54.can:149 -for _, n in ipairs(search(node, tags, nofollow)) do -- ./compiler/lua54.can:150 -table["insert"](found, n) -- ./compiler/lua54.can:151 +local nofollowCheck = {} -- ./compiler/lua54.can:134 +for _, tag in ipairs(nofollow) do -- ./compiler/lua54.can:135 +nofollowCheck[tag] = true -- ./compiler/lua54.can:136 +end -- ./compiler/lua54.can:136 +local found = {} -- ./compiler/lua54.can:138 +for _, node in ipairs(list) do -- ./compiler/lua54.can:139 +if type(node) == "table" then -- ./compiler/lua54.can:140 +if not nofollowCheck[node["tag"]] then -- ./compiler/lua54.can:141 +for _, n in ipairs(search(node, tags, nofollow)) do -- ./compiler/lua54.can:142 +table["insert"](found, n) -- ./compiler/lua54.can:143 +end -- ./compiler/lua54.can:143 +end -- ./compiler/lua54.can:143 +if tagsCheck[node["tag"]] then -- ./compiler/lua54.can:146 +table["insert"](found, node) -- ./compiler/lua54.can:147 +end -- ./compiler/lua54.can:147 +end -- ./compiler/lua54.can:147 +end -- ./compiler/lua54.can:147 +return found -- ./compiler/lua54.can:151 end -- ./compiler/lua54.can:151 -end -- ./compiler/lua54.can:151 -if tagsCheck[node["tag"]] then -- ./compiler/lua54.can:154 -table["insert"](found, node) -- ./compiler/lua54.can:155 -end -- ./compiler/lua54.can:155 -end -- ./compiler/lua54.can:155 -end -- ./compiler/lua54.can:155 -return found -- ./compiler/lua54.can:159 -end -- ./compiler/lua54.can:159 -local function all(list, tags) -- ./compiler/lua54.can:163 -for _, node in ipairs(list) do -- ./compiler/lua54.can:164 -local ok = false -- ./compiler/lua54.can:165 -for _, tag in ipairs(tags) do -- ./compiler/lua54.can:166 -if node["tag"] == tag then -- ./compiler/lua54.can:167 -ok = true -- ./compiler/lua54.can:168 -break -- ./compiler/lua54.can:169 -end -- ./compiler/lua54.can:169 -end -- ./compiler/lua54.can:169 -if not ok then -- ./compiler/lua54.can:172 -return false -- ./compiler/lua54.can:173 -end -- ./compiler/lua54.can:173 -end -- ./compiler/lua54.can:173 -return true -- ./compiler/lua54.can:176 +local function all(list, tags) -- ./compiler/lua54.can:155 +for _, node in ipairs(list) do -- ./compiler/lua54.can:156 +local ok = false -- ./compiler/lua54.can:157 +for _, tag in ipairs(tags) do -- ./compiler/lua54.can:158 +if node["tag"] == tag then -- ./compiler/lua54.can:159 +ok = true -- ./compiler/lua54.can:160 +break -- ./compiler/lua54.can:161 +end -- ./compiler/lua54.can:161 +end -- ./compiler/lua54.can:161 +if not ok then -- ./compiler/lua54.can:164 +return false -- ./compiler/lua54.can:165 +end -- ./compiler/lua54.can:165 +end -- ./compiler/lua54.can:165 +return true -- ./compiler/lua54.can:168 +end -- ./compiler/lua54.can:168 +local tags -- ./compiler/lua54.can:172 +local function lua(ast, forceTag, ...) -- ./compiler/lua54.can:174 +if options["mapLines"] and ast["pos"] then -- ./compiler/lua54.can:175 +lastInputPos = ast["pos"] -- ./compiler/lua54.can:176 end -- ./compiler/lua54.can:176 -local tags -- ./compiler/lua54.can:180 -local function lua(ast, forceTag, ...) -- ./compiler/lua54.can:182 -if options["mapLines"] and ast["pos"] then -- ./compiler/lua54.can:183 -lastInputPos = ast["pos"] -- ./compiler/lua54.can:184 -end -- ./compiler/lua54.can:184 -return tags[forceTag or ast["tag"]](ast, ...) -- ./compiler/lua54.can:186 +return tags[forceTag or ast["tag"]](ast, ...) -- ./compiler/lua54.can:178 +end -- ./compiler/lua54.can:178 +local UNPACK = function(list, i, j) -- ./compiler/lua54.can:182 +return "table.unpack(" .. list .. (i and (", " .. i .. (j and (", " .. j) or "")) or "") .. ")" -- ./compiler/lua54.can:183 +end -- ./compiler/lua54.can:183 +local APPEND = function(t, toAppend) -- ./compiler/lua54.can:185 +return "do" .. indent() .. "local " .. var("a") .. " = table.pack(" .. toAppend .. ")" .. newline() .. "table.move(" .. var("a") .. ", 1, " .. var("a") .. ".n, #" .. t .. "+1, " .. t .. ")" .. unindent() .. "end" -- ./compiler/lua54.can:186 end -- ./compiler/lua54.can:186 -local UNPACK = function(list, i, j) -- ./compiler/lua54.can:190 -return "table.unpack(" .. list .. (i and (", " .. i .. (j and (", " .. j) or "")) or "") .. ")" -- ./compiler/lua54.can:191 -end -- ./compiler/lua54.can:191 -local APPEND = function(t, toAppend) -- ./compiler/lua54.can:193 -return "do" .. indent() .. "local " .. var("a") .. " = table.pack(" .. toAppend .. ")" .. newline() .. "table.move(" .. var("a") .. ", 1, " .. var("a") .. ".n, #" .. t .. "+1, " .. t .. ")" .. unindent() .. "end" -- ./compiler/lua54.can:194 -end -- ./compiler/lua54.can:194 -local CONTINUE_START = function() -- ./compiler/lua54.can:196 -return "do" .. indent() -- ./compiler/lua54.can:197 -end -- ./compiler/lua54.can:197 -local CONTINUE_STOP = function() -- ./compiler/lua54.can:199 -return unindent() .. "end" .. newline() .. "::" .. var("continue") .. "::" -- ./compiler/lua54.can:200 -end -- ./compiler/lua54.can:200 -local DESTRUCTURING_ASSIGN = function(destructured, newlineAfter, noLocal) -- ./compiler/lua54.can:202 -if newlineAfter == nil then newlineAfter = false end -- ./compiler/lua54.can:202 -if noLocal == nil then noLocal = false end -- ./compiler/lua54.can:202 -local vars = {} -- ./compiler/lua54.can:203 -local values = {} -- ./compiler/lua54.can:204 -for _, list in ipairs(destructured) do -- ./compiler/lua54.can:205 -for _, v in ipairs(list) do -- ./compiler/lua54.can:206 -local var, val -- ./compiler/lua54.can:207 -if v["tag"] == "Id" or v["tag"] == "AttributeId" then -- ./compiler/lua54.can:208 -var = v -- ./compiler/lua54.can:209 +local CONTINUE_START = function() -- ./compiler/lua54.can:188 +return "do" .. indent() -- ./compiler/lua54.can:189 +end -- ./compiler/lua54.can:189 +local CONTINUE_STOP = function() -- ./compiler/lua54.can:191 +return unindent() .. "end" .. newline() .. "::" .. var("continue") .. "::" -- ./compiler/lua54.can:192 +end -- ./compiler/lua54.can:192 +local DESTRUCTURING_ASSIGN = function(destructured, newlineAfter, noLocal) -- ./compiler/lua54.can:194 +if newlineAfter == nil then newlineAfter = false end -- ./compiler/lua54.can:194 +if noLocal == nil then noLocal = false end -- ./compiler/lua54.can:194 +local vars = {} -- ./compiler/lua54.can:195 +local values = {} -- ./compiler/lua54.can:196 +for _, list in ipairs(destructured) do -- ./compiler/lua54.can:197 +for _, v in ipairs(list) do -- ./compiler/lua54.can:198 +local var, val -- ./compiler/lua54.can:199 +if v["tag"] == "Id" or v["tag"] == "AttributeId" then -- ./compiler/lua54.can:200 +var = v -- ./compiler/lua54.can:201 +val = { -- ./compiler/lua54.can:202 +["tag"] = "Index", -- ./compiler/lua54.can:202 +{ -- ./compiler/lua54.can:202 +["tag"] = "Id", -- ./compiler/lua54.can:202 +list["id"] -- ./compiler/lua54.can:202 +}, -- ./compiler/lua54.can:202 +{ -- ./compiler/lua54.can:202 +["tag"] = "String", -- ./compiler/lua54.can:202 +v[1] -- ./compiler/lua54.can:202 +} -- ./compiler/lua54.can:202 +} -- ./compiler/lua54.can:202 +elseif v["tag"] == "Pair" then -- ./compiler/lua54.can:203 +var = v[2] -- ./compiler/lua54.can:204 +val = { -- ./compiler/lua54.can:205 +["tag"] = "Index", -- ./compiler/lua54.can:205 +{ -- ./compiler/lua54.can:205 +["tag"] = "Id", -- ./compiler/lua54.can:205 +list["id"] -- ./compiler/lua54.can:205 +}, -- ./compiler/lua54.can:205 +v[1] -- ./compiler/lua54.can:205 +} -- ./compiler/lua54.can:205 +else -- ./compiler/lua54.can:205 +error("unknown destructuring element type: " .. tostring(v["tag"])) -- ./compiler/lua54.can:207 +end -- ./compiler/lua54.can:207 +if destructured["rightOp"] and destructured["leftOp"] then -- ./compiler/lua54.can:209 val = { -- ./compiler/lua54.can:210 -["tag"] = "Index", -- ./compiler/lua54.can:210 +["tag"] = "Op", -- ./compiler/lua54.can:210 +destructured["rightOp"], -- ./compiler/lua54.can:210 +var, -- ./compiler/lua54.can:210 { -- ./compiler/lua54.can:210 -["tag"] = "Id", -- ./compiler/lua54.can:210 -list["id"] -- ./compiler/lua54.can:210 -}, -- ./compiler/lua54.can:210 -{ -- ./compiler/lua54.can:210 -["tag"] = "String", -- ./compiler/lua54.can:210 -v[1] -- ./compiler/lua54.can:210 +["tag"] = "Op", -- ./compiler/lua54.can:210 +destructured["leftOp"], -- ./compiler/lua54.can:210 +val, -- ./compiler/lua54.can:210 +var -- ./compiler/lua54.can:210 } -- ./compiler/lua54.can:210 } -- ./compiler/lua54.can:210 -elseif v["tag"] == "Pair" then -- ./compiler/lua54.can:211 -var = v[2] -- ./compiler/lua54.can:212 -val = { -- ./compiler/lua54.can:213 -["tag"] = "Index", -- ./compiler/lua54.can:213 -{ -- ./compiler/lua54.can:213 -["tag"] = "Id", -- ./compiler/lua54.can:213 -list["id"] -- ./compiler/lua54.can:213 -}, -- ./compiler/lua54.can:213 -v[1] -- ./compiler/lua54.can:213 -} -- ./compiler/lua54.can:213 -else -- ./compiler/lua54.can:213 -error("unknown destructuring element type: " .. tostring(v["tag"])) -- ./compiler/lua54.can:215 -end -- ./compiler/lua54.can:215 -if destructured["rightOp"] and destructured["leftOp"] then -- ./compiler/lua54.can:217 -val = { -- ./compiler/lua54.can:218 -["tag"] = "Op", -- ./compiler/lua54.can:218 -destructured["rightOp"], -- ./compiler/lua54.can:218 -var, -- ./compiler/lua54.can:218 -{ -- ./compiler/lua54.can:218 -["tag"] = "Op", -- ./compiler/lua54.can:218 -destructured["leftOp"], -- ./compiler/lua54.can:218 -val, -- ./compiler/lua54.can:218 -var -- ./compiler/lua54.can:218 -} -- ./compiler/lua54.can:218 -} -- ./compiler/lua54.can:218 -elseif destructured["rightOp"] then -- ./compiler/lua54.can:219 -val = { -- ./compiler/lua54.can:220 -["tag"] = "Op", -- ./compiler/lua54.can:220 -destructured["rightOp"], -- ./compiler/lua54.can:220 -var, -- ./compiler/lua54.can:220 -val -- ./compiler/lua54.can:220 -} -- ./compiler/lua54.can:220 -elseif destructured["leftOp"] then -- ./compiler/lua54.can:221 -val = { -- ./compiler/lua54.can:222 -["tag"] = "Op", -- ./compiler/lua54.can:222 -destructured["leftOp"], -- ./compiler/lua54.can:222 -val, -- ./compiler/lua54.can:222 -var -- ./compiler/lua54.can:222 -} -- ./compiler/lua54.can:222 -end -- ./compiler/lua54.can:222 -table["insert"](vars, lua(var)) -- ./compiler/lua54.can:224 -table["insert"](values, lua(val)) -- ./compiler/lua54.can:225 +elseif destructured["rightOp"] then -- ./compiler/lua54.can:211 +val = { -- ./compiler/lua54.can:212 +["tag"] = "Op", -- ./compiler/lua54.can:212 +destructured["rightOp"], -- ./compiler/lua54.can:212 +var, -- ./compiler/lua54.can:212 +val -- ./compiler/lua54.can:212 +} -- ./compiler/lua54.can:212 +elseif destructured["leftOp"] then -- ./compiler/lua54.can:213 +val = { -- ./compiler/lua54.can:214 +["tag"] = "Op", -- ./compiler/lua54.can:214 +destructured["leftOp"], -- ./compiler/lua54.can:214 +val, -- ./compiler/lua54.can:214 +var -- ./compiler/lua54.can:214 +} -- ./compiler/lua54.can:214 +end -- ./compiler/lua54.can:214 +table["insert"](vars, lua(var)) -- ./compiler/lua54.can:216 +table["insert"](values, lua(val)) -- ./compiler/lua54.can:217 +end -- ./compiler/lua54.can:217 +end -- ./compiler/lua54.can:217 +if # vars > 0 then -- ./compiler/lua54.can:220 +local decl = noLocal and "" or "local " -- ./compiler/lua54.can:221 +if newlineAfter then -- ./compiler/lua54.can:222 +return decl .. table["concat"](vars, ", ") .. " = " .. table["concat"](values, ", ") .. newline() -- ./compiler/lua54.can:223 +else -- ./compiler/lua54.can:223 +return newline() .. decl .. table["concat"](vars, ", ") .. " = " .. table["concat"](values, ", ") -- ./compiler/lua54.can:225 end -- ./compiler/lua54.can:225 -end -- ./compiler/lua54.can:225 -if # vars > 0 then -- ./compiler/lua54.can:228 -local decl = noLocal and "" or "local " -- ./compiler/lua54.can:229 -if newlineAfter then -- ./compiler/lua54.can:230 -return decl .. table["concat"](vars, ", ") .. " = " .. table["concat"](values, ", ") .. newline() -- ./compiler/lua54.can:231 -else -- ./compiler/lua54.can:231 -return newline() .. decl .. table["concat"](vars, ", ") .. " = " .. table["concat"](values, ", ") -- ./compiler/lua54.can:233 -end -- ./compiler/lua54.can:233 -else -- ./compiler/lua54.can:233 -return "" -- ./compiler/lua54.can:236 -end -- ./compiler/lua54.can:236 -end -- ./compiler/lua54.can:236 -tags = setmetatable({ -- ./compiler/lua54.can:241 -["Block"] = function(t) -- ./compiler/lua54.can:243 -local hasPush = peek("push") == nil and any(t, { "Push" }, func) -- ./compiler/lua54.can:244 -if hasPush and hasPush == t[# t] then -- ./compiler/lua54.can:245 -hasPush["tag"] = "Return" -- ./compiler/lua54.can:246 -hasPush = false -- ./compiler/lua54.can:247 -end -- ./compiler/lua54.can:247 -local r = push("scope", {}) -- ./compiler/lua54.can:249 -if hasPush then -- ./compiler/lua54.can:250 -r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:251 -end -- ./compiler/lua54.can:251 -for i = 1, # t - 1, 1 do -- ./compiler/lua54.can:253 -r = r .. (lua(t[i]) .. newline()) -- ./compiler/lua54.can:254 -end -- ./compiler/lua54.can:254 -if t[# t] then -- ./compiler/lua54.can:256 -r = r .. (lua(t[# t])) -- ./compiler/lua54.can:257 -end -- ./compiler/lua54.can:257 -if hasPush and (t[# t] and t[# t]["tag"] ~= "Return") then -- ./compiler/lua54.can:259 -r = r .. (newline() .. "return " .. UNPACK(var("push")) .. pop("push")) -- ./compiler/lua54.can:260 -end -- ./compiler/lua54.can:260 -return r .. pop("scope") -- ./compiler/lua54.can:262 -end, -- ./compiler/lua54.can:262 -["Do"] = function(t) -- ./compiler/lua54.can:268 -return "do" .. indent() .. lua(t, "Block") .. unindent() .. "end" -- ./compiler/lua54.can:269 -end, -- ./compiler/lua54.can:269 -["Set"] = function(t) -- ./compiler/lua54.can:272 -local expr = t[# t] -- ./compiler/lua54.can:274 -local vars, values = {}, {} -- ./compiler/lua54.can:275 -local destructuringVars, destructuringValues = {}, {} -- ./compiler/lua54.can:276 -for i, n in ipairs(t[1]) do -- ./compiler/lua54.can:277 -if n["tag"] == "DestructuringId" then -- ./compiler/lua54.can:278 -table["insert"](destructuringVars, n) -- ./compiler/lua54.can:279 -table["insert"](destructuringValues, expr[i]) -- ./compiler/lua54.can:280 -else -- ./compiler/lua54.can:280 -table["insert"](vars, n) -- ./compiler/lua54.can:282 -table["insert"](values, expr[i]) -- ./compiler/lua54.can:283 -end -- ./compiler/lua54.can:283 -end -- ./compiler/lua54.can:283 -if # t == 2 or # t == 3 then -- ./compiler/lua54.can:287 -local r = "" -- ./compiler/lua54.can:288 -if # vars > 0 then -- ./compiler/lua54.can:289 -r = lua(vars, "_lhs") .. " = " .. lua(values, "_lhs") -- ./compiler/lua54.can:290 -end -- ./compiler/lua54.can:290 -if # destructuringVars > 0 then -- ./compiler/lua54.can:292 -local destructured = {} -- ./compiler/lua54.can:293 -r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:294 -return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:295 -end -- ./compiler/lua54.can:295 -return r -- ./compiler/lua54.can:297 -elseif # t == 4 then -- ./compiler/lua54.can:298 -if t[3] == "=" then -- ./compiler/lua54.can:299 -local r = "" -- ./compiler/lua54.can:300 -if # vars > 0 then -- ./compiler/lua54.can:301 -r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:302 -t[2], -- ./compiler/lua54.can:302 -vars[1], -- ./compiler/lua54.can:302 -{ -- ./compiler/lua54.can:302 -["tag"] = "Paren", -- ./compiler/lua54.can:302 -values[1] -- ./compiler/lua54.can:302 -} -- ./compiler/lua54.can:302 -}, "Op")) -- ./compiler/lua54.can:302 -for i = 2, math["min"](# t[4], # vars), 1 do -- ./compiler/lua54.can:303 -r = r .. (", " .. lua({ -- ./compiler/lua54.can:304 -t[2], -- ./compiler/lua54.can:304 -vars[i], -- ./compiler/lua54.can:304 -{ -- ./compiler/lua54.can:304 -["tag"] = "Paren", -- ./compiler/lua54.can:304 -values[i] -- ./compiler/lua54.can:304 -} -- ./compiler/lua54.can:304 -}, "Op")) -- ./compiler/lua54.can:304 -end -- ./compiler/lua54.can:304 -end -- ./compiler/lua54.can:304 -if # destructuringVars > 0 then -- ./compiler/lua54.can:307 -local destructured = { ["rightOp"] = t[2] } -- ./compiler/lua54.can:308 -r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:309 -return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:310 +else -- ./compiler/lua54.can:225 +return "" -- ./compiler/lua54.can:228 +end -- ./compiler/lua54.can:228 +end -- ./compiler/lua54.can:228 +tags = setmetatable({ -- ./compiler/lua54.can:233 +["Block"] = function(t) -- ./compiler/lua54.can:235 +local hasPush = peek("push") == nil and any(t, { "Push" }, func) -- ./compiler/lua54.can:236 +if hasPush and hasPush == t[# t] then -- ./compiler/lua54.can:237 +hasPush["tag"] = "Return" -- ./compiler/lua54.can:238 +hasPush = false -- ./compiler/lua54.can:239 +end -- ./compiler/lua54.can:239 +local r = push("scope", {}) -- ./compiler/lua54.can:241 +if hasPush then -- ./compiler/lua54.can:242 +r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:243 +end -- ./compiler/lua54.can:243 +for i = 1, # t - 1, 1 do -- ./compiler/lua54.can:245 +r = r .. (lua(t[i]) .. newline()) -- ./compiler/lua54.can:246 +end -- ./compiler/lua54.can:246 +if t[# t] then -- ./compiler/lua54.can:248 +r = r .. (lua(t[# t])) -- ./compiler/lua54.can:249 +end -- ./compiler/lua54.can:249 +if hasPush and (t[# t] and t[# t]["tag"] ~= "Return") then -- ./compiler/lua54.can:251 +r = r .. (newline() .. "return " .. UNPACK(var("push")) .. pop("push")) -- ./compiler/lua54.can:252 +end -- ./compiler/lua54.can:252 +return r .. pop("scope") -- ./compiler/lua54.can:254 +end, -- ./compiler/lua54.can:254 +["Do"] = function(t) -- ./compiler/lua54.can:260 +return "do" .. indent() .. lua(t, "Block") .. unindent() .. "end" -- ./compiler/lua54.can:261 +end, -- ./compiler/lua54.can:261 +["Set"] = function(t) -- ./compiler/lua54.can:264 +local expr = t[# t] -- ./compiler/lua54.can:266 +local vars, values = {}, {} -- ./compiler/lua54.can:267 +local destructuringVars, destructuringValues = {}, {} -- ./compiler/lua54.can:268 +for i, n in ipairs(t[1]) do -- ./compiler/lua54.can:269 +if n["tag"] == "DestructuringId" then -- ./compiler/lua54.can:270 +table["insert"](destructuringVars, n) -- ./compiler/lua54.can:271 +table["insert"](destructuringValues, expr[i]) -- ./compiler/lua54.can:272 +else -- ./compiler/lua54.can:272 +table["insert"](vars, n) -- ./compiler/lua54.can:274 +table["insert"](values, expr[i]) -- ./compiler/lua54.can:275 +end -- ./compiler/lua54.can:275 +end -- ./compiler/lua54.can:275 +if # t == 2 or # t == 3 then -- ./compiler/lua54.can:279 +local r = "" -- ./compiler/lua54.can:280 +if # vars > 0 then -- ./compiler/lua54.can:281 +r = lua(vars, "_lhs") .. " = " .. lua(values, "_lhs") -- ./compiler/lua54.can:282 +end -- ./compiler/lua54.can:282 +if # destructuringVars > 0 then -- ./compiler/lua54.can:284 +local destructured = {} -- ./compiler/lua54.can:285 +r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:286 +return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:287 +end -- ./compiler/lua54.can:287 +return r -- ./compiler/lua54.can:289 +elseif # t == 4 then -- ./compiler/lua54.can:290 +if t[3] == "=" then -- ./compiler/lua54.can:291 +local r = "" -- ./compiler/lua54.can:292 +if # vars > 0 then -- ./compiler/lua54.can:293 +r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:294 +t[2], -- ./compiler/lua54.can:294 +vars[1], -- ./compiler/lua54.can:294 +{ -- ./compiler/lua54.can:294 +["tag"] = "Paren", -- ./compiler/lua54.can:294 +values[1] -- ./compiler/lua54.can:294 +} -- ./compiler/lua54.can:294 +}, "Op")) -- ./compiler/lua54.can:294 +for i = 2, math["min"](# t[4], # vars), 1 do -- ./compiler/lua54.can:295 +r = r .. (", " .. lua({ -- ./compiler/lua54.can:296 +t[2], -- ./compiler/lua54.can:296 +vars[i], -- ./compiler/lua54.can:296 +{ -- ./compiler/lua54.can:296 +["tag"] = "Paren", -- ./compiler/lua54.can:296 +values[i] -- ./compiler/lua54.can:296 +} -- ./compiler/lua54.can:296 +}, "Op")) -- ./compiler/lua54.can:296 +end -- ./compiler/lua54.can:296 +end -- ./compiler/lua54.can:296 +if # destructuringVars > 0 then -- ./compiler/lua54.can:299 +local destructured = { ["rightOp"] = t[2] } -- ./compiler/lua54.can:300 +r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:301 +return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:302 +end -- ./compiler/lua54.can:302 +return r -- ./compiler/lua54.can:304 +else -- ./compiler/lua54.can:304 +local r = "" -- ./compiler/lua54.can:306 +if # vars > 0 then -- ./compiler/lua54.can:307 +r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:308 +t[3], -- ./compiler/lua54.can:308 +{ -- ./compiler/lua54.can:308 +["tag"] = "Paren", -- ./compiler/lua54.can:308 +values[1] -- ./compiler/lua54.can:308 +}, -- ./compiler/lua54.can:308 +vars[1] -- ./compiler/lua54.can:308 +}, "Op")) -- ./compiler/lua54.can:308 +for i = 2, math["min"](# t[4], # t[1]), 1 do -- ./compiler/lua54.can:309 +r = r .. (", " .. lua({ -- ./compiler/lua54.can:310 +t[3], -- ./compiler/lua54.can:310 +{ -- ./compiler/lua54.can:310 +["tag"] = "Paren", -- ./compiler/lua54.can:310 +values[i] -- ./compiler/lua54.can:310 +}, -- ./compiler/lua54.can:310 +vars[i] -- ./compiler/lua54.can:310 +}, "Op")) -- ./compiler/lua54.can:310 end -- ./compiler/lua54.can:310 -return r -- ./compiler/lua54.can:312 -else -- ./compiler/lua54.can:312 -local r = "" -- ./compiler/lua54.can:314 -if # vars > 0 then -- ./compiler/lua54.can:315 -r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:316 -t[3], -- ./compiler/lua54.can:316 -{ -- ./compiler/lua54.can:316 -["tag"] = "Paren", -- ./compiler/lua54.can:316 -values[1] -- ./compiler/lua54.can:316 -}, -- ./compiler/lua54.can:316 -vars[1] -- ./compiler/lua54.can:316 -}, "Op")) -- ./compiler/lua54.can:316 -for i = 2, math["min"](# t[4], # t[1]), 1 do -- ./compiler/lua54.can:317 -r = r .. (", " .. lua({ -- ./compiler/lua54.can:318 -t[3], -- ./compiler/lua54.can:318 -{ -- ./compiler/lua54.can:318 -["tag"] = "Paren", -- ./compiler/lua54.can:318 -values[i] -- ./compiler/lua54.can:318 -}, -- ./compiler/lua54.can:318 -vars[i] -- ./compiler/lua54.can:318 -}, "Op")) -- ./compiler/lua54.can:318 +end -- ./compiler/lua54.can:310 +if # destructuringVars > 0 then -- ./compiler/lua54.can:313 +local destructured = { ["leftOp"] = t[3] } -- ./compiler/lua54.can:314 +r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:315 +return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:316 +end -- ./compiler/lua54.can:316 +return r -- ./compiler/lua54.can:318 end -- ./compiler/lua54.can:318 -end -- ./compiler/lua54.can:318 -if # destructuringVars > 0 then -- ./compiler/lua54.can:321 -local destructured = { ["leftOp"] = t[3] } -- ./compiler/lua54.can:322 -r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:323 -return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:324 -end -- ./compiler/lua54.can:324 -return r -- ./compiler/lua54.can:326 -end -- ./compiler/lua54.can:326 -else -- ./compiler/lua54.can:326 -local r = "" -- ./compiler/lua54.can:329 -if # vars > 0 then -- ./compiler/lua54.can:330 -r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:331 -t[2], -- ./compiler/lua54.can:331 -vars[1], -- ./compiler/lua54.can:331 -{ -- ./compiler/lua54.can:331 -["tag"] = "Op", -- ./compiler/lua54.can:331 -t[4], -- ./compiler/lua54.can:331 -{ -- ./compiler/lua54.can:331 -["tag"] = "Paren", -- ./compiler/lua54.can:331 -values[1] -- ./compiler/lua54.can:331 -}, -- ./compiler/lua54.can:331 -vars[1] -- ./compiler/lua54.can:331 -} -- ./compiler/lua54.can:331 -}, "Op")) -- ./compiler/lua54.can:331 -for i = 2, math["min"](# t[5], # t[1]), 1 do -- ./compiler/lua54.can:332 -r = r .. (", " .. lua({ -- ./compiler/lua54.can:333 -t[2], -- ./compiler/lua54.can:333 -vars[i], -- ./compiler/lua54.can:333 -{ -- ./compiler/lua54.can:333 -["tag"] = "Op", -- ./compiler/lua54.can:333 -t[4], -- ./compiler/lua54.can:333 -{ -- ./compiler/lua54.can:333 -["tag"] = "Paren", -- ./compiler/lua54.can:333 -values[i] -- ./compiler/lua54.can:333 -}, -- ./compiler/lua54.can:333 -vars[i] -- ./compiler/lua54.can:333 -} -- ./compiler/lua54.can:333 -}, "Op")) -- ./compiler/lua54.can:333 +else -- ./compiler/lua54.can:318 +local r = "" -- ./compiler/lua54.can:321 +if # vars > 0 then -- ./compiler/lua54.can:322 +r = r .. (lua(vars, "_lhs") .. " = " .. lua({ -- ./compiler/lua54.can:323 +t[2], -- ./compiler/lua54.can:323 +vars[1], -- ./compiler/lua54.can:323 +{ -- ./compiler/lua54.can:323 +["tag"] = "Op", -- ./compiler/lua54.can:323 +t[4], -- ./compiler/lua54.can:323 +{ -- ./compiler/lua54.can:323 +["tag"] = "Paren", -- ./compiler/lua54.can:323 +values[1] -- ./compiler/lua54.can:323 +}, -- ./compiler/lua54.can:323 +vars[1] -- ./compiler/lua54.can:323 +} -- ./compiler/lua54.can:323 +}, "Op")) -- ./compiler/lua54.can:323 +for i = 2, math["min"](# t[5], # t[1]), 1 do -- ./compiler/lua54.can:324 +r = r .. (", " .. lua({ -- ./compiler/lua54.can:325 +t[2], -- ./compiler/lua54.can:325 +vars[i], -- ./compiler/lua54.can:325 +{ -- ./compiler/lua54.can:325 +["tag"] = "Op", -- ./compiler/lua54.can:325 +t[4], -- ./compiler/lua54.can:325 +{ -- ./compiler/lua54.can:325 +["tag"] = "Paren", -- ./compiler/lua54.can:325 +values[i] -- ./compiler/lua54.can:325 +}, -- ./compiler/lua54.can:325 +vars[i] -- ./compiler/lua54.can:325 +} -- ./compiler/lua54.can:325 +}, "Op")) -- ./compiler/lua54.can:325 +end -- ./compiler/lua54.can:325 +end -- ./compiler/lua54.can:325 +if # destructuringVars > 0 then -- ./compiler/lua54.can:328 +local destructured = { -- ./compiler/lua54.can:329 +["rightOp"] = t[2], -- ./compiler/lua54.can:329 +["leftOp"] = t[4] -- ./compiler/lua54.can:329 +} -- ./compiler/lua54.can:329 +r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:330 +return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:331 +end -- ./compiler/lua54.can:331 +return r -- ./compiler/lua54.can:333 end -- ./compiler/lua54.can:333 -end -- ./compiler/lua54.can:333 -if # destructuringVars > 0 then -- ./compiler/lua54.can:336 -local destructured = { -- ./compiler/lua54.can:337 -["rightOp"] = t[2], -- ./compiler/lua54.can:337 -["leftOp"] = t[4] -- ./compiler/lua54.can:337 -} -- ./compiler/lua54.can:337 -r = r .. ("local " .. push("destructuring", destructured) .. lua(destructuringVars, "_lhs") .. pop("destructuring") .. " = " .. lua(destructuringValues, "_lhs")) -- ./compiler/lua54.can:338 -return r .. DESTRUCTURING_ASSIGN(destructured, nil, true) -- ./compiler/lua54.can:339 -end -- ./compiler/lua54.can:339 -return r -- ./compiler/lua54.can:341 -end -- ./compiler/lua54.can:341 -end, -- ./compiler/lua54.can:341 -["While"] = function(t) -- ./compiler/lua54.can:345 -local r = "" -- ./compiler/lua54.can:346 -local hasContinue = any(t[2], { "Continue" }, loop) -- ./compiler/lua54.can:347 -local lets = search({ t[1] }, { "LetExpr" }) -- ./compiler/lua54.can:348 -if # lets > 0 then -- ./compiler/lua54.can:349 -r = r .. ("do" .. indent()) -- ./compiler/lua54.can:350 -for _, l in ipairs(lets) do -- ./compiler/lua54.can:351 -r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:352 +end, -- ./compiler/lua54.can:333 +["While"] = function(t) -- ./compiler/lua54.can:337 +local r = "" -- ./compiler/lua54.can:338 +local hasContinue = any(t[2], { "Continue" }, loop) -- ./compiler/lua54.can:339 +local lets = search({ t[1] }, { "LetExpr" }) -- ./compiler/lua54.can:340 +if # lets > 0 then -- ./compiler/lua54.can:341 +r = r .. ("do" .. indent()) -- ./compiler/lua54.can:342 +for _, l in ipairs(lets) do -- ./compiler/lua54.can:343 +r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:344 +end -- ./compiler/lua54.can:344 +end -- ./compiler/lua54.can:344 +r = r .. ("while " .. lua(t[1]) .. " do" .. indent()) -- ./compiler/lua54.can:347 +if # lets > 0 then -- ./compiler/lua54.can:348 +r = r .. ("do" .. indent()) -- ./compiler/lua54.can:349 +end -- ./compiler/lua54.can:349 +if hasContinue then -- ./compiler/lua54.can:351 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:352 end -- ./compiler/lua54.can:352 -end -- ./compiler/lua54.can:352 -r = r .. ("while " .. lua(t[1]) .. " do" .. indent()) -- ./compiler/lua54.can:355 -if # lets > 0 then -- ./compiler/lua54.can:356 -r = r .. ("do" .. indent()) -- ./compiler/lua54.can:357 -end -- ./compiler/lua54.can:357 -if hasContinue then -- ./compiler/lua54.can:359 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:360 -end -- ./compiler/lua54.can:360 -r = r .. (lua(t[2])) -- ./compiler/lua54.can:362 -if hasContinue then -- ./compiler/lua54.can:363 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:364 -end -- ./compiler/lua54.can:364 -r = r .. (unindent() .. "end") -- ./compiler/lua54.can:366 -if # lets > 0 then -- ./compiler/lua54.can:367 -for _, l in ipairs(lets) do -- ./compiler/lua54.can:368 -r = r .. (newline() .. lua(l, "Set")) -- ./compiler/lua54.can:369 -end -- ./compiler/lua54.can:369 -r = r .. (unindent() .. "end" .. unindent() .. "end") -- ./compiler/lua54.can:371 -end -- ./compiler/lua54.can:371 -return r -- ./compiler/lua54.can:373 -end, -- ./compiler/lua54.can:373 -["Repeat"] = function(t) -- ./compiler/lua54.can:376 -local hasContinue = any(t[1], { "Continue" }, loop) -- ./compiler/lua54.can:377 -local r = "repeat" .. indent() -- ./compiler/lua54.can:378 -if hasContinue then -- ./compiler/lua54.can:379 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:380 -end -- ./compiler/lua54.can:380 -r = r .. (lua(t[1])) -- ./compiler/lua54.can:382 -if hasContinue then -- ./compiler/lua54.can:383 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:384 -end -- ./compiler/lua54.can:384 -r = r .. (unindent() .. "until " .. lua(t[2])) -- ./compiler/lua54.can:386 -return r -- ./compiler/lua54.can:387 -end, -- ./compiler/lua54.can:387 -["If"] = function(t) -- ./compiler/lua54.can:390 -local r = "" -- ./compiler/lua54.can:391 -local toClose = 0 -- ./compiler/lua54.can:392 -local lets = search({ t[1] }, { "LetExpr" }) -- ./compiler/lua54.can:393 -if # lets > 0 then -- ./compiler/lua54.can:394 -r = r .. ("do" .. indent()) -- ./compiler/lua54.can:395 -toClose = toClose + (1) -- ./compiler/lua54.can:396 -for _, l in ipairs(lets) do -- ./compiler/lua54.can:397 -r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:398 -end -- ./compiler/lua54.can:398 -end -- ./compiler/lua54.can:398 -r = r .. ("if " .. lua(t[1]) .. " then" .. indent() .. lua(t[2]) .. unindent()) -- ./compiler/lua54.can:401 -for i = 3, # t - 1, 2 do -- ./compiler/lua54.can:402 -lets = search({ t[i] }, { "LetExpr" }) -- ./compiler/lua54.can:403 -if # lets > 0 then -- ./compiler/lua54.can:404 -r = r .. ("else" .. indent()) -- ./compiler/lua54.can:405 -toClose = toClose + (1) -- ./compiler/lua54.can:406 -for _, l in ipairs(lets) do -- ./compiler/lua54.can:407 -r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:408 +r = r .. (lua(t[2])) -- ./compiler/lua54.can:354 +if hasContinue then -- ./compiler/lua54.can:355 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:356 +end -- ./compiler/lua54.can:356 +r = r .. (unindent() .. "end") -- ./compiler/lua54.can:358 +if # lets > 0 then -- ./compiler/lua54.can:359 +for _, l in ipairs(lets) do -- ./compiler/lua54.can:360 +r = r .. (newline() .. lua(l, "Set")) -- ./compiler/lua54.can:361 +end -- ./compiler/lua54.can:361 +r = r .. (unindent() .. "end" .. unindent() .. "end") -- ./compiler/lua54.can:363 +end -- ./compiler/lua54.can:363 +return r -- ./compiler/lua54.can:365 +end, -- ./compiler/lua54.can:365 +["Repeat"] = function(t) -- ./compiler/lua54.can:368 +local hasContinue = any(t[1], { "Continue" }, loop) -- ./compiler/lua54.can:369 +local r = "repeat" .. indent() -- ./compiler/lua54.can:370 +if hasContinue then -- ./compiler/lua54.can:371 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:372 +end -- ./compiler/lua54.can:372 +r = r .. (lua(t[1])) -- ./compiler/lua54.can:374 +if hasContinue then -- ./compiler/lua54.can:375 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:376 +end -- ./compiler/lua54.can:376 +r = r .. (unindent() .. "until " .. lua(t[2])) -- ./compiler/lua54.can:378 +return r -- ./compiler/lua54.can:379 +end, -- ./compiler/lua54.can:379 +["If"] = function(t) -- ./compiler/lua54.can:382 +local r = "" -- ./compiler/lua54.can:383 +local toClose = 0 -- ./compiler/lua54.can:384 +local lets = search({ t[1] }, { "LetExpr" }) -- ./compiler/lua54.can:385 +if # lets > 0 then -- ./compiler/lua54.can:386 +r = r .. ("do" .. indent()) -- ./compiler/lua54.can:387 +toClose = toClose + (1) -- ./compiler/lua54.can:388 +for _, l in ipairs(lets) do -- ./compiler/lua54.can:389 +r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:390 +end -- ./compiler/lua54.can:390 +end -- ./compiler/lua54.can:390 +r = r .. ("if " .. lua(t[1]) .. " then" .. indent() .. lua(t[2]) .. unindent()) -- ./compiler/lua54.can:393 +for i = 3, # t - 1, 2 do -- ./compiler/lua54.can:394 +lets = search({ t[i] }, { "LetExpr" }) -- ./compiler/lua54.can:395 +if # lets > 0 then -- ./compiler/lua54.can:396 +r = r .. ("else" .. indent()) -- ./compiler/lua54.can:397 +toClose = toClose + (1) -- ./compiler/lua54.can:398 +for _, l in ipairs(lets) do -- ./compiler/lua54.can:399 +r = r .. (lua(l, "Let") .. newline()) -- ./compiler/lua54.can:400 +end -- ./compiler/lua54.can:400 +else -- ./compiler/lua54.can:400 +r = r .. ("else") -- ./compiler/lua54.can:403 +end -- ./compiler/lua54.can:403 +r = r .. ("if " .. lua(t[i]) .. " then" .. indent() .. lua(t[i + 1]) .. unindent()) -- ./compiler/lua54.can:405 +end -- ./compiler/lua54.can:405 +if # t % 2 == 1 then -- ./compiler/lua54.can:407 +r = r .. ("else" .. indent() .. lua(t[# t]) .. unindent()) -- ./compiler/lua54.can:408 end -- ./compiler/lua54.can:408 -else -- ./compiler/lua54.can:408 -r = r .. ("else") -- ./compiler/lua54.can:411 -end -- ./compiler/lua54.can:411 -r = r .. ("if " .. lua(t[i]) .. " then" .. indent() .. lua(t[i + 1]) .. unindent()) -- ./compiler/lua54.can:413 -end -- ./compiler/lua54.can:413 -if # t % 2 == 1 then -- ./compiler/lua54.can:415 -r = r .. ("else" .. indent() .. lua(t[# t]) .. unindent()) -- ./compiler/lua54.can:416 -end -- ./compiler/lua54.can:416 -r = r .. ("end") -- ./compiler/lua54.can:418 -for i = 1, toClose do -- ./compiler/lua54.can:419 -r = r .. (unindent() .. "end") -- ./compiler/lua54.can:420 -end -- ./compiler/lua54.can:420 -return r -- ./compiler/lua54.can:422 -end, -- ./compiler/lua54.can:422 -["Fornum"] = function(t) -- ./compiler/lua54.can:425 -local r = "for " .. lua(t[1]) .. " = " .. lua(t[2]) .. ", " .. lua(t[3]) -- ./compiler/lua54.can:426 -if # t == 5 then -- ./compiler/lua54.can:427 -local hasContinue = any(t[5], { "Continue" }, loop) -- ./compiler/lua54.can:428 -r = r .. (", " .. lua(t[4]) .. " do" .. indent()) -- ./compiler/lua54.can:429 -if hasContinue then -- ./compiler/lua54.can:430 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:431 -end -- ./compiler/lua54.can:431 -r = r .. (lua(t[5])) -- ./compiler/lua54.can:433 -if hasContinue then -- ./compiler/lua54.can:434 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:435 -end -- ./compiler/lua54.can:435 -return r .. unindent() .. "end" -- ./compiler/lua54.can:437 -else -- ./compiler/lua54.can:437 -local hasContinue = any(t[4], { "Continue" }, loop) -- ./compiler/lua54.can:439 -r = r .. (" do" .. indent()) -- ./compiler/lua54.can:440 -if hasContinue then -- ./compiler/lua54.can:441 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:442 -end -- ./compiler/lua54.can:442 -r = r .. (lua(t[4])) -- ./compiler/lua54.can:444 -if hasContinue then -- ./compiler/lua54.can:445 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:446 -end -- ./compiler/lua54.can:446 -return r .. unindent() .. "end" -- ./compiler/lua54.can:448 -end -- ./compiler/lua54.can:448 -end, -- ./compiler/lua54.can:448 -["Forin"] = function(t) -- ./compiler/lua54.can:452 -local destructured = {} -- ./compiler/lua54.can:453 -local hasContinue = any(t[3], { "Continue" }, loop) -- ./compiler/lua54.can:454 -local r = "for " .. push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") .. " in " .. lua(t[2], "_lhs") .. " do" .. indent() -- ./compiler/lua54.can:455 -if hasContinue then -- ./compiler/lua54.can:456 -r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:457 -end -- ./compiler/lua54.can:457 -r = r .. (DESTRUCTURING_ASSIGN(destructured, true) .. lua(t[3])) -- ./compiler/lua54.can:459 -if hasContinue then -- ./compiler/lua54.can:460 -r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:461 -end -- ./compiler/lua54.can:461 -return r .. unindent() .. "end" -- ./compiler/lua54.can:463 -end, -- ./compiler/lua54.can:463 -["Local"] = function(t) -- ./compiler/lua54.can:466 -local destructured = {} -- ./compiler/lua54.can:467 -local r = "local " .. push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") -- ./compiler/lua54.can:468 -if t[2][1] then -- ./compiler/lua54.can:469 -r = r .. (" = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:470 -end -- ./compiler/lua54.can:470 -return r .. DESTRUCTURING_ASSIGN(destructured) -- ./compiler/lua54.can:472 -end, -- ./compiler/lua54.can:472 -["Let"] = function(t) -- ./compiler/lua54.can:475 -local destructured = {} -- ./compiler/lua54.can:476 -local nameList = push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") -- ./compiler/lua54.can:477 -local r = "local " .. nameList -- ./compiler/lua54.can:478 -if t[2][1] then -- ./compiler/lua54.can:479 -if all(t[2], { -- ./compiler/lua54.can:480 -"Nil", -- ./compiler/lua54.can:480 -"Dots", -- ./compiler/lua54.can:480 -"Boolean", -- ./compiler/lua54.can:480 -"Number", -- ./compiler/lua54.can:480 -"String" -- ./compiler/lua54.can:480 -}) then -- ./compiler/lua54.can:480 -r = r .. (" = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:481 -else -- ./compiler/lua54.can:481 -r = r .. (newline() .. nameList .. " = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:483 -end -- ./compiler/lua54.can:483 -end -- ./compiler/lua54.can:483 -return r .. DESTRUCTURING_ASSIGN(destructured) -- ./compiler/lua54.can:486 +r = r .. ("end") -- ./compiler/lua54.can:410 +for i = 1, toClose do -- ./compiler/lua54.can:411 +r = r .. (unindent() .. "end") -- ./compiler/lua54.can:412 +end -- ./compiler/lua54.can:412 +return r -- ./compiler/lua54.can:414 +end, -- ./compiler/lua54.can:414 +["Fornum"] = function(t) -- ./compiler/lua54.can:417 +local r = "for " .. lua(t[1]) .. " = " .. lua(t[2]) .. ", " .. lua(t[3]) -- ./compiler/lua54.can:418 +if # t == 5 then -- ./compiler/lua54.can:419 +local hasContinue = any(t[5], { "Continue" }, loop) -- ./compiler/lua54.can:420 +r = r .. (", " .. lua(t[4]) .. " do" .. indent()) -- ./compiler/lua54.can:421 +if hasContinue then -- ./compiler/lua54.can:422 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:423 +end -- ./compiler/lua54.can:423 +r = r .. (lua(t[5])) -- ./compiler/lua54.can:425 +if hasContinue then -- ./compiler/lua54.can:426 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:427 +end -- ./compiler/lua54.can:427 +return r .. unindent() .. "end" -- ./compiler/lua54.can:429 +else -- ./compiler/lua54.can:429 +local hasContinue = any(t[4], { "Continue" }, loop) -- ./compiler/lua54.can:431 +r = r .. (" do" .. indent()) -- ./compiler/lua54.can:432 +if hasContinue then -- ./compiler/lua54.can:433 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:434 +end -- ./compiler/lua54.can:434 +r = r .. (lua(t[4])) -- ./compiler/lua54.can:436 +if hasContinue then -- ./compiler/lua54.can:437 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:438 +end -- ./compiler/lua54.can:438 +return r .. unindent() .. "end" -- ./compiler/lua54.can:440 +end -- ./compiler/lua54.can:440 +end, -- ./compiler/lua54.can:440 +["Forin"] = function(t) -- ./compiler/lua54.can:444 +local destructured = {} -- ./compiler/lua54.can:445 +local hasContinue = any(t[3], { "Continue" }, loop) -- ./compiler/lua54.can:446 +local r = "for " .. push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") .. " in " .. lua(t[2], "_lhs") .. " do" .. indent() -- ./compiler/lua54.can:447 +if hasContinue then -- ./compiler/lua54.can:448 +r = r .. (CONTINUE_START()) -- ./compiler/lua54.can:449 +end -- ./compiler/lua54.can:449 +r = r .. (DESTRUCTURING_ASSIGN(destructured, true) .. lua(t[3])) -- ./compiler/lua54.can:451 +if hasContinue then -- ./compiler/lua54.can:452 +r = r .. (CONTINUE_STOP()) -- ./compiler/lua54.can:453 +end -- ./compiler/lua54.can:453 +return r .. unindent() .. "end" -- ./compiler/lua54.can:455 +end, -- ./compiler/lua54.can:455 +["Local"] = function(t) -- ./compiler/lua54.can:458 +local destructured = {} -- ./compiler/lua54.can:459 +local r = "local " .. push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") -- ./compiler/lua54.can:460 +if t[2][1] then -- ./compiler/lua54.can:461 +r = r .. (" = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:462 +end -- ./compiler/lua54.can:462 +return r .. DESTRUCTURING_ASSIGN(destructured) -- ./compiler/lua54.can:464 +end, -- ./compiler/lua54.can:464 +["Let"] = function(t) -- ./compiler/lua54.can:467 +local destructured = {} -- ./compiler/lua54.can:468 +local nameList = push("destructuring", destructured) .. lua(t[1], "_lhs") .. pop("destructuring") -- ./compiler/lua54.can:469 +local r = "local " .. nameList -- ./compiler/lua54.can:470 +if t[2][1] then -- ./compiler/lua54.can:471 +if all(t[2], { -- ./compiler/lua54.can:472 +"Nil", -- ./compiler/lua54.can:472 +"Dots", -- ./compiler/lua54.can:472 +"Boolean", -- ./compiler/lua54.can:472 +"Number", -- ./compiler/lua54.can:472 +"String" -- ./compiler/lua54.can:472 +}) then -- ./compiler/lua54.can:472 +r = r .. (" = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:473 +else -- ./compiler/lua54.can:473 +r = r .. (newline() .. nameList .. " = " .. lua(t[2], "_lhs")) -- ./compiler/lua54.can:475 +end -- ./compiler/lua54.can:475 +end -- ./compiler/lua54.can:475 +return r .. DESTRUCTURING_ASSIGN(destructured) -- ./compiler/lua54.can:478 +end, -- ./compiler/lua54.can:478 +["Localrec"] = function(t) -- ./compiler/lua54.can:481 +return "local function " .. lua(t[1][1]) .. lua(t[2][1], "_functionWithoutKeyword") -- ./compiler/lua54.can:482 +end, -- ./compiler/lua54.can:482 +["Goto"] = function(t) -- ./compiler/lua54.can:485 +return "goto " .. lua(t, "Id") -- ./compiler/lua54.can:486 end, -- ./compiler/lua54.can:486 -["Localrec"] = function(t) -- ./compiler/lua54.can:489 -return "local function " .. lua(t[1][1]) .. lua(t[2][1], "_functionWithoutKeyword") -- ./compiler/lua54.can:490 +["Label"] = function(t) -- ./compiler/lua54.can:489 +return "::" .. lua(t, "Id") .. "::" -- ./compiler/lua54.can:490 end, -- ./compiler/lua54.can:490 -["Goto"] = function(t) -- ./compiler/lua54.can:493 -return "goto " .. lua(t, "Id") -- ./compiler/lua54.can:494 -end, -- ./compiler/lua54.can:494 -["Label"] = function(t) -- ./compiler/lua54.can:497 -return "::" .. lua(t, "Id") .. "::" -- ./compiler/lua54.can:498 -end, -- ./compiler/lua54.can:498 -["Return"] = function(t) -- ./compiler/lua54.can:501 -local push = peek("push") -- ./compiler/lua54.can:502 -if push then -- ./compiler/lua54.can:503 -local r = "" -- ./compiler/lua54.can:504 -for _, val in ipairs(t) do -- ./compiler/lua54.can:505 -r = r .. (push .. "[#" .. push .. "+1] = " .. lua(val) .. newline()) -- ./compiler/lua54.can:506 -end -- ./compiler/lua54.can:506 -return r .. "return " .. UNPACK(push) -- ./compiler/lua54.can:508 -else -- ./compiler/lua54.can:508 -return "return " .. lua(t, "_lhs") -- ./compiler/lua54.can:510 +["Return"] = function(t) -- ./compiler/lua54.can:493 +local push = peek("push") -- ./compiler/lua54.can:494 +if push then -- ./compiler/lua54.can:495 +local r = "" -- ./compiler/lua54.can:496 +for _, val in ipairs(t) do -- ./compiler/lua54.can:497 +r = r .. (push .. "[#" .. push .. "+1] = " .. lua(val) .. newline()) -- ./compiler/lua54.can:498 +end -- ./compiler/lua54.can:498 +return r .. "return " .. UNPACK(push) -- ./compiler/lua54.can:500 +else -- ./compiler/lua54.can:500 +return "return " .. lua(t, "_lhs") -- ./compiler/lua54.can:502 +end -- ./compiler/lua54.can:502 +end, -- ./compiler/lua54.can:502 +["Push"] = function(t) -- ./compiler/lua54.can:506 +local var = assert(peek("push"), "no context given for push") -- ./compiler/lua54.can:507 +r = "" -- ./compiler/lua54.can:508 +for i = 1, # t - 1, 1 do -- ./compiler/lua54.can:509 +r = r .. (var .. "[#" .. var .. "+1] = " .. lua(t[i]) .. newline()) -- ./compiler/lua54.can:510 end -- ./compiler/lua54.can:510 -end, -- ./compiler/lua54.can:510 -["Push"] = function(t) -- ./compiler/lua54.can:514 -local var = assert(peek("push"), "no context given for push") -- ./compiler/lua54.can:515 -r = "" -- ./compiler/lua54.can:516 -for i = 1, # t - 1, 1 do -- ./compiler/lua54.can:517 -r = r .. (var .. "[#" .. var .. "+1] = " .. lua(t[i]) .. newline()) -- ./compiler/lua54.can:518 -end -- ./compiler/lua54.can:518 -if t[# t] then -- ./compiler/lua54.can:520 -if t[# t]["tag"] == "Call" then -- ./compiler/lua54.can:521 -r = r .. (APPEND(var, lua(t[# t]))) -- ./compiler/lua54.can:522 -else -- ./compiler/lua54.can:522 -r = r .. (var .. "[#" .. var .. "+1] = " .. lua(t[# t])) -- ./compiler/lua54.can:524 -end -- ./compiler/lua54.can:524 -end -- ./compiler/lua54.can:524 -return r -- ./compiler/lua54.can:527 +if t[# t] then -- ./compiler/lua54.can:512 +if t[# t]["tag"] == "Call" then -- ./compiler/lua54.can:513 +r = r .. (APPEND(var, lua(t[# t]))) -- ./compiler/lua54.can:514 +else -- ./compiler/lua54.can:514 +r = r .. (var .. "[#" .. var .. "+1] = " .. lua(t[# t])) -- ./compiler/lua54.can:516 +end -- ./compiler/lua54.can:516 +end -- ./compiler/lua54.can:516 +return r -- ./compiler/lua54.can:519 +end, -- ./compiler/lua54.can:519 +["Break"] = function() -- ./compiler/lua54.can:522 +return "break" -- ./compiler/lua54.can:523 +end, -- ./compiler/lua54.can:523 +["Continue"] = function() -- ./compiler/lua54.can:526 +return "goto " .. var("continue") -- ./compiler/lua54.can:527 end, -- ./compiler/lua54.can:527 -["Break"] = function() -- ./compiler/lua54.can:530 -return "break" -- ./compiler/lua54.can:531 -end, -- ./compiler/lua54.can:531 -["Continue"] = function() -- ./compiler/lua54.can:534 -return "goto " .. var("continue") -- ./compiler/lua54.can:535 +["Nil"] = function() -- ./compiler/lua54.can:534 +return "nil" -- ./compiler/lua54.can:535 end, -- ./compiler/lua54.can:535 -["Nil"] = function() -- ./compiler/lua54.can:542 -return "nil" -- ./compiler/lua54.can:543 +["Dots"] = function() -- ./compiler/lua54.can:538 +return "..." -- ./compiler/lua54.can:539 +end, -- ./compiler/lua54.can:539 +["Boolean"] = function(t) -- ./compiler/lua54.can:542 +return tostring(t[1]) -- ./compiler/lua54.can:543 end, -- ./compiler/lua54.can:543 -["Dots"] = function() -- ./compiler/lua54.can:546 -local macroargs = peek("macroargs") -- ./compiler/lua54.can:547 -if macroargs and not nomacro["variables"]["..."] and macroargs["..."] then -- ./compiler/lua54.can:548 -nomacro["variables"]["..."] = true -- ./compiler/lua54.can:549 -local r = lua(macroargs["..."], "_lhs") -- ./compiler/lua54.can:550 -nomacro["variables"]["..."] = nil -- ./compiler/lua54.can:551 -return r -- ./compiler/lua54.can:552 -else -- ./compiler/lua54.can:552 -return "..." -- ./compiler/lua54.can:554 -end -- ./compiler/lua54.can:554 -end, -- ./compiler/lua54.can:554 -["Boolean"] = function(t) -- ./compiler/lua54.can:558 -return tostring(t[1]) -- ./compiler/lua54.can:559 -end, -- ./compiler/lua54.can:559 -["Number"] = function(t) -- ./compiler/lua54.can:562 -return tostring(t[1]) -- ./compiler/lua54.can:563 -end, -- ./compiler/lua54.can:563 -["String"] = function(t) -- ./compiler/lua54.can:566 -return ("%q"):format(t[1]) -- ./compiler/lua54.can:567 -end, -- ./compiler/lua54.can:567 -["_functionWithoutKeyword"] = function(t) -- ./compiler/lua54.can:570 -local r = "(" -- ./compiler/lua54.can:571 -local decl = {} -- ./compiler/lua54.can:572 -if t[1][1] then -- ./compiler/lua54.can:573 -if t[1][1]["tag"] == "ParPair" then -- ./compiler/lua54.can:574 -local id = lua(t[1][1][1]) -- ./compiler/lua54.can:575 -indentLevel = indentLevel + (1) -- ./compiler/lua54.can:576 -table["insert"](decl, "if " .. id .. " == nil then " .. id .. " = " .. lua(t[1][1][2]) .. " end") -- ./compiler/lua54.can:577 -indentLevel = indentLevel - (1) -- ./compiler/lua54.can:578 -r = r .. (id) -- ./compiler/lua54.can:579 -else -- ./compiler/lua54.can:579 -r = r .. (lua(t[1][1])) -- ./compiler/lua54.can:581 +["Number"] = function(t) -- ./compiler/lua54.can:546 +return tostring(t[1]) -- ./compiler/lua54.can:547 +end, -- ./compiler/lua54.can:547 +["String"] = function(t) -- ./compiler/lua54.can:550 +return ("%q"):format(t[1]) -- ./compiler/lua54.can:551 +end, -- ./compiler/lua54.can:551 +["_functionWithoutKeyword"] = function(t) -- ./compiler/lua54.can:554 +local r = "(" -- ./compiler/lua54.can:555 +local decl = {} -- ./compiler/lua54.can:556 +if t[1][1] then -- ./compiler/lua54.can:557 +if t[1][1]["tag"] == "ParPair" then -- ./compiler/lua54.can:558 +local id = lua(t[1][1][1]) -- ./compiler/lua54.can:559 +indentLevel = indentLevel + (1) -- ./compiler/lua54.can:560 +table["insert"](decl, "if " .. id .. " == nil then " .. id .. " = " .. lua(t[1][1][2]) .. " end") -- ./compiler/lua54.can:561 +indentLevel = indentLevel - (1) -- ./compiler/lua54.can:562 +r = r .. (id) -- ./compiler/lua54.can:563 +else -- ./compiler/lua54.can:563 +r = r .. (lua(t[1][1])) -- ./compiler/lua54.can:565 +end -- ./compiler/lua54.can:565 +for i = 2, # t[1], 1 do -- ./compiler/lua54.can:567 +if t[1][i]["tag"] == "ParPair" then -- ./compiler/lua54.can:568 +local id = lua(t[1][i][1]) -- ./compiler/lua54.can:569 +indentLevel = indentLevel + (1) -- ./compiler/lua54.can:570 +table["insert"](decl, "if " .. id .. " == nil then " .. id .. " = " .. lua(t[1][i][2]) .. " end") -- ./compiler/lua54.can:571 +indentLevel = indentLevel - (1) -- ./compiler/lua54.can:572 +r = r .. (", " .. id) -- ./compiler/lua54.can:573 +else -- ./compiler/lua54.can:573 +r = r .. (", " .. lua(t[1][i])) -- ./compiler/lua54.can:575 +end -- ./compiler/lua54.can:575 +end -- ./compiler/lua54.can:575 +end -- ./compiler/lua54.can:575 +r = r .. (")" .. indent()) -- ./compiler/lua54.can:579 +for _, d in ipairs(decl) do -- ./compiler/lua54.can:580 +r = r .. (d .. newline()) -- ./compiler/lua54.can:581 end -- ./compiler/lua54.can:581 -for i = 2, # t[1], 1 do -- ./compiler/lua54.can:583 -if t[1][i]["tag"] == "ParPair" then -- ./compiler/lua54.can:584 -local id = lua(t[1][i][1]) -- ./compiler/lua54.can:585 -indentLevel = indentLevel + (1) -- ./compiler/lua54.can:586 -table["insert"](decl, "if " .. id .. " == nil then " .. id .. " = " .. lua(t[1][i][2]) .. " end") -- ./compiler/lua54.can:587 -indentLevel = indentLevel - (1) -- ./compiler/lua54.can:588 -r = r .. (", " .. id) -- ./compiler/lua54.can:589 -else -- ./compiler/lua54.can:589 -r = r .. (", " .. lua(t[1][i])) -- ./compiler/lua54.can:591 -end -- ./compiler/lua54.can:591 -end -- ./compiler/lua54.can:591 -end -- ./compiler/lua54.can:591 -r = r .. (")" .. indent()) -- ./compiler/lua54.can:595 -for _, d in ipairs(decl) do -- ./compiler/lua54.can:596 -r = r .. (d .. newline()) -- ./compiler/lua54.can:597 -end -- ./compiler/lua54.can:597 -if t[2][# t[2]] and t[2][# t[2]]["tag"] == "Push" then -- ./compiler/lua54.can:599 -t[2][# t[2]]["tag"] = "Return" -- ./compiler/lua54.can:600 -end -- ./compiler/lua54.can:600 -local hasPush = any(t[2], { "Push" }, func) -- ./compiler/lua54.can:602 -if hasPush then -- ./compiler/lua54.can:603 -r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:604 -else -- ./compiler/lua54.can:604 -push("push", false) -- ./compiler/lua54.can:606 -end -- ./compiler/lua54.can:606 -r = r .. (lua(t[2])) -- ./compiler/lua54.can:608 -if hasPush and (t[2][# t[2]] and t[2][# t[2]]["tag"] ~= "Return") then -- ./compiler/lua54.can:609 -r = r .. (newline() .. "return " .. UNPACK(var("push"))) -- ./compiler/lua54.can:610 -end -- ./compiler/lua54.can:610 -pop("push") -- ./compiler/lua54.can:612 -return r .. unindent() .. "end" -- ./compiler/lua54.can:613 -end, -- ./compiler/lua54.can:613 -["Function"] = function(t) -- ./compiler/lua54.can:615 -return "function" .. lua(t, "_functionWithoutKeyword") -- ./compiler/lua54.can:616 -end, -- ./compiler/lua54.can:616 -["Pair"] = function(t) -- ./compiler/lua54.can:619 -return "[" .. lua(t[1]) .. "] = " .. lua(t[2]) -- ./compiler/lua54.can:620 -end, -- ./compiler/lua54.can:620 -["Table"] = function(t) -- ./compiler/lua54.can:622 -if # t == 0 then -- ./compiler/lua54.can:623 -return "{}" -- ./compiler/lua54.can:624 -elseif # t == 1 then -- ./compiler/lua54.can:625 -return "{ " .. lua(t, "_lhs") .. " }" -- ./compiler/lua54.can:626 +if t[2][# t[2]] and t[2][# t[2]]["tag"] == "Push" then -- ./compiler/lua54.can:583 +t[2][# t[2]]["tag"] = "Return" -- ./compiler/lua54.can:584 +end -- ./compiler/lua54.can:584 +local hasPush = any(t[2], { "Push" }, func) -- ./compiler/lua54.can:586 +if hasPush then -- ./compiler/lua54.can:587 +r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:588 +else -- ./compiler/lua54.can:588 +push("push", false) -- ./compiler/lua54.can:590 +end -- ./compiler/lua54.can:590 +r = r .. (lua(t[2])) -- ./compiler/lua54.can:592 +if hasPush and (t[2][# t[2]] and t[2][# t[2]]["tag"] ~= "Return") then -- ./compiler/lua54.can:593 +r = r .. (newline() .. "return " .. UNPACK(var("push"))) -- ./compiler/lua54.can:594 +end -- ./compiler/lua54.can:594 +pop("push") -- ./compiler/lua54.can:596 +return r .. unindent() .. "end" -- ./compiler/lua54.can:597 +end, -- ./compiler/lua54.can:597 +["Function"] = function(t) -- ./compiler/lua54.can:599 +return "function" .. lua(t, "_functionWithoutKeyword") -- ./compiler/lua54.can:600 +end, -- ./compiler/lua54.can:600 +["Pair"] = function(t) -- ./compiler/lua54.can:603 +return "[" .. lua(t[1]) .. "] = " .. lua(t[2]) -- ./compiler/lua54.can:604 +end, -- ./compiler/lua54.can:604 +["Table"] = function(t) -- ./compiler/lua54.can:606 +if # t == 0 then -- ./compiler/lua54.can:607 +return "{}" -- ./compiler/lua54.can:608 +elseif # t == 1 then -- ./compiler/lua54.can:609 +return "{ " .. lua(t, "_lhs") .. " }" -- ./compiler/lua54.can:610 +else -- ./compiler/lua54.can:610 +return "{" .. indent() .. lua(t, "_lhs", nil, true) .. unindent() .. "}" -- ./compiler/lua54.can:612 +end -- ./compiler/lua54.can:612 +end, -- ./compiler/lua54.can:612 +["TableCompr"] = function(t) -- ./compiler/lua54.can:616 +return push("push", "self") .. "(function()" .. indent() .. "local self = {}" .. newline() .. lua(t[1]) .. newline() .. "return self" .. unindent() .. "end)()" .. pop("push") -- ./compiler/lua54.can:617 +end, -- ./compiler/lua54.can:617 +["Op"] = function(t) -- ./compiler/lua54.can:620 +local r -- ./compiler/lua54.can:621 +if # t == 2 then -- ./compiler/lua54.can:622 +if type(tags["_opid"][t[1]]) == "string" then -- ./compiler/lua54.can:623 +r = tags["_opid"][t[1]] .. " " .. lua(t[2]) -- ./compiler/lua54.can:624 +else -- ./compiler/lua54.can:624 +r = tags["_opid"][t[1]](t[2]) -- ./compiler/lua54.can:626 +end -- ./compiler/lua54.can:626 else -- ./compiler/lua54.can:626 -return "{" .. indent() .. lua(t, "_lhs", nil, true) .. unindent() .. "}" -- ./compiler/lua54.can:628 -end -- ./compiler/lua54.can:628 -end, -- ./compiler/lua54.can:628 -["TableCompr"] = function(t) -- ./compiler/lua54.can:632 -return push("push", "self") .. "(function()" .. indent() .. "local self = {}" .. newline() .. lua(t[1]) .. newline() .. "return self" .. unindent() .. "end)()" .. pop("push") -- ./compiler/lua54.can:633 -end, -- ./compiler/lua54.can:633 -["Op"] = function(t) -- ./compiler/lua54.can:636 -local r -- ./compiler/lua54.can:637 -if # t == 2 then -- ./compiler/lua54.can:638 -if type(tags["_opid"][t[1]]) == "string" then -- ./compiler/lua54.can:639 -r = tags["_opid"][t[1]] .. " " .. lua(t[2]) -- ./compiler/lua54.can:640 -else -- ./compiler/lua54.can:640 -r = tags["_opid"][t[1]](t[2]) -- ./compiler/lua54.can:642 -end -- ./compiler/lua54.can:642 -else -- ./compiler/lua54.can:642 -if type(tags["_opid"][t[1]]) == "string" then -- ./compiler/lua54.can:645 -r = lua(t[2]) .. " " .. tags["_opid"][t[1]] .. " " .. lua(t[3]) -- ./compiler/lua54.can:646 -else -- ./compiler/lua54.can:646 -r = tags["_opid"][t[1]](t[2], t[3]) -- ./compiler/lua54.can:648 -end -- ./compiler/lua54.can:648 -end -- ./compiler/lua54.can:648 -return r -- ./compiler/lua54.can:651 -end, -- ./compiler/lua54.can:651 -["Paren"] = function(t) -- ./compiler/lua54.can:654 -return "(" .. lua(t[1]) .. ")" -- ./compiler/lua54.can:655 -end, -- ./compiler/lua54.can:655 -["MethodStub"] = function(t) -- ./compiler/lua54.can:658 -return "(function()" .. indent() .. "local " .. var("object") .. " = " .. lua(t[1]) .. newline() .. "local " .. var("method") .. " = " .. var("object") .. "." .. lua(t[2], "Id") .. newline() .. "if " .. var("method") .. " == nil then return nil end" .. newline() .. "return function(...) return " .. var("method") .. "(" .. var("object") .. ", ...) end" .. unindent() .. "end)()" -- ./compiler/lua54.can:664 -end, -- ./compiler/lua54.can:664 -["SafeMethodStub"] = function(t) -- ./compiler/lua54.can:667 -return "(function()" .. indent() .. "local " .. var("object") .. " = " .. lua(t[1]) .. newline() .. "if " .. var("object") .. " == nil then return nil end" .. newline() .. "local " .. var("method") .. " = " .. var("object") .. "." .. lua(t[2], "Id") .. newline() .. "if " .. var("method") .. " == nil then return nil end" .. newline() .. "return function(...) return " .. var("method") .. "(" .. var("object") .. ", ...) end" .. unindent() .. "end)()" -- ./compiler/lua54.can:674 -end, -- ./compiler/lua54.can:674 -["LetExpr"] = function(t) -- ./compiler/lua54.can:681 -return lua(t[1][1]) -- ./compiler/lua54.can:682 -end, -- ./compiler/lua54.can:682 -["_statexpr"] = function(t, stat) -- ./compiler/lua54.can:686 -local hasPush = any(t, { "Push" }, func) -- ./compiler/lua54.can:687 -local r = "(function()" .. indent() -- ./compiler/lua54.can:688 -if hasPush then -- ./compiler/lua54.can:689 -r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:690 -else -- ./compiler/lua54.can:690 -push("push", false) -- ./compiler/lua54.can:692 -end -- ./compiler/lua54.can:692 -r = r .. (lua(t, stat)) -- ./compiler/lua54.can:694 -if hasPush then -- ./compiler/lua54.can:695 -r = r .. (newline() .. "return " .. UNPACK(var("push"))) -- ./compiler/lua54.can:696 -end -- ./compiler/lua54.can:696 -pop("push") -- ./compiler/lua54.can:698 -r = r .. (unindent() .. "end)()") -- ./compiler/lua54.can:699 -return r -- ./compiler/lua54.can:700 -end, -- ./compiler/lua54.can:700 -["DoExpr"] = function(t) -- ./compiler/lua54.can:703 -if t[# t]["tag"] == "Push" then -- ./compiler/lua54.can:704 -t[# t]["tag"] = "Return" -- ./compiler/lua54.can:705 -end -- ./compiler/lua54.can:705 -return lua(t, "_statexpr", "Do") -- ./compiler/lua54.can:707 -end, -- ./compiler/lua54.can:707 -["WhileExpr"] = function(t) -- ./compiler/lua54.can:710 -return lua(t, "_statexpr", "While") -- ./compiler/lua54.can:711 -end, -- ./compiler/lua54.can:711 -["RepeatExpr"] = function(t) -- ./compiler/lua54.can:714 -return lua(t, "_statexpr", "Repeat") -- ./compiler/lua54.can:715 -end, -- ./compiler/lua54.can:715 -["IfExpr"] = function(t) -- ./compiler/lua54.can:718 -for i = 2, # t do -- ./compiler/lua54.can:719 -local block = t[i] -- ./compiler/lua54.can:720 -if block[# block] and block[# block]["tag"] == "Push" then -- ./compiler/lua54.can:721 -block[# block]["tag"] = "Return" -- ./compiler/lua54.can:722 -end -- ./compiler/lua54.can:722 -end -- ./compiler/lua54.can:722 -return lua(t, "_statexpr", "If") -- ./compiler/lua54.can:725 -end, -- ./compiler/lua54.can:725 -["FornumExpr"] = function(t) -- ./compiler/lua54.can:728 -return lua(t, "_statexpr", "Fornum") -- ./compiler/lua54.can:729 -end, -- ./compiler/lua54.can:729 -["ForinExpr"] = function(t) -- ./compiler/lua54.can:732 -return lua(t, "_statexpr", "Forin") -- ./compiler/lua54.can:733 +if type(tags["_opid"][t[1]]) == "string" then -- ./compiler/lua54.can:629 +r = lua(t[2]) .. " " .. tags["_opid"][t[1]] .. " " .. lua(t[3]) -- ./compiler/lua54.can:630 +else -- ./compiler/lua54.can:630 +r = tags["_opid"][t[1]](t[2], t[3]) -- ./compiler/lua54.can:632 +end -- ./compiler/lua54.can:632 +end -- ./compiler/lua54.can:632 +return r -- ./compiler/lua54.can:635 +end, -- ./compiler/lua54.can:635 +["Paren"] = function(t) -- ./compiler/lua54.can:638 +return "(" .. lua(t[1]) .. ")" -- ./compiler/lua54.can:639 +end, -- ./compiler/lua54.can:639 +["MethodStub"] = function(t) -- ./compiler/lua54.can:642 +return "(function()" .. indent() .. "local " .. var("object") .. " = " .. lua(t[1]) .. newline() .. "local " .. var("method") .. " = " .. var("object") .. "." .. lua(t[2], "Id") .. newline() .. "if " .. var("method") .. " == nil then return nil end" .. newline() .. "return function(...) return " .. var("method") .. "(" .. var("object") .. ", ...) end" .. unindent() .. "end)()" -- ./compiler/lua54.can:648 +end, -- ./compiler/lua54.can:648 +["SafeMethodStub"] = function(t) -- ./compiler/lua54.can:651 +return "(function()" .. indent() .. "local " .. var("object") .. " = " .. lua(t[1]) .. newline() .. "if " .. var("object") .. " == nil then return nil end" .. newline() .. "local " .. var("method") .. " = " .. var("object") .. "." .. lua(t[2], "Id") .. newline() .. "if " .. var("method") .. " == nil then return nil end" .. newline() .. "return function(...) return " .. var("method") .. "(" .. var("object") .. ", ...) end" .. unindent() .. "end)()" -- ./compiler/lua54.can:658 +end, -- ./compiler/lua54.can:658 +["LetExpr"] = function(t) -- ./compiler/lua54.can:665 +return lua(t[1][1]) -- ./compiler/lua54.can:666 +end, -- ./compiler/lua54.can:666 +["_statexpr"] = function(t, stat) -- ./compiler/lua54.can:670 +local hasPush = any(t, { "Push" }, func) -- ./compiler/lua54.can:671 +local r = "(function()" .. indent() -- ./compiler/lua54.can:672 +if hasPush then -- ./compiler/lua54.can:673 +r = r .. (push("push", var("push")) .. "local " .. var("push") .. " = {}" .. newline()) -- ./compiler/lua54.can:674 +else -- ./compiler/lua54.can:674 +push("push", false) -- ./compiler/lua54.can:676 +end -- ./compiler/lua54.can:676 +r = r .. (lua(t, stat)) -- ./compiler/lua54.can:678 +if hasPush then -- ./compiler/lua54.can:679 +r = r .. (newline() .. "return " .. UNPACK(var("push"))) -- ./compiler/lua54.can:680 +end -- ./compiler/lua54.can:680 +pop("push") -- ./compiler/lua54.can:682 +r = r .. (unindent() .. "end)()") -- ./compiler/lua54.can:683 +return r -- ./compiler/lua54.can:684 +end, -- ./compiler/lua54.can:684 +["DoExpr"] = function(t) -- ./compiler/lua54.can:687 +if t[# t]["tag"] == "Push" then -- ./compiler/lua54.can:688 +t[# t]["tag"] = "Return" -- ./compiler/lua54.can:689 +end -- ./compiler/lua54.can:689 +return lua(t, "_statexpr", "Do") -- ./compiler/lua54.can:691 +end, -- ./compiler/lua54.can:691 +["WhileExpr"] = function(t) -- ./compiler/lua54.can:694 +return lua(t, "_statexpr", "While") -- ./compiler/lua54.can:695 +end, -- ./compiler/lua54.can:695 +["RepeatExpr"] = function(t) -- ./compiler/lua54.can:698 +return lua(t, "_statexpr", "Repeat") -- ./compiler/lua54.can:699 +end, -- ./compiler/lua54.can:699 +["IfExpr"] = function(t) -- ./compiler/lua54.can:702 +for i = 2, # t do -- ./compiler/lua54.can:703 +local block = t[i] -- ./compiler/lua54.can:704 +if block[# block] and block[# block]["tag"] == "Push" then -- ./compiler/lua54.can:705 +block[# block]["tag"] = "Return" -- ./compiler/lua54.can:706 +end -- ./compiler/lua54.can:706 +end -- ./compiler/lua54.can:706 +return lua(t, "_statexpr", "If") -- ./compiler/lua54.can:709 +end, -- ./compiler/lua54.can:709 +["FornumExpr"] = function(t) -- ./compiler/lua54.can:712 +return lua(t, "_statexpr", "Fornum") -- ./compiler/lua54.can:713 +end, -- ./compiler/lua54.can:713 +["ForinExpr"] = function(t) -- ./compiler/lua54.can:716 +return lua(t, "_statexpr", "Forin") -- ./compiler/lua54.can:717 +end, -- ./compiler/lua54.can:717 +["Call"] = function(t) -- ./compiler/lua54.can:723 +if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua54.can:724 +return "(" .. lua(t[1]) .. ")(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:725 +elseif t[1]["tag"] == "MethodStub" then -- ./compiler/lua54.can:726 +if t[1][1]["tag"] == "String" or t[1][1]["tag"] == "Table" then -- ./compiler/lua54.can:727 +return "(" .. lua(t[1][1]) .. "):" .. lua(t[1][2], "Id") .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:728 +else -- ./compiler/lua54.can:728 +return lua(t[1][1]) .. ":" .. lua(t[1][2], "Id") .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:730 +end -- ./compiler/lua54.can:730 +else -- ./compiler/lua54.can:730 +return lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:733 +end -- ./compiler/lua54.can:733 end, -- ./compiler/lua54.can:733 -["Call"] = function(t) -- ./compiler/lua54.can:739 -if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua54.can:740 -return "(" .. lua(t[1]) .. ")(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:741 -elseif t[1]["tag"] == "Id" and not nomacro["functions"][t[1][1]] and macros["functions"][t[1][1]] then -- ./compiler/lua54.can:742 -local macro = macros["functions"][t[1][1]] -- ./compiler/lua54.can:743 -local replacement = macro["replacement"] -- ./compiler/lua54.can:744 -local r -- ./compiler/lua54.can:745 -nomacro["functions"][t[1][1]] = true -- ./compiler/lua54.can:746 -if type(replacement) == "function" then -- ./compiler/lua54.can:747 -local args = {} -- ./compiler/lua54.can:748 -for i = 2, # t do -- ./compiler/lua54.can:749 -table["insert"](args, lua(t[i])) -- ./compiler/lua54.can:750 -end -- ./compiler/lua54.can:750 -r = replacement(unpack(args)) -- ./compiler/lua54.can:752 -else -- ./compiler/lua54.can:752 -local macroargs = util["merge"](peek("macroargs")) -- ./compiler/lua54.can:754 -for i, arg in ipairs(macro["args"]) do -- ./compiler/lua54.can:755 -if arg["tag"] == "Dots" then -- ./compiler/lua54.can:756 -macroargs["..."] = (function() -- ./compiler/lua54.can:757 -local self = {} -- ./compiler/lua54.can:757 -for j = i + 1, # t do -- ./compiler/lua54.can:757 -self[#self+1] = t[j] -- ./compiler/lua54.can:757 -end -- ./compiler/lua54.can:757 -return self -- ./compiler/lua54.can:757 -end)() -- ./compiler/lua54.can:757 -elseif arg["tag"] == "Id" then -- ./compiler/lua54.can:758 -if t[i + 1] == nil then -- ./compiler/lua54.can:759 -error(("bad argument #%s to macro %s (value expected)"):format(i, t[1][1])) -- ./compiler/lua54.can:760 -end -- ./compiler/lua54.can:760 -macroargs[arg[1]] = t[i + 1] -- ./compiler/lua54.can:762 -else -- ./compiler/lua54.can:762 -error(("unexpected argument type %s in macro %s"):format(arg["tag"], t[1][1])) -- ./compiler/lua54.can:764 -end -- ./compiler/lua54.can:764 -end -- ./compiler/lua54.can:764 -push("macroargs", macroargs) -- ./compiler/lua54.can:767 -r = lua(replacement) -- ./compiler/lua54.can:768 -pop("macroargs") -- ./compiler/lua54.can:769 -end -- ./compiler/lua54.can:769 -nomacro["functions"][t[1][1]] = nil -- ./compiler/lua54.can:771 -return r -- ./compiler/lua54.can:772 -elseif t[1]["tag"] == "MethodStub" then -- ./compiler/lua54.can:773 -if t[1][1]["tag"] == "String" or t[1][1]["tag"] == "Table" then -- ./compiler/lua54.can:774 -return "(" .. lua(t[1][1]) .. "):" .. lua(t[1][2], "Id") .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:775 -else -- ./compiler/lua54.can:775 -return lua(t[1][1]) .. ":" .. lua(t[1][2], "Id") .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:777 -end -- ./compiler/lua54.can:777 -else -- ./compiler/lua54.can:777 -return lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ")" -- ./compiler/lua54.can:780 -end -- ./compiler/lua54.can:780 -end, -- ./compiler/lua54.can:780 -["SafeCall"] = function(t) -- ./compiler/lua54.can:784 -if t[1]["tag"] ~= "Id" then -- ./compiler/lua54.can:785 -return lua(t, "SafeIndex") -- ./compiler/lua54.can:786 -else -- ./compiler/lua54.can:786 -return "(" .. lua(t[1]) .. " ~= nil and " .. lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ") or nil)" -- ./compiler/lua54.can:788 -end -- ./compiler/lua54.can:788 -end, -- ./compiler/lua54.can:788 -["_lhs"] = function(t, start, newlines) -- ./compiler/lua54.can:793 -if start == nil then start = 1 end -- ./compiler/lua54.can:793 -local r -- ./compiler/lua54.can:794 -if t[start] then -- ./compiler/lua54.can:795 -r = lua(t[start]) -- ./compiler/lua54.can:796 -for i = start + 1, # t, 1 do -- ./compiler/lua54.can:797 -r = r .. ("," .. (newlines and newline() or " ") .. lua(t[i])) -- ./compiler/lua54.can:798 -end -- ./compiler/lua54.can:798 -else -- ./compiler/lua54.can:798 -r = "" -- ./compiler/lua54.can:801 -end -- ./compiler/lua54.can:801 -return r -- ./compiler/lua54.can:803 -end, -- ./compiler/lua54.can:803 -["Id"] = function(t) -- ./compiler/lua54.can:806 -local r = t[1] -- ./compiler/lua54.can:807 -local macroargs = peek("macroargs") -- ./compiler/lua54.can:808 -if not nomacro["variables"][t[1]] then -- ./compiler/lua54.can:809 -nomacro["variables"][t[1]] = true -- ./compiler/lua54.can:810 -if macroargs and macroargs[t[1]] then -- ./compiler/lua54.can:811 -r = lua(macroargs[t[1]]) -- ./compiler/lua54.can:812 -elseif macros["variables"][t[1]] ~= nil then -- ./compiler/lua54.can:813 -local macro = macros["variables"][t[1]] -- ./compiler/lua54.can:814 -if type(macro) == "function" then -- ./compiler/lua54.can:815 -r = macro() -- ./compiler/lua54.can:816 -else -- ./compiler/lua54.can:816 -r = lua(macro) -- ./compiler/lua54.can:818 -end -- ./compiler/lua54.can:818 -end -- ./compiler/lua54.can:818 -nomacro["variables"][t[1]] = nil -- ./compiler/lua54.can:821 -end -- ./compiler/lua54.can:821 -return r -- ./compiler/lua54.can:823 -end, -- ./compiler/lua54.can:823 -["AttributeId"] = function(t) -- ./compiler/lua54.can:826 -if t[2] then -- ./compiler/lua54.can:827 -return t[1] .. " <" .. t[2] .. ">" -- ./compiler/lua54.can:828 -else -- ./compiler/lua54.can:828 -return t[1] -- ./compiler/lua54.can:830 -end -- ./compiler/lua54.can:830 -end, -- ./compiler/lua54.can:830 -["DestructuringId"] = function(t) -- ./compiler/lua54.can:834 -if t["id"] then -- ./compiler/lua54.can:835 -return t["id"] -- ./compiler/lua54.can:836 -else -- ./compiler/lua54.can:836 -local d = assert(peek("destructuring"), "DestructuringId not in a destructurable assignement") -- ./compiler/lua54.can:838 -local vars = { ["id"] = tmp() } -- ./compiler/lua54.can:839 -for j = 1, # t, 1 do -- ./compiler/lua54.can:840 -table["insert"](vars, t[j]) -- ./compiler/lua54.can:841 -end -- ./compiler/lua54.can:841 -table["insert"](d, vars) -- ./compiler/lua54.can:843 -t["id"] = vars["id"] -- ./compiler/lua54.can:844 -return vars["id"] -- ./compiler/lua54.can:845 -end -- ./compiler/lua54.can:845 -end, -- ./compiler/lua54.can:845 -["Index"] = function(t) -- ./compiler/lua54.can:849 -if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua54.can:850 -return "(" .. lua(t[1]) .. ")[" .. lua(t[2]) .. "]" -- ./compiler/lua54.can:851 -else -- ./compiler/lua54.can:851 -return lua(t[1]) .. "[" .. lua(t[2]) .. "]" -- ./compiler/lua54.can:853 -end -- ./compiler/lua54.can:853 -end, -- ./compiler/lua54.can:853 -["SafeIndex"] = function(t) -- ./compiler/lua54.can:857 -if t[1]["tag"] ~= "Id" then -- ./compiler/lua54.can:858 -local l = {} -- ./compiler/lua54.can:859 -while t["tag"] == "SafeIndex" or t["tag"] == "SafeCall" do -- ./compiler/lua54.can:860 -table["insert"](l, 1, t) -- ./compiler/lua54.can:861 -t = t[1] -- ./compiler/lua54.can:862 -end -- ./compiler/lua54.can:862 -local r = "(function()" .. indent() .. "local " .. var("safe") .. " = " .. lua(l[1][1]) .. newline() -- ./compiler/lua54.can:864 -for _, e in ipairs(l) do -- ./compiler/lua54.can:865 -r = r .. ("if " .. var("safe") .. " == nil then return nil end" .. newline()) -- ./compiler/lua54.can:866 -if e["tag"] == "SafeIndex" then -- ./compiler/lua54.can:867 -r = r .. (var("safe") .. " = " .. var("safe") .. "[" .. lua(e[2]) .. "]" .. newline()) -- ./compiler/lua54.can:868 -else -- ./compiler/lua54.can:868 -r = r .. (var("safe") .. " = " .. var("safe") .. "(" .. lua(e, "_lhs", 2) .. ")" .. newline()) -- ./compiler/lua54.can:870 -end -- ./compiler/lua54.can:870 -end -- ./compiler/lua54.can:870 -r = r .. ("return " .. var("safe") .. unindent() .. "end)()") -- ./compiler/lua54.can:873 -return r -- ./compiler/lua54.can:874 -else -- ./compiler/lua54.can:874 -return "(" .. lua(t[1]) .. " ~= nil and " .. lua(t[1]) .. "[" .. lua(t[2]) .. "] or nil)" -- ./compiler/lua54.can:876 -end -- ./compiler/lua54.can:876 -end, -- ./compiler/lua54.can:876 -["_opid"] = { -- ./compiler/lua54.can:881 -["add"] = "+", -- ./compiler/lua54.can:882 -["sub"] = "-", -- ./compiler/lua54.can:882 -["mul"] = "*", -- ./compiler/lua54.can:882 -["div"] = "/", -- ./compiler/lua54.can:882 -["idiv"] = "//", -- ./compiler/lua54.can:883 -["mod"] = "%", -- ./compiler/lua54.can:883 -["pow"] = "^", -- ./compiler/lua54.can:883 -["concat"] = "..", -- ./compiler/lua54.can:883 -["band"] = "&", -- ./compiler/lua54.can:884 -["bor"] = "|", -- ./compiler/lua54.can:884 -["bxor"] = "~", -- ./compiler/lua54.can:884 -["shl"] = "<<", -- ./compiler/lua54.can:884 -["shr"] = ">>", -- ./compiler/lua54.can:884 -["eq"] = "==", -- ./compiler/lua54.can:885 -["ne"] = "~=", -- ./compiler/lua54.can:885 -["lt"] = "<", -- ./compiler/lua54.can:885 -["gt"] = ">", -- ./compiler/lua54.can:885 -["le"] = "<=", -- ./compiler/lua54.can:885 -["ge"] = ">=", -- ./compiler/lua54.can:885 -["and"] = "and", -- ./compiler/lua54.can:886 -["or"] = "or", -- ./compiler/lua54.can:886 -["unm"] = "-", -- ./compiler/lua54.can:886 -["len"] = "#", -- ./compiler/lua54.can:886 -["bnot"] = "~", -- ./compiler/lua54.can:886 -["not"] = "not" -- ./compiler/lua54.can:886 -} -- ./compiler/lua54.can:886 -}, { ["__index"] = function(self, key) -- ./compiler/lua54.can:889 -error("don't know how to compile a " .. tostring(key) .. " to " .. targetName) -- ./compiler/lua54.can:890 -end }) -- ./compiler/lua54.can:890 +["SafeCall"] = function(t) -- ./compiler/lua54.can:737 +if t[1]["tag"] ~= "Id" then -- ./compiler/lua54.can:738 +return lua(t, "SafeIndex") -- ./compiler/lua54.can:739 +else -- ./compiler/lua54.can:739 +return "(" .. lua(t[1]) .. " ~= nil and " .. lua(t[1]) .. "(" .. lua(t, "_lhs", 2) .. ") or nil)" -- ./compiler/lua54.can:741 +end -- ./compiler/lua54.can:741 +end, -- ./compiler/lua54.can:741 +["_lhs"] = function(t, start, newlines) -- ./compiler/lua54.can:746 +if start == nil then start = 1 end -- ./compiler/lua54.can:746 +local r -- ./compiler/lua54.can:747 +if t[start] then -- ./compiler/lua54.can:748 +r = lua(t[start]) -- ./compiler/lua54.can:749 +for i = start + 1, # t, 1 do -- ./compiler/lua54.can:750 +r = r .. ("," .. (newlines and newline() or " ") .. lua(t[i])) -- ./compiler/lua54.can:751 +end -- ./compiler/lua54.can:751 +else -- ./compiler/lua54.can:751 +r = "" -- ./compiler/lua54.can:754 +end -- ./compiler/lua54.can:754 +return r -- ./compiler/lua54.can:756 +end, -- ./compiler/lua54.can:756 +["Id"] = function(t) -- ./compiler/lua54.can:759 +return t[1] -- ./compiler/lua54.can:760 +end, -- ./compiler/lua54.can:760 +["AttributeId"] = function(t) -- ./compiler/lua54.can:763 +if t[2] then -- ./compiler/lua54.can:764 +return t[1] .. " <" .. t[2] .. ">" -- ./compiler/lua54.can:765 +else -- ./compiler/lua54.can:765 +return t[1] -- ./compiler/lua54.can:767 +end -- ./compiler/lua54.can:767 +end, -- ./compiler/lua54.can:767 +["DestructuringId"] = function(t) -- ./compiler/lua54.can:771 +if t["id"] then -- ./compiler/lua54.can:772 +return t["id"] -- ./compiler/lua54.can:773 +else -- ./compiler/lua54.can:773 +local d = assert(peek("destructuring"), "DestructuringId not in a destructurable assignement") -- ./compiler/lua54.can:775 +local vars = { ["id"] = tmp() } -- ./compiler/lua54.can:776 +for j = 1, # t, 1 do -- ./compiler/lua54.can:777 +table["insert"](vars, t[j]) -- ./compiler/lua54.can:778 +end -- ./compiler/lua54.can:778 +table["insert"](d, vars) -- ./compiler/lua54.can:780 +t["id"] = vars["id"] -- ./compiler/lua54.can:781 +return vars["id"] -- ./compiler/lua54.can:782 +end -- ./compiler/lua54.can:782 +end, -- ./compiler/lua54.can:782 +["Index"] = function(t) -- ./compiler/lua54.can:786 +if t[1]["tag"] == "String" or t[1]["tag"] == "Table" then -- ./compiler/lua54.can:787 +return "(" .. lua(t[1]) .. ")[" .. lua(t[2]) .. "]" -- ./compiler/lua54.can:788 +else -- ./compiler/lua54.can:788 +return lua(t[1]) .. "[" .. lua(t[2]) .. "]" -- ./compiler/lua54.can:790 +end -- ./compiler/lua54.can:790 +end, -- ./compiler/lua54.can:790 +["SafeIndex"] = function(t) -- ./compiler/lua54.can:794 +if t[1]["tag"] ~= "Id" then -- ./compiler/lua54.can:795 +local l = {} -- ./compiler/lua54.can:796 +while t["tag"] == "SafeIndex" or t["tag"] == "SafeCall" do -- ./compiler/lua54.can:797 +table["insert"](l, 1, t) -- ./compiler/lua54.can:798 +t = t[1] -- ./compiler/lua54.can:799 +end -- ./compiler/lua54.can:799 +local r = "(function()" .. indent() .. "local " .. var("safe") .. " = " .. lua(l[1][1]) .. newline() -- ./compiler/lua54.can:801 +for _, e in ipairs(l) do -- ./compiler/lua54.can:802 +r = r .. ("if " .. var("safe") .. " == nil then return nil end" .. newline()) -- ./compiler/lua54.can:803 +if e["tag"] == "SafeIndex" then -- ./compiler/lua54.can:804 +r = r .. (var("safe") .. " = " .. var("safe") .. "[" .. lua(e[2]) .. "]" .. newline()) -- ./compiler/lua54.can:805 +else -- ./compiler/lua54.can:805 +r = r .. (var("safe") .. " = " .. var("safe") .. "(" .. lua(e, "_lhs", 2) .. ")" .. newline()) -- ./compiler/lua54.can:807 +end -- ./compiler/lua54.can:807 +end -- ./compiler/lua54.can:807 +r = r .. ("return " .. var("safe") .. unindent() .. "end)()") -- ./compiler/lua54.can:810 +return r -- ./compiler/lua54.can:811 +else -- ./compiler/lua54.can:811 +return "(" .. lua(t[1]) .. " ~= nil and " .. lua(t[1]) .. "[" .. lua(t[2]) .. "] or nil)" -- ./compiler/lua54.can:813 +end -- ./compiler/lua54.can:813 +end, -- ./compiler/lua54.can:813 +["_opid"] = { -- ./compiler/lua54.can:818 +["add"] = "+", -- ./compiler/lua54.can:819 +["sub"] = "-", -- ./compiler/lua54.can:819 +["mul"] = "*", -- ./compiler/lua54.can:819 +["div"] = "/", -- ./compiler/lua54.can:819 +["idiv"] = "//", -- ./compiler/lua54.can:820 +["mod"] = "%", -- ./compiler/lua54.can:820 +["pow"] = "^", -- ./compiler/lua54.can:820 +["concat"] = "..", -- ./compiler/lua54.can:820 +["band"] = "&", -- ./compiler/lua54.can:821 +["bor"] = "|", -- ./compiler/lua54.can:821 +["bxor"] = "~", -- ./compiler/lua54.can:821 +["shl"] = "<<", -- ./compiler/lua54.can:821 +["shr"] = ">>", -- ./compiler/lua54.can:821 +["eq"] = "==", -- ./compiler/lua54.can:822 +["ne"] = "~=", -- ./compiler/lua54.can:822 +["lt"] = "<", -- ./compiler/lua54.can:822 +["gt"] = ">", -- ./compiler/lua54.can:822 +["le"] = "<=", -- ./compiler/lua54.can:822 +["ge"] = ">=", -- ./compiler/lua54.can:822 +["and"] = "and", -- ./compiler/lua54.can:823 +["or"] = "or", -- ./compiler/lua54.can:823 +["unm"] = "-", -- ./compiler/lua54.can:823 +["len"] = "#", -- ./compiler/lua54.can:823 +["bnot"] = "~", -- ./compiler/lua54.can:823 +["not"] = "not" -- ./compiler/lua54.can:823 +} -- ./compiler/lua54.can:823 +}, { ["__index"] = function(self, key) -- ./compiler/lua54.can:826 +error("don't know how to compile a " .. tostring(key) .. " to " .. targetName) -- ./compiler/lua54.can:827 +end }) -- ./compiler/lua54.can:827 targetName = "Lua 5.3" -- ./compiler/lua53.can:1 tags["AttributeId"] = function(t) -- ./compiler/lua53.can:4 if t[2] then -- ./compiler/lua53.can:5 @@ -5237,11 +4648,11 @@ end -- ./compiler/lua51.can:26 tags["Label"] = function() -- ./compiler/lua51.can:28 error("target " .. targetName .. " does not support goto labels") -- ./compiler/lua51.can:29 end -- ./compiler/lua51.can:29 -local code = lua(ast) .. newline() -- ./compiler/lua54.can:896 -return requireStr .. code -- ./compiler/lua54.can:897 -end -- ./compiler/lua54.can:897 -end -- ./compiler/lua54.can:897 -local lua54 = _() or lua54 -- ./compiler/lua54.can:902 +local code = lua(ast) .. newline() -- ./compiler/lua54.can:833 +return requireStr .. code -- ./compiler/lua54.can:834 +end -- ./compiler/lua54.can:834 +end -- ./compiler/lua54.can:834 +local lua54 = _() or lua54 -- ./compiler/lua54.can:839 return lua54 -- ./compiler/lua53.can:18 end -- ./compiler/lua53.can:18 local lua53 = _() or lua53 -- ./compiler/lua53.can:22 @@ -6649,371 +6060,346 @@ end -- ./candran/can-parser/parser.lua:303 t["is_short"] = true -- ./candran/can-parser/parser.lua:305 return t -- ./candran/can-parser/parser.lua:306 end -- ./candran/can-parser/parser.lua:306 -local function markImplicit(t) -- ./candran/can-parser/parser.lua:309 -t["implicit"] = true -- ./candran/can-parser/parser.lua:310 +local function statToExpr(t) -- ./candran/can-parser/parser.lua:309 +t["tag"] = t["tag"] .. "Expr" -- ./candran/can-parser/parser.lua:310 return t -- ./candran/can-parser/parser.lua:311 end -- ./candran/can-parser/parser.lua:311 -local function statToExpr(t) -- ./candran/can-parser/parser.lua:314 -t["tag"] = t["tag"] .. "Expr" -- ./candran/can-parser/parser.lua:315 -return t -- ./candran/can-parser/parser.lua:316 -end -- ./candran/can-parser/parser.lua:316 -local function fixStructure(t) -- ./candran/can-parser/parser.lua:319 -local i = 1 -- ./candran/can-parser/parser.lua:320 -while i <= # t do -- ./candran/can-parser/parser.lua:321 -if type(t[i]) == "table" then -- ./candran/can-parser/parser.lua:322 -fixStructure(t[i]) -- ./candran/can-parser/parser.lua:323 -for j = # t[i], 1, - 1 do -- ./candran/can-parser/parser.lua:324 -local stat = t[i][j] -- ./candran/can-parser/parser.lua:325 -if type(stat) == "table" and stat["move_up_block"] and stat["move_up_block"] > 0 then -- ./candran/can-parser/parser.lua:326 -table["remove"](t[i], j) -- ./candran/can-parser/parser.lua:327 -table["insert"](t, i + 1, stat) -- ./candran/can-parser/parser.lua:328 -if t["tag"] == "Block" or t["tag"] == "Do" then -- ./candran/can-parser/parser.lua:329 -stat["move_up_block"] = stat["move_up_block"] - 1 -- ./candran/can-parser/parser.lua:330 +local function fixStructure(t) -- ./candran/can-parser/parser.lua:314 +local i = 1 -- ./candran/can-parser/parser.lua:315 +while i <= # t do -- ./candran/can-parser/parser.lua:316 +if type(t[i]) == "table" then -- ./candran/can-parser/parser.lua:317 +fixStructure(t[i]) -- ./candran/can-parser/parser.lua:318 +for j = # t[i], 1, - 1 do -- ./candran/can-parser/parser.lua:319 +local stat = t[i][j] -- ./candran/can-parser/parser.lua:320 +if type(stat) == "table" and stat["move_up_block"] and stat["move_up_block"] > 0 then -- ./candran/can-parser/parser.lua:321 +table["remove"](t[i], j) -- ./candran/can-parser/parser.lua:322 +table["insert"](t, i + 1, stat) -- ./candran/can-parser/parser.lua:323 +if t["tag"] == "Block" or t["tag"] == "Do" then -- ./candran/can-parser/parser.lua:324 +stat["move_up_block"] = stat["move_up_block"] - 1 -- ./candran/can-parser/parser.lua:325 +end -- ./candran/can-parser/parser.lua:325 +end -- ./candran/can-parser/parser.lua:325 +end -- ./candran/can-parser/parser.lua:325 +end -- ./candran/can-parser/parser.lua:325 +i = i + 1 -- ./candran/can-parser/parser.lua:330 end -- ./candran/can-parser/parser.lua:330 -end -- ./candran/can-parser/parser.lua:330 -end -- ./candran/can-parser/parser.lua:330 -end -- ./candran/can-parser/parser.lua:330 -i = i + 1 -- ./candran/can-parser/parser.lua:335 -end -- ./candran/can-parser/parser.lua:335 -return t -- ./candran/can-parser/parser.lua:337 -end -- ./candran/can-parser/parser.lua:337 -local function searchEndRec(block, isRecCall) -- ./candran/can-parser/parser.lua:340 -for i, stat in ipairs(block) do -- ./candran/can-parser/parser.lua:341 -if stat["tag"] == "Set" or stat["tag"] == "Push" or stat["tag"] == "Return" or stat["tag"] == "Local" or stat["tag"] == "Let" or stat["tag"] == "Localrec" then -- ./candran/can-parser/parser.lua:343 -local exprlist -- ./candran/can-parser/parser.lua:344 -if stat["tag"] == "Set" or stat["tag"] == "Local" or stat["tag"] == "Let" or stat["tag"] == "Localrec" then -- ./candran/can-parser/parser.lua:346 -exprlist = stat[# stat] -- ./candran/can-parser/parser.lua:347 -elseif stat["tag"] == "Push" or stat["tag"] == "Return" then -- ./candran/can-parser/parser.lua:348 -exprlist = stat -- ./candran/can-parser/parser.lua:349 -end -- ./candran/can-parser/parser.lua:349 -local last = exprlist[# exprlist] -- ./candran/can-parser/parser.lua:352 -if last["tag"] == "Function" and last["is_short"] and not last["is_method"] and # last[1] == 1 then -- ./candran/can-parser/parser.lua:356 -local p = i -- ./candran/can-parser/parser.lua:357 -for j, fstat in ipairs(last[2]) do -- ./candran/can-parser/parser.lua:358 -p = i + j -- ./candran/can-parser/parser.lua:359 -table["insert"](block, p, fstat) -- ./candran/can-parser/parser.lua:360 -if stat["move_up_block"] then -- ./candran/can-parser/parser.lua:362 -fstat["move_up_block"] = (fstat["move_up_block"] or 0) + stat["move_up_block"] -- ./candran/can-parser/parser.lua:363 -end -- ./candran/can-parser/parser.lua:363 -if block["is_singlestatblock"] then -- ./candran/can-parser/parser.lua:366 -fstat["move_up_block"] = (fstat["move_up_block"] or 0) + 1 -- ./candran/can-parser/parser.lua:367 -end -- ./candran/can-parser/parser.lua:367 -end -- ./candran/can-parser/parser.lua:367 -exprlist[# exprlist] = last[1] -- ./candran/can-parser/parser.lua:371 -exprlist[# exprlist]["tag"] = "Paren" -- ./candran/can-parser/parser.lua:372 -if not isRecCall then -- ./candran/can-parser/parser.lua:374 -for j = p + 1, # block, 1 do -- ./candran/can-parser/parser.lua:375 -block[j]["move_up_block"] = (block[j]["move_up_block"] or 0) + 1 -- ./candran/can-parser/parser.lua:376 -end -- ./candran/can-parser/parser.lua:376 -end -- ./candran/can-parser/parser.lua:376 -return block, i -- ./candran/can-parser/parser.lua:380 -elseif last["tag"]:match("Expr$") then -- ./candran/can-parser/parser.lua:383 -local r = searchEndRec({ last }) -- ./candran/can-parser/parser.lua:384 -if r then -- ./candran/can-parser/parser.lua:385 -for j = 2, # r, 1 do -- ./candran/can-parser/parser.lua:386 -table["insert"](block, i + j - 1, r[j]) -- ./candran/can-parser/parser.lua:387 -end -- ./candran/can-parser/parser.lua:387 +return t -- ./candran/can-parser/parser.lua:332 +end -- ./candran/can-parser/parser.lua:332 +local function searchEndRec(block, isRecCall) -- ./candran/can-parser/parser.lua:335 +for i, stat in ipairs(block) do -- ./candran/can-parser/parser.lua:336 +if stat["tag"] == "Set" or stat["tag"] == "Push" or stat["tag"] == "Return" or stat["tag"] == "Local" or stat["tag"] == "Let" or stat["tag"] == "Localrec" then -- ./candran/can-parser/parser.lua:338 +local exprlist -- ./candran/can-parser/parser.lua:339 +if stat["tag"] == "Set" or stat["tag"] == "Local" or stat["tag"] == "Let" or stat["tag"] == "Localrec" then -- ./candran/can-parser/parser.lua:341 +exprlist = stat[# stat] -- ./candran/can-parser/parser.lua:342 +elseif stat["tag"] == "Push" or stat["tag"] == "Return" then -- ./candran/can-parser/parser.lua:343 +exprlist = stat -- ./candran/can-parser/parser.lua:344 +end -- ./candran/can-parser/parser.lua:344 +local last = exprlist[# exprlist] -- ./candran/can-parser/parser.lua:347 +if last["tag"] == "Function" and last["is_short"] and not last["is_method"] and # last[1] == 1 then -- ./candran/can-parser/parser.lua:351 +local p = i -- ./candran/can-parser/parser.lua:352 +for j, fstat in ipairs(last[2]) do -- ./candran/can-parser/parser.lua:353 +p = i + j -- ./candran/can-parser/parser.lua:354 +table["insert"](block, p, fstat) -- ./candran/can-parser/parser.lua:355 +if stat["move_up_block"] then -- ./candran/can-parser/parser.lua:357 +fstat["move_up_block"] = (fstat["move_up_block"] or 0) + stat["move_up_block"] -- ./candran/can-parser/parser.lua:358 +end -- ./candran/can-parser/parser.lua:358 +if block["is_singlestatblock"] then -- ./candran/can-parser/parser.lua:361 +fstat["move_up_block"] = (fstat["move_up_block"] or 0) + 1 -- ./candran/can-parser/parser.lua:362 +end -- ./candran/can-parser/parser.lua:362 +end -- ./candran/can-parser/parser.lua:362 +exprlist[# exprlist] = last[1] -- ./candran/can-parser/parser.lua:366 +exprlist[# exprlist]["tag"] = "Paren" -- ./candran/can-parser/parser.lua:367 +if not isRecCall then -- ./candran/can-parser/parser.lua:369 +for j = p + 1, # block, 1 do -- ./candran/can-parser/parser.lua:370 +block[j]["move_up_block"] = (block[j]["move_up_block"] or 0) + 1 -- ./candran/can-parser/parser.lua:371 +end -- ./candran/can-parser/parser.lua:371 +end -- ./candran/can-parser/parser.lua:371 +return block, i -- ./candran/can-parser/parser.lua:375 +elseif last["tag"]:match("Expr$") then -- ./candran/can-parser/parser.lua:378 +local r = searchEndRec({ last }) -- ./candran/can-parser/parser.lua:379 +if r then -- ./candran/can-parser/parser.lua:380 +for j = 2, # r, 1 do -- ./candran/can-parser/parser.lua:381 +table["insert"](block, i + j - 1, r[j]) -- ./candran/can-parser/parser.lua:382 +end -- ./candran/can-parser/parser.lua:382 +return block, i -- ./candran/can-parser/parser.lua:384 +end -- ./candran/can-parser/parser.lua:384 +elseif last["tag"] == "Function" then -- ./candran/can-parser/parser.lua:386 +local r = searchEndRec(last[2]) -- ./candran/can-parser/parser.lua:387 +if r then -- ./candran/can-parser/parser.lua:388 return block, i -- ./candran/can-parser/parser.lua:389 end -- ./candran/can-parser/parser.lua:389 -elseif last["tag"] == "Function" then -- ./candran/can-parser/parser.lua:391 -local r = searchEndRec(last[2]) -- ./candran/can-parser/parser.lua:392 -if r then -- ./candran/can-parser/parser.lua:393 -return block, i -- ./candran/can-parser/parser.lua:394 -end -- ./candran/can-parser/parser.lua:394 -end -- ./candran/can-parser/parser.lua:394 -elseif stat["tag"]:match("^If") or stat["tag"]:match("^While") or stat["tag"]:match("^Repeat") or stat["tag"]:match("^Do") or stat["tag"]:match("^Fornum") or stat["tag"]:match("^Forin") then -- ./candran/can-parser/parser.lua:399 -local blocks -- ./candran/can-parser/parser.lua:400 -if stat["tag"]:match("^If") or stat["tag"]:match("^While") or stat["tag"]:match("^Repeat") or stat["tag"]:match("^Fornum") or stat["tag"]:match("^Forin") then -- ./candran/can-parser/parser.lua:402 -blocks = stat -- ./candran/can-parser/parser.lua:403 -elseif stat["tag"]:match("^Do") then -- ./candran/can-parser/parser.lua:404 -blocks = { stat } -- ./candran/can-parser/parser.lua:405 -end -- ./candran/can-parser/parser.lua:405 -for _, iblock in ipairs(blocks) do -- ./candran/can-parser/parser.lua:408 -if iblock["tag"] == "Block" then -- ./candran/can-parser/parser.lua:409 -local oldLen = # iblock -- ./candran/can-parser/parser.lua:410 -local newiBlock, newEnd = searchEndRec(iblock, true) -- ./candran/can-parser/parser.lua:411 -if newiBlock then -- ./candran/can-parser/parser.lua:412 -local p = i -- ./candran/can-parser/parser.lua:413 -for j = newEnd + (# iblock - oldLen) + 1, # iblock, 1 do -- ./candran/can-parser/parser.lua:414 -p = p + 1 -- ./candran/can-parser/parser.lua:415 -table["insert"](block, p, iblock[j]) -- ./candran/can-parser/parser.lua:416 -iblock[j] = nil -- ./candran/can-parser/parser.lua:417 +end -- ./candran/can-parser/parser.lua:389 +elseif stat["tag"]:match("^If") or stat["tag"]:match("^While") or stat["tag"]:match("^Repeat") or stat["tag"]:match("^Do") or stat["tag"]:match("^Fornum") or stat["tag"]:match("^Forin") then -- ./candran/can-parser/parser.lua:394 +local blocks -- ./candran/can-parser/parser.lua:395 +if stat["tag"]:match("^If") or stat["tag"]:match("^While") or stat["tag"]:match("^Repeat") or stat["tag"]:match("^Fornum") or stat["tag"]:match("^Forin") then -- ./candran/can-parser/parser.lua:397 +blocks = stat -- ./candran/can-parser/parser.lua:398 +elseif stat["tag"]:match("^Do") then -- ./candran/can-parser/parser.lua:399 +blocks = { stat } -- ./candran/can-parser/parser.lua:400 +end -- ./candran/can-parser/parser.lua:400 +for _, iblock in ipairs(blocks) do -- ./candran/can-parser/parser.lua:403 +if iblock["tag"] == "Block" then -- ./candran/can-parser/parser.lua:404 +local oldLen = # iblock -- ./candran/can-parser/parser.lua:405 +local newiBlock, newEnd = searchEndRec(iblock, true) -- ./candran/can-parser/parser.lua:406 +if newiBlock then -- ./candran/can-parser/parser.lua:407 +local p = i -- ./candran/can-parser/parser.lua:408 +for j = newEnd + (# iblock - oldLen) + 1, # iblock, 1 do -- ./candran/can-parser/parser.lua:409 +p = p + 1 -- ./candran/can-parser/parser.lua:410 +table["insert"](block, p, iblock[j]) -- ./candran/can-parser/parser.lua:411 +iblock[j] = nil -- ./candran/can-parser/parser.lua:412 +end -- ./candran/can-parser/parser.lua:412 +if not isRecCall then -- ./candran/can-parser/parser.lua:415 +for j = p + 1, # block, 1 do -- ./candran/can-parser/parser.lua:416 +block[j]["move_up_block"] = (block[j]["move_up_block"] or 0) + 1 -- ./candran/can-parser/parser.lua:417 end -- ./candran/can-parser/parser.lua:417 -if not isRecCall then -- ./candran/can-parser/parser.lua:420 -for j = p + 1, # block, 1 do -- ./candran/can-parser/parser.lua:421 -block[j]["move_up_block"] = (block[j]["move_up_block"] or 0) + 1 -- ./candran/can-parser/parser.lua:422 -end -- ./candran/can-parser/parser.lua:422 -end -- ./candran/can-parser/parser.lua:422 -return block, i -- ./candran/can-parser/parser.lua:426 -end -- ./candran/can-parser/parser.lua:426 -end -- ./candran/can-parser/parser.lua:426 -end -- ./candran/can-parser/parser.lua:426 -end -- ./candran/can-parser/parser.lua:426 -end -- ./candran/can-parser/parser.lua:426 -return nil -- ./candran/can-parser/parser.lua:432 -end -- ./candran/can-parser/parser.lua:432 -local function searchEnd(s, p, t) -- ./candran/can-parser/parser.lua:435 -local r = searchEndRec(fixStructure(t)) -- ./candran/can-parser/parser.lua:436 -if not r then -- ./candran/can-parser/parser.lua:437 -return false -- ./candran/can-parser/parser.lua:438 -end -- ./candran/can-parser/parser.lua:438 -return true, r -- ./candran/can-parser/parser.lua:440 -end -- ./candran/can-parser/parser.lua:440 -local function expectBlockOrSingleStatWithStartEnd(start, startLabel, stopLabel, canFollow) -- ./candran/can-parser/parser.lua:443 -if canFollow then -- ./candran/can-parser/parser.lua:444 -return (- start * V("SingleStatBlock") * canFollow ^ - 1) + (expect(start, startLabel) * ((V("Block") * (canFollow + kw("end"))) + (Cmt(V("Block"), searchEnd) + throw(stopLabel)))) -- ./candran/can-parser/parser.lua:447 -else -- ./candran/can-parser/parser.lua:447 -return (- start * V("SingleStatBlock")) + (expect(start, startLabel) * ((V("Block") * kw("end")) + (Cmt(V("Block"), searchEnd) + throw(stopLabel)))) -- ./candran/can-parser/parser.lua:451 -end -- ./candran/can-parser/parser.lua:451 -end -- ./candran/can-parser/parser.lua:451 -local function expectBlockWithEnd(label) -- ./candran/can-parser/parser.lua:455 -return (V("Block") * kw("end")) + (Cmt(V("Block"), searchEnd) + throw(label)) -- ./candran/can-parser/parser.lua:457 +end -- ./candran/can-parser/parser.lua:417 +return block, i -- ./candran/can-parser/parser.lua:421 +end -- ./candran/can-parser/parser.lua:421 +end -- ./candran/can-parser/parser.lua:421 +end -- ./candran/can-parser/parser.lua:421 +end -- ./candran/can-parser/parser.lua:421 +end -- ./candran/can-parser/parser.lua:421 +return nil -- ./candran/can-parser/parser.lua:427 +end -- ./candran/can-parser/parser.lua:427 +local function searchEnd(s, p, t) -- ./candran/can-parser/parser.lua:430 +local r = searchEndRec(fixStructure(t)) -- ./candran/can-parser/parser.lua:431 +if not r then -- ./candran/can-parser/parser.lua:432 +return false -- ./candran/can-parser/parser.lua:433 +end -- ./candran/can-parser/parser.lua:433 +return true, r -- ./candran/can-parser/parser.lua:435 +end -- ./candran/can-parser/parser.lua:435 +local function expectBlockOrSingleStatWithStartEnd(start, startLabel, stopLabel, canFollow) -- ./candran/can-parser/parser.lua:438 +if canFollow then -- ./candran/can-parser/parser.lua:439 +return (- start * V("SingleStatBlock") * canFollow ^ - 1) + (expect(start, startLabel) * ((V("Block") * (canFollow + kw("end"))) + (Cmt(V("Block"), searchEnd) + throw(stopLabel)))) -- ./candran/can-parser/parser.lua:442 +else -- ./candran/can-parser/parser.lua:442 +return (- start * V("SingleStatBlock")) + (expect(start, startLabel) * ((V("Block") * kw("end")) + (Cmt(V("Block"), searchEnd) + throw(stopLabel)))) -- ./candran/can-parser/parser.lua:446 +end -- ./candran/can-parser/parser.lua:446 +end -- ./candran/can-parser/parser.lua:446 +local function expectBlockWithEnd(label) -- ./candran/can-parser/parser.lua:450 +return (V("Block") * kw("end")) + (Cmt(V("Block"), searchEnd) + throw(label)) -- ./candran/can-parser/parser.lua:452 +end -- ./candran/can-parser/parser.lua:452 +local function maybeBlockWithEnd() -- ./candran/can-parser/parser.lua:455 +return (V("BlockNoErr") * kw("end")) + Cmt(V("BlockNoErr"), searchEnd) -- ./candran/can-parser/parser.lua:457 end -- ./candran/can-parser/parser.lua:457 -local function maybeBlockWithEnd() -- ./candran/can-parser/parser.lua:460 -return (V("BlockNoErr") * kw("end")) + Cmt(V("BlockNoErr"), searchEnd) -- ./candran/can-parser/parser.lua:462 -end -- ./candran/can-parser/parser.lua:462 -local function maybe(patt) -- ./candran/can-parser/parser.lua:465 -return # patt / 0 * patt -- ./candran/can-parser/parser.lua:466 -end -- ./candran/can-parser/parser.lua:466 -local function setAttribute(attribute) -- ./candran/can-parser/parser.lua:469 -return function(assign) -- ./candran/can-parser/parser.lua:470 -assign[1]["tag"] = "AttributeNameList" -- ./candran/can-parser/parser.lua:471 -for _, id in ipairs(assign[1]) do -- ./candran/can-parser/parser.lua:472 -if id["tag"] == "Id" then -- ./candran/can-parser/parser.lua:473 -id["tag"] = "AttributeId" -- ./candran/can-parser/parser.lua:474 -id[2] = attribute -- ./candran/can-parser/parser.lua:475 -elseif id["tag"] == "DestructuringId" then -- ./candran/can-parser/parser.lua:476 -for _, did in ipairs(id) do -- ./candran/can-parser/parser.lua:477 -did["tag"] = "AttributeId" -- ./candran/can-parser/parser.lua:478 -did[2] = attribute -- ./candran/can-parser/parser.lua:479 -end -- ./candran/can-parser/parser.lua:479 -end -- ./candran/can-parser/parser.lua:479 -end -- ./candran/can-parser/parser.lua:479 -return assign -- ./candran/can-parser/parser.lua:483 -end -- ./candran/can-parser/parser.lua:483 -end -- ./candran/can-parser/parser.lua:483 -local stacks = { ["lexpr"] = {} } -- ./candran/can-parser/parser.lua:488 -local function push(f) -- ./candran/can-parser/parser.lua:490 -return Cmt(P(""), function() -- ./candran/can-parser/parser.lua:491 -table["insert"](stacks[f], true) -- ./candran/can-parser/parser.lua:492 -return true -- ./candran/can-parser/parser.lua:493 -end) -- ./candran/can-parser/parser.lua:493 -end -- ./candran/can-parser/parser.lua:493 -local function pop(f) -- ./candran/can-parser/parser.lua:496 -return Cmt(P(""), function() -- ./candran/can-parser/parser.lua:497 -table["remove"](stacks[f]) -- ./candran/can-parser/parser.lua:498 -return true -- ./candran/can-parser/parser.lua:499 +local function maybe(patt) -- ./candran/can-parser/parser.lua:460 +return # patt / 0 * patt -- ./candran/can-parser/parser.lua:461 +end -- ./candran/can-parser/parser.lua:461 +local function setAttribute(attribute) -- ./candran/can-parser/parser.lua:464 +return function(assign) -- ./candran/can-parser/parser.lua:465 +assign[1]["tag"] = "AttributeNameList" -- ./candran/can-parser/parser.lua:466 +for _, id in ipairs(assign[1]) do -- ./candran/can-parser/parser.lua:467 +if id["tag"] == "Id" then -- ./candran/can-parser/parser.lua:468 +id["tag"] = "AttributeId" -- ./candran/can-parser/parser.lua:469 +id[2] = attribute -- ./candran/can-parser/parser.lua:470 +elseif id["tag"] == "DestructuringId" then -- ./candran/can-parser/parser.lua:471 +for _, did in ipairs(id) do -- ./candran/can-parser/parser.lua:472 +did["tag"] = "AttributeId" -- ./candran/can-parser/parser.lua:473 +did[2] = attribute -- ./candran/can-parser/parser.lua:474 +end -- ./candran/can-parser/parser.lua:474 +end -- ./candran/can-parser/parser.lua:474 +end -- ./candran/can-parser/parser.lua:474 +return assign -- ./candran/can-parser/parser.lua:478 +end -- ./candran/can-parser/parser.lua:478 +end -- ./candran/can-parser/parser.lua:478 +local stacks = { ["lexpr"] = {} } -- ./candran/can-parser/parser.lua:483 +local function push(f) -- ./candran/can-parser/parser.lua:485 +return Cmt(P(""), function() -- ./candran/can-parser/parser.lua:486 +table["insert"](stacks[f], true) -- ./candran/can-parser/parser.lua:487 +return true -- ./candran/can-parser/parser.lua:488 +end) -- ./candran/can-parser/parser.lua:488 +end -- ./candran/can-parser/parser.lua:488 +local function pop(f) -- ./candran/can-parser/parser.lua:491 +return Cmt(P(""), function() -- ./candran/can-parser/parser.lua:492 +table["remove"](stacks[f]) -- ./candran/can-parser/parser.lua:493 +return true -- ./candran/can-parser/parser.lua:494 +end) -- ./candran/can-parser/parser.lua:494 +end -- ./candran/can-parser/parser.lua:494 +local function when(f) -- ./candran/can-parser/parser.lua:497 +return Cmt(P(""), function() -- ./candran/can-parser/parser.lua:498 +return # stacks[f] > 0 -- ./candran/can-parser/parser.lua:499 end) -- ./candran/can-parser/parser.lua:499 end -- ./candran/can-parser/parser.lua:499 -local function when(f) -- ./candran/can-parser/parser.lua:502 -return Cmt(P(""), function() -- ./candran/can-parser/parser.lua:503 -return # stacks[f] > 0 -- ./candran/can-parser/parser.lua:504 -end) -- ./candran/can-parser/parser.lua:504 -end -- ./candran/can-parser/parser.lua:504 -local function set(f, patt) -- ./candran/can-parser/parser.lua:507 -return push(f) * patt * pop(f) -- ./candran/can-parser/parser.lua:508 -end -- ./candran/can-parser/parser.lua:508 -local G = { -- ./candran/can-parser/parser.lua:512 -V("Lua"), -- ./candran/can-parser/parser.lua:512 -["Lua"] = (V("Shebang") ^ - 1 * V("Skip") * V("Block") * expect(P(- 1), "Extra")) / fixStructure, -- ./candran/can-parser/parser.lua:513 +local function set(f, patt) -- ./candran/can-parser/parser.lua:502 +return push(f) * patt * pop(f) -- ./candran/can-parser/parser.lua:503 +end -- ./candran/can-parser/parser.lua:503 +local G = { -- ./candran/can-parser/parser.lua:507 +V("Lua"), -- ./candran/can-parser/parser.lua:507 +["Lua"] = (V("Shebang") ^ - 1 * V("Skip") * V("Block") * expect(P(- 1), "Extra")) / fixStructure, -- ./candran/can-parser/parser.lua:508 ["Shebang"] = P("#!") * (P(1) - P("\ -")) ^ 0, -- ./candran/can-parser/parser.lua:514 -["Block"] = tagC("Block", (V("Stat") + - V("BlockEnd") * throw("InvalidStat")) ^ 0 * ((V("RetStat") + V("ImplicitPushStat")) * sym(";") ^ - 1) ^ - 1), -- ./candran/can-parser/parser.lua:516 -["Stat"] = V("IfStat") + V("DoStat") + V("WhileStat") + V("RepeatStat") + V("ForStat") + V("LocalStat") + V("FuncStat") + V("BreakStat") + V("LabelStat") + V("GoToStat") + V("LetStat") + V("ConstStat") + V("CloseStat") + V("FuncCall") + V("Assignment") + V("ContinueStat") + V("PushStat") + sym(";"), -- ./candran/can-parser/parser.lua:522 -["BlockEnd"] = P("return") + "end" + "elseif" + "else" + "until" + "]" + - 1 + V("ImplicitPushStat") + V("Assignment"), -- ./candran/can-parser/parser.lua:523 -["SingleStatBlock"] = tagC("Block", V("Stat") + V("RetStat") + V("ImplicitPushStat")) / function(t) -- ./candran/can-parser/parser.lua:525 -t["is_singlestatblock"] = true -- ./candran/can-parser/parser.lua:525 -return t -- ./candran/can-parser/parser.lua:525 -end, -- ./candran/can-parser/parser.lua:525 -["BlockNoErr"] = tagC("Block", V("Stat") ^ 0 * ((V("RetStat") + V("ImplicitPushStat")) * sym(";") ^ - 1) ^ - 1), -- ./candran/can-parser/parser.lua:526 -["IfStat"] = tagC("If", V("IfPart")), -- ./candran/can-parser/parser.lua:528 -["IfPart"] = kw("if") * set("lexpr", expect(V("Expr"), "ExprIf")) * expectBlockOrSingleStatWithStartEnd(kw("then"), "ThenIf", "EndIf", V("ElseIfPart") + V("ElsePart")), -- ./candran/can-parser/parser.lua:529 -["ElseIfPart"] = kw("elseif") * set("lexpr", expect(V("Expr"), "ExprEIf")) * expectBlockOrSingleStatWithStartEnd(kw("then"), "ThenEIf", "EndIf", V("ElseIfPart") + V("ElsePart")), -- ./candran/can-parser/parser.lua:530 -["ElsePart"] = kw("else") * expectBlockWithEnd("EndIf"), -- ./candran/can-parser/parser.lua:531 -["DoStat"] = kw("do") * expectBlockWithEnd("EndDo") / tagDo, -- ./candran/can-parser/parser.lua:533 -["WhileStat"] = tagC("While", kw("while") * set("lexpr", expect(V("Expr"), "ExprWhile")) * V("WhileBody")), -- ./candran/can-parser/parser.lua:534 -["WhileBody"] = expectBlockOrSingleStatWithStartEnd(kw("do"), "DoWhile", "EndWhile"), -- ./candran/can-parser/parser.lua:535 -["RepeatStat"] = tagC("Repeat", kw("repeat") * V("Block") * expect(kw("until"), "UntilRep") * expect(V("Expr"), "ExprRep")), -- ./candran/can-parser/parser.lua:536 -["ForStat"] = kw("for") * expect(V("ForNum") + V("ForIn"), "ForRange"), -- ./candran/can-parser/parser.lua:538 -["ForNum"] = tagC("Fornum", V("Id") * sym("=") * V("NumRange") * V("ForBody")), -- ./candran/can-parser/parser.lua:539 -["NumRange"] = expect(V("Expr"), "ExprFor1") * expect(sym(","), "CommaFor") * expect(V("Expr"), "ExprFor2") * (sym(",") * expect(V("Expr"), "ExprFor3")) ^ - 1, -- ./candran/can-parser/parser.lua:541 -["ForIn"] = tagC("Forin", V("DestructuringNameList") * expect(kw("in"), "InFor") * expect(V("ExprList"), "EListFor") * V("ForBody")), -- ./candran/can-parser/parser.lua:542 -["ForBody"] = expectBlockOrSingleStatWithStartEnd(kw("do"), "DoFor", "EndFor"), -- ./candran/can-parser/parser.lua:543 -["LocalStat"] = kw("local") * expect(V("LocalFunc") + V("LocalAssign"), "DefLocal"), -- ./candran/can-parser/parser.lua:545 -["LocalFunc"] = tagC("Localrec", kw("function") * expect(V("Id"), "NameLFunc") * V("FuncBody")) / fixFuncStat, -- ./candran/can-parser/parser.lua:546 -["LocalAssign"] = tagC("Local", V("AttributeNameList") * (sym("=") * expect(V("ExprList"), "EListLAssign") + Ct(Cc()))) + tagC("Local", V("DestructuringNameList") * sym("=") * expect(V("ExprList"), "EListLAssign")), -- ./candran/can-parser/parser.lua:548 -["LetStat"] = kw("let") * expect(V("LetAssign"), "DefLet"), -- ./candran/can-parser/parser.lua:550 -["LetAssign"] = tagC("Let", V("NameList") * (sym("=") * expect(V("ExprList"), "EListLAssign") + Ct(Cc()))) + tagC("Let", V("DestructuringNameList") * sym("=") * expect(V("ExprList"), "EListLAssign")), -- ./candran/can-parser/parser.lua:552 -["ConstStat"] = kw("const") * expect(V("AttributeAssign") / setAttribute("const"), "DefConst"), -- ./candran/can-parser/parser.lua:554 -["CloseStat"] = kw("close") * expect(V("AttributeAssign") / setAttribute("close"), "DefClose"), -- ./candran/can-parser/parser.lua:555 -["AttributeAssign"] = tagC("Local", V("NameList") * (sym("=") * expect(V("ExprList"), "EListLAssign") + Ct(Cc()))) + tagC("Local", V("DestructuringNameList") * sym("=") * expect(V("ExprList"), "EListLAssign")), -- ./candran/can-parser/parser.lua:557 -["Assignment"] = tagC("Set", (V("VarList") + V("DestructuringNameList")) * V("BinOp") ^ - 1 * (P("=") / "=") * ((V("BinOp") - P("-")) + # (P("-") * V("Space")) * V("BinOp")) ^ - 1 * V("Skip") * expect(V("ExprList"), "EListAssign")), -- ./candran/can-parser/parser.lua:559 -["FuncStat"] = tagC("Set", kw("function") * expect(V("FuncName"), "FuncName") * V("FuncBody")) / fixFuncStat, -- ./candran/can-parser/parser.lua:561 -["FuncName"] = Cf(V("Id") * (sym(".") * expect(V("StrId"), "NameFunc1")) ^ 0, insertIndex) * (sym(":") * expect(V("StrId"), "NameFunc2")) ^ - 1 / markMethod, -- ./candran/can-parser/parser.lua:563 -["FuncBody"] = tagC("Function", V("FuncParams") * expectBlockWithEnd("EndFunc")), -- ./candran/can-parser/parser.lua:564 -["FuncParams"] = expect(sym("("), "OParenPList") * V("ParList") * expect(sym(")"), "CParenPList"), -- ./candran/can-parser/parser.lua:565 -["ParList"] = V("NamedParList") * (sym(",") * expect(tagC("Dots", sym("...")), "ParList")) ^ - 1 / addDots + Ct(tagC("Dots", sym("..."))) + Ct(Cc()), -- ./candran/can-parser/parser.lua:568 -["ShortFuncDef"] = tagC("Function", V("ShortFuncParams") * maybeBlockWithEnd()) / fixShortFunc, -- ./candran/can-parser/parser.lua:570 -["ShortFuncParams"] = (sym(":") / ":") ^ - 1 * sym("(") * V("ParList") * sym(")"), -- ./candran/can-parser/parser.lua:571 -["NamedParList"] = tagC("NamedParList", commaSep(V("NamedPar"))), -- ./candran/can-parser/parser.lua:573 -["NamedPar"] = tagC("ParPair", V("ParKey") * expect(sym("="), "EqField") * expect(V("Expr"), "ExprField")) + V("Id"), -- ./candran/can-parser/parser.lua:575 -["ParKey"] = V("Id") * # ("=" * - P("=")), -- ./candran/can-parser/parser.lua:576 -["LabelStat"] = tagC("Label", sym("::") * expect(V("Name"), "Label") * expect(sym("::"), "CloseLabel")), -- ./candran/can-parser/parser.lua:578 -["GoToStat"] = tagC("Goto", kw("goto") * expect(V("Name"), "Goto")), -- ./candran/can-parser/parser.lua:579 -["BreakStat"] = tagC("Break", kw("break")), -- ./candran/can-parser/parser.lua:580 -["ContinueStat"] = tagC("Continue", kw("continue")), -- ./candran/can-parser/parser.lua:581 -["RetStat"] = tagC("Return", kw("return") * commaSep(V("Expr"), "RetList") ^ - 1), -- ./candran/can-parser/parser.lua:582 -["PushStat"] = tagC("Push", kw("push") * commaSep(V("Expr"), "RetList") ^ - 1), -- ./candran/can-parser/parser.lua:584 -["ImplicitPushStat"] = tagC("Push", commaSep(V("Expr"), "RetList")) / markImplicit, -- ./candran/can-parser/parser.lua:585 -["NameList"] = tagC("NameList", commaSep(V("Id"))), -- ./candran/can-parser/parser.lua:587 -["DestructuringNameList"] = tagC("NameList", commaSep(V("DestructuringId"))), -- ./candran/can-parser/parser.lua:588 -["AttributeNameList"] = tagC("AttributeNameList", commaSep(V("AttributeId"))), -- ./candran/can-parser/parser.lua:589 -["VarList"] = tagC("VarList", commaSep(V("VarExpr"))), -- ./candran/can-parser/parser.lua:590 -["ExprList"] = tagC("ExpList", commaSep(V("Expr"), "ExprList")), -- ./candran/can-parser/parser.lua:591 -["DestructuringId"] = tagC("DestructuringId", sym("{") * V("DestructuringIdFieldList") * expect(sym("}"), "CBraceDestructuring")) + V("Id"), -- ./candran/can-parser/parser.lua:593 -["DestructuringIdFieldList"] = sepBy(V("DestructuringIdField"), V("FieldSep")) * V("FieldSep") ^ - 1, -- ./candran/can-parser/parser.lua:594 -["DestructuringIdField"] = tagC("Pair", V("FieldKey") * expect(sym("="), "DestructuringEqField") * expect(V("Id"), "DestructuringExprField")) + V("Id"), -- ./candran/can-parser/parser.lua:596 -["Expr"] = V("OrExpr"), -- ./candran/can-parser/parser.lua:598 -["OrExpr"] = chainOp(V("AndExpr"), V("OrOp"), "OrExpr"), -- ./candran/can-parser/parser.lua:599 -["AndExpr"] = chainOp(V("RelExpr"), V("AndOp"), "AndExpr"), -- ./candran/can-parser/parser.lua:600 -["RelExpr"] = chainOp(V("BOrExpr"), V("RelOp"), "RelExpr"), -- ./candran/can-parser/parser.lua:601 -["BOrExpr"] = chainOp(V("BXorExpr"), V("BOrOp"), "BOrExpr"), -- ./candran/can-parser/parser.lua:602 -["BXorExpr"] = chainOp(V("BAndExpr"), V("BXorOp"), "BXorExpr"), -- ./candran/can-parser/parser.lua:603 -["BAndExpr"] = chainOp(V("ShiftExpr"), V("BAndOp"), "BAndExpr"), -- ./candran/can-parser/parser.lua:604 -["ShiftExpr"] = chainOp(V("ConcatExpr"), V("ShiftOp"), "ShiftExpr"), -- ./candran/can-parser/parser.lua:605 -["ConcatExpr"] = V("AddExpr") * (V("ConcatOp") * expect(V("ConcatExpr"), "ConcatExpr")) ^ - 1 / binaryOp, -- ./candran/can-parser/parser.lua:606 -["AddExpr"] = chainOp(V("MulExpr"), V("AddOp"), "AddExpr"), -- ./candran/can-parser/parser.lua:607 -["MulExpr"] = chainOp(V("UnaryExpr"), V("MulOp"), "MulExpr"), -- ./candran/can-parser/parser.lua:608 -["UnaryExpr"] = V("UnaryOp") * expect(V("UnaryExpr"), "UnaryExpr") / unaryOp + V("PowExpr"), -- ./candran/can-parser/parser.lua:610 -["PowExpr"] = V("SimpleExpr") * (V("PowOp") * expect(V("UnaryExpr"), "PowExpr")) ^ - 1 / binaryOp, -- ./candran/can-parser/parser.lua:611 -["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") + (when("lexpr") * tagC("LetExpr", maybe(V("DestructuringNameList")) * sym("=") * - sym("=") * expect(V("ExprList"), "EListLAssign"))) + V("ShortFuncDef") + V("SuffixedExpr") + V("StatExpr"), -- ./candran/can-parser/parser.lua:621 -["StatExpr"] = (V("IfStat") + V("DoStat") + V("WhileStat") + V("RepeatStat") + V("ForStat")) / statToExpr, -- ./candran/can-parser/parser.lua:623 -["FuncCall"] = Cmt(V("SuffixedExpr"), function(s, i, exp) -- ./candran/can-parser/parser.lua:625 -return exp["tag"] == "Call" or exp["tag"] == "SafeCall", exp -- ./candran/can-parser/parser.lua:625 -end), -- ./candran/can-parser/parser.lua:625 -["VarExpr"] = Cmt(V("SuffixedExpr"), function(s, i, exp) -- ./candran/can-parser/parser.lua:626 -return exp["tag"] == "Id" or exp["tag"] == "Index", exp -- ./candran/can-parser/parser.lua:626 -end), -- ./candran/can-parser/parser.lua:626 -["SuffixedExpr"] = Cf(V("PrimaryExpr") * (V("Index") + V("MethodStub") + V("Call")) ^ 0 + V("NoCallPrimaryExpr") * - V("Call") * (V("Index") + V("MethodStub") + V("Call")) ^ 0 + V("NoCallPrimaryExpr"), makeSuffixedExpr), -- ./candran/can-parser/parser.lua:630 -["PrimaryExpr"] = V("SelfId") * (V("SelfCall") + V("SelfIndex")) + V("Id") + tagC("Paren", sym("(") * expect(V("Expr"), "ExprParen") * expect(sym(")"), "CParenExpr")), -- ./candran/can-parser/parser.lua:633 -["NoCallPrimaryExpr"] = tagC("String", V("String")) + V("Table") + V("TableCompr"), -- ./candran/can-parser/parser.lua:634 -["Index"] = tagC("DotIndex", sym("." * - P(".")) * expect(V("StrId"), "NameIndex")) + tagC("ArrayIndex", sym("[" * - P(S("=["))) * expect(V("Expr"), "ExprIndex") * expect(sym("]"), "CBracketIndex")) + tagC("SafeDotIndex", sym("?." * - P(".")) * expect(V("StrId"), "NameIndex")) + tagC("SafeArrayIndex", sym("?[" * - P(S("=["))) * expect(V("Expr"), "ExprIndex") * expect(sym("]"), "CBracketIndex")), -- ./candran/can-parser/parser.lua:638 -["MethodStub"] = tagC("MethodStub", sym(":" * - P(":")) * expect(V("StrId"), "NameMeth")) + tagC("SafeMethodStub", sym("?:" * - P(":")) * expect(V("StrId"), "NameMeth")), -- ./candran/can-parser/parser.lua:640 -["Call"] = tagC("Call", V("FuncArgs")) + tagC("SafeCall", P("?") * V("FuncArgs")), -- ./candran/can-parser/parser.lua:642 -["SelfCall"] = tagC("MethodStub", V("StrId")) * V("Call"), -- ./candran/can-parser/parser.lua:643 -["SelfIndex"] = tagC("DotIndex", V("StrId")), -- ./candran/can-parser/parser.lua:644 -["FuncDef"] = (kw("function") * V("FuncBody")), -- ./candran/can-parser/parser.lua:646 -["FuncArgs"] = sym("(") * commaSep(V("Expr"), "ArgList") ^ - 1 * expect(sym(")"), "CParenArgs") + V("Table") + tagC("String", V("String")), -- ./candran/can-parser/parser.lua:649 -["Table"] = tagC("Table", sym("{") * V("FieldList") ^ - 1 * expect(sym("}"), "CBraceTable")), -- ./candran/can-parser/parser.lua:651 -["FieldList"] = sepBy(V("Field"), V("FieldSep")) * V("FieldSep") ^ - 1, -- ./candran/can-parser/parser.lua:652 -["Field"] = tagC("Pair", V("FieldKey") * expect(sym("="), "EqField") * expect(V("Expr"), "ExprField")) + V("Expr"), -- ./candran/can-parser/parser.lua:654 -["FieldKey"] = sym("[" * - P(S("=["))) * expect(V("Expr"), "ExprFKey") * expect(sym("]"), "CBracketFKey") + V("StrId") * # ("=" * - P("=")), -- ./candran/can-parser/parser.lua:656 -["FieldSep"] = sym(",") + sym(";"), -- ./candran/can-parser/parser.lua:657 -["TableCompr"] = tagC("TableCompr", sym("[") * V("Block") * expect(sym("]"), "CBracketTableCompr")), -- ./candran/can-parser/parser.lua:659 -["SelfId"] = tagC("Id", sym("@") / "self"), -- ./candran/can-parser/parser.lua:661 -["Id"] = tagC("Id", V("Name")) + V("SelfId"), -- ./candran/can-parser/parser.lua:662 -["AttributeSelfId"] = tagC("AttributeId", sym("@") / "self" * V("Attribute") ^ - 1), -- ./candran/can-parser/parser.lua:663 -["AttributeId"] = tagC("AttributeId", V("Name") * V("Attribute") ^ - 1) + V("AttributeSelfId"), -- ./candran/can-parser/parser.lua:664 -["StrId"] = tagC("String", V("Name")), -- ./candran/can-parser/parser.lua:665 -["Attribute"] = sym("<") * expect(kw("const") / "const" + kw("close") / "close", "UnknownAttribute") * expect(sym(">"), "CBracketAttribute"), -- ./candran/can-parser/parser.lua:667 -["Skip"] = (V("Space") + V("Comment")) ^ 0, -- ./candran/can-parser/parser.lua:670 -["Space"] = space ^ 1, -- ./candran/can-parser/parser.lua:671 -["Comment"] = P("--") * V("LongStr") / function() -- ./candran/can-parser/parser.lua:672 -return -- ./candran/can-parser/parser.lua:672 +")) ^ 0, -- ./candran/can-parser/parser.lua:509 +["Block"] = tagC("Block", (V("Stat") + - V("BlockEnd") * throw("InvalidStat")) ^ 0 * ((V("RetStat") + V("ImplicitPushStat")) * sym(";") ^ - 1) ^ - 1), -- ./candran/can-parser/parser.lua:511 +["Stat"] = V("IfStat") + V("DoStat") + V("WhileStat") + V("RepeatStat") + V("ForStat") + V("LocalStat") + V("FuncStat") + V("BreakStat") + V("LabelStat") + V("GoToStat") + V("LetStat") + V("ConstStat") + V("CloseStat") + V("FuncCall") + V("Assignment") + V("ContinueStat") + V("PushStat") + sym(";"), -- ./candran/can-parser/parser.lua:517 +["BlockEnd"] = P("return") + "end" + "elseif" + "else" + "until" + "]" + - 1 + V("ImplicitPushStat") + V("Assignment"), -- ./candran/can-parser/parser.lua:518 +["SingleStatBlock"] = tagC("Block", V("Stat") + V("RetStat") + V("ImplicitPushStat")) / function(t) -- ./candran/can-parser/parser.lua:520 +t["is_singlestatblock"] = true -- ./candran/can-parser/parser.lua:520 +return t -- ./candran/can-parser/parser.lua:520 +end, -- ./candran/can-parser/parser.lua:520 +["BlockNoErr"] = tagC("Block", V("Stat") ^ 0 * ((V("RetStat") + V("ImplicitPushStat")) * sym(";") ^ - 1) ^ - 1), -- ./candran/can-parser/parser.lua:521 +["IfStat"] = tagC("If", V("IfPart")), -- ./candran/can-parser/parser.lua:523 +["IfPart"] = kw("if") * set("lexpr", expect(V("Expr"), "ExprIf")) * expectBlockOrSingleStatWithStartEnd(kw("then"), "ThenIf", "EndIf", V("ElseIfPart") + V("ElsePart")), -- ./candran/can-parser/parser.lua:524 +["ElseIfPart"] = kw("elseif") * set("lexpr", expect(V("Expr"), "ExprEIf")) * expectBlockOrSingleStatWithStartEnd(kw("then"), "ThenEIf", "EndIf", V("ElseIfPart") + V("ElsePart")), -- ./candran/can-parser/parser.lua:525 +["ElsePart"] = kw("else") * expectBlockWithEnd("EndIf"), -- ./candran/can-parser/parser.lua:526 +["DoStat"] = kw("do") * expectBlockWithEnd("EndDo") / tagDo, -- ./candran/can-parser/parser.lua:528 +["WhileStat"] = tagC("While", kw("while") * set("lexpr", expect(V("Expr"), "ExprWhile")) * V("WhileBody")), -- ./candran/can-parser/parser.lua:529 +["WhileBody"] = expectBlockOrSingleStatWithStartEnd(kw("do"), "DoWhile", "EndWhile"), -- ./candran/can-parser/parser.lua:530 +["RepeatStat"] = tagC("Repeat", kw("repeat") * V("Block") * expect(kw("until"), "UntilRep") * expect(V("Expr"), "ExprRep")), -- ./candran/can-parser/parser.lua:531 +["ForStat"] = kw("for") * expect(V("ForNum") + V("ForIn"), "ForRange"), -- ./candran/can-parser/parser.lua:533 +["ForNum"] = tagC("Fornum", V("Id") * sym("=") * V("NumRange") * V("ForBody")), -- ./candran/can-parser/parser.lua:534 +["NumRange"] = expect(V("Expr"), "ExprFor1") * expect(sym(","), "CommaFor") * expect(V("Expr"), "ExprFor2") * (sym(",") * expect(V("Expr"), "ExprFor3")) ^ - 1, -- ./candran/can-parser/parser.lua:536 +["ForIn"] = tagC("Forin", V("DestructuringNameList") * expect(kw("in"), "InFor") * expect(V("ExprList"), "EListFor") * V("ForBody")), -- ./candran/can-parser/parser.lua:537 +["ForBody"] = expectBlockOrSingleStatWithStartEnd(kw("do"), "DoFor", "EndFor"), -- ./candran/can-parser/parser.lua:538 +["LocalStat"] = kw("local") * expect(V("LocalFunc") + V("LocalAssign"), "DefLocal"), -- ./candran/can-parser/parser.lua:540 +["LocalFunc"] = tagC("Localrec", kw("function") * expect(V("Id"), "NameLFunc") * V("FuncBody")) / fixFuncStat, -- ./candran/can-parser/parser.lua:541 +["LocalAssign"] = tagC("Local", V("AttributeNameList") * (sym("=") * expect(V("ExprList"), "EListLAssign") + Ct(Cc()))) + tagC("Local", V("DestructuringNameList") * sym("=") * expect(V("ExprList"), "EListLAssign")), -- ./candran/can-parser/parser.lua:543 +["LetStat"] = kw("let") * expect(V("LetAssign"), "DefLet"), -- ./candran/can-parser/parser.lua:545 +["LetAssign"] = tagC("Let", V("NameList") * (sym("=") * expect(V("ExprList"), "EListLAssign") + Ct(Cc()))) + tagC("Let", V("DestructuringNameList") * sym("=") * expect(V("ExprList"), "EListLAssign")), -- ./candran/can-parser/parser.lua:547 +["ConstStat"] = kw("const") * expect(V("AttributeAssign") / setAttribute("const"), "DefConst"), -- ./candran/can-parser/parser.lua:549 +["CloseStat"] = kw("close") * expect(V("AttributeAssign") / setAttribute("close"), "DefClose"), -- ./candran/can-parser/parser.lua:550 +["AttributeAssign"] = tagC("Local", V("NameList") * (sym("=") * expect(V("ExprList"), "EListLAssign") + Ct(Cc()))) + tagC("Local", V("DestructuringNameList") * sym("=") * expect(V("ExprList"), "EListLAssign")), -- ./candran/can-parser/parser.lua:552 +["Assignment"] = tagC("Set", (V("VarList") + V("DestructuringNameList")) * V("BinOp") ^ - 1 * (P("=") / "=") * ((V("BinOp") - P("-")) + # (P("-") * V("Space")) * V("BinOp")) ^ - 1 * V("Skip") * expect(V("ExprList"), "EListAssign")), -- ./candran/can-parser/parser.lua:554 +["FuncStat"] = tagC("Set", kw("function") * expect(V("FuncName"), "FuncName") * V("FuncBody")) / fixFuncStat, -- ./candran/can-parser/parser.lua:556 +["FuncName"] = Cf(V("Id") * (sym(".") * expect(V("StrId"), "NameFunc1")) ^ 0, insertIndex) * (sym(":") * expect(V("StrId"), "NameFunc2")) ^ - 1 / markMethod, -- ./candran/can-parser/parser.lua:558 +["FuncBody"] = tagC("Function", V("FuncParams") * expectBlockWithEnd("EndFunc")), -- ./candran/can-parser/parser.lua:559 +["FuncParams"] = expect(sym("("), "OParenPList") * V("ParList") * expect(sym(")"), "CParenPList"), -- ./candran/can-parser/parser.lua:560 +["ParList"] = V("NamedParList") * (sym(",") * expect(tagC("Dots", sym("...")), "ParList")) ^ - 1 / addDots + Ct(tagC("Dots", sym("..."))) + Ct(Cc()), -- ./candran/can-parser/parser.lua:563 +["ShortFuncDef"] = tagC("Function", V("ShortFuncParams") * maybeBlockWithEnd()) / fixShortFunc, -- ./candran/can-parser/parser.lua:565 +["ShortFuncParams"] = (sym(":") / ":") ^ - 1 * sym("(") * V("ParList") * sym(")"), -- ./candran/can-parser/parser.lua:566 +["NamedParList"] = tagC("NamedParList", commaSep(V("NamedPar"))), -- ./candran/can-parser/parser.lua:568 +["NamedPar"] = tagC("ParPair", V("ParKey") * expect(sym("="), "EqField") * expect(V("Expr"), "ExprField")) + V("Id"), -- ./candran/can-parser/parser.lua:570 +["ParKey"] = V("Id") * # ("=" * - P("=")), -- ./candran/can-parser/parser.lua:571 +["LabelStat"] = tagC("Label", sym("::") * expect(V("Name"), "Label") * expect(sym("::"), "CloseLabel")), -- ./candran/can-parser/parser.lua:573 +["GoToStat"] = tagC("Goto", kw("goto") * expect(V("Name"), "Goto")), -- ./candran/can-parser/parser.lua:574 +["BreakStat"] = tagC("Break", kw("break")), -- ./candran/can-parser/parser.lua:575 +["ContinueStat"] = tagC("Continue", kw("continue")), -- ./candran/can-parser/parser.lua:576 +["RetStat"] = tagC("Return", kw("return") * commaSep(V("Expr"), "RetList") ^ - 1), -- ./candran/can-parser/parser.lua:577 +["PushStat"] = tagC("Push", kw("push") * commaSep(V("Expr"), "RetList") ^ - 1), -- ./candran/can-parser/parser.lua:579 +["ImplicitPushStat"] = tagC("Push", commaSep(V("Expr"), "RetList")), -- ./candran/can-parser/parser.lua:580 +["NameList"] = tagC("NameList", commaSep(V("Id"))), -- ./candran/can-parser/parser.lua:582 +["DestructuringNameList"] = tagC("NameList", commaSep(V("DestructuringId"))), -- ./candran/can-parser/parser.lua:583 +["AttributeNameList"] = tagC("AttributeNameList", commaSep(V("AttributeId"))), -- ./candran/can-parser/parser.lua:584 +["VarList"] = tagC("VarList", commaSep(V("VarExpr"))), -- ./candran/can-parser/parser.lua:585 +["ExprList"] = tagC("ExpList", commaSep(V("Expr"), "ExprList")), -- ./candran/can-parser/parser.lua:586 +["DestructuringId"] = tagC("DestructuringId", sym("{") * V("DestructuringIdFieldList") * expect(sym("}"), "CBraceDestructuring")) + V("Id"), -- ./candran/can-parser/parser.lua:588 +["DestructuringIdFieldList"] = sepBy(V("DestructuringIdField"), V("FieldSep")) * V("FieldSep") ^ - 1, -- ./candran/can-parser/parser.lua:589 +["DestructuringIdField"] = tagC("Pair", V("FieldKey") * expect(sym("="), "DestructuringEqField") * expect(V("Id"), "DestructuringExprField")) + V("Id"), -- ./candran/can-parser/parser.lua:591 +["Expr"] = V("OrExpr"), -- ./candran/can-parser/parser.lua:593 +["OrExpr"] = chainOp(V("AndExpr"), V("OrOp"), "OrExpr"), -- ./candran/can-parser/parser.lua:594 +["AndExpr"] = chainOp(V("RelExpr"), V("AndOp"), "AndExpr"), -- ./candran/can-parser/parser.lua:595 +["RelExpr"] = chainOp(V("BOrExpr"), V("RelOp"), "RelExpr"), -- ./candran/can-parser/parser.lua:596 +["BOrExpr"] = chainOp(V("BXorExpr"), V("BOrOp"), "BOrExpr"), -- ./candran/can-parser/parser.lua:597 +["BXorExpr"] = chainOp(V("BAndExpr"), V("BXorOp"), "BXorExpr"), -- ./candran/can-parser/parser.lua:598 +["BAndExpr"] = chainOp(V("ShiftExpr"), V("BAndOp"), "BAndExpr"), -- ./candran/can-parser/parser.lua:599 +["ShiftExpr"] = chainOp(V("ConcatExpr"), V("ShiftOp"), "ShiftExpr"), -- ./candran/can-parser/parser.lua:600 +["ConcatExpr"] = V("AddExpr") * (V("ConcatOp") * expect(V("ConcatExpr"), "ConcatExpr")) ^ - 1 / binaryOp, -- ./candran/can-parser/parser.lua:601 +["AddExpr"] = chainOp(V("MulExpr"), V("AddOp"), "AddExpr"), -- ./candran/can-parser/parser.lua:602 +["MulExpr"] = chainOp(V("UnaryExpr"), V("MulOp"), "MulExpr"), -- ./candran/can-parser/parser.lua:603 +["UnaryExpr"] = V("UnaryOp") * expect(V("UnaryExpr"), "UnaryExpr") / unaryOp + V("PowExpr"), -- ./candran/can-parser/parser.lua:605 +["PowExpr"] = V("SimpleExpr") * (V("PowOp") * expect(V("UnaryExpr"), "PowExpr")) ^ - 1 / binaryOp, -- ./candran/can-parser/parser.lua:606 +["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") + (when("lexpr") * tagC("LetExpr", maybe(V("DestructuringNameList")) * sym("=") * - sym("=") * expect(V("ExprList"), "EListLAssign"))) + V("ShortFuncDef") + V("SuffixedExpr") + V("StatExpr"), -- ./candran/can-parser/parser.lua:616 +["StatExpr"] = (V("IfStat") + V("DoStat") + V("WhileStat") + V("RepeatStat") + V("ForStat")) / statToExpr, -- ./candran/can-parser/parser.lua:618 +["FuncCall"] = Cmt(V("SuffixedExpr"), function(s, i, exp) -- ./candran/can-parser/parser.lua:620 +return exp["tag"] == "Call" or exp["tag"] == "SafeCall", exp -- ./candran/can-parser/parser.lua:620 +end), -- ./candran/can-parser/parser.lua:620 +["VarExpr"] = Cmt(V("SuffixedExpr"), function(s, i, exp) -- ./candran/can-parser/parser.lua:621 +return exp["tag"] == "Id" or exp["tag"] == "Index", exp -- ./candran/can-parser/parser.lua:621 +end), -- ./candran/can-parser/parser.lua:621 +["SuffixedExpr"] = Cf(V("PrimaryExpr") * (V("Index") + V("MethodStub") + V("Call")) ^ 0 + V("NoCallPrimaryExpr") * - V("Call") * (V("Index") + V("MethodStub") + V("Call")) ^ 0 + V("NoCallPrimaryExpr"), makeSuffixedExpr), -- ./candran/can-parser/parser.lua:625 +["PrimaryExpr"] = V("SelfId") * (V("SelfCall") + V("SelfIndex")) + V("Id") + tagC("Paren", sym("(") * expect(V("Expr"), "ExprParen") * expect(sym(")"), "CParenExpr")), -- ./candran/can-parser/parser.lua:628 +["NoCallPrimaryExpr"] = tagC("String", V("String")) + V("Table") + V("TableCompr"), -- ./candran/can-parser/parser.lua:629 +["Index"] = tagC("DotIndex", sym("." * - P(".")) * expect(V("StrId"), "NameIndex")) + tagC("ArrayIndex", sym("[" * - P(S("=["))) * expect(V("Expr"), "ExprIndex") * expect(sym("]"), "CBracketIndex")) + tagC("SafeDotIndex", sym("?." * - P(".")) * expect(V("StrId"), "NameIndex")) + tagC("SafeArrayIndex", sym("?[" * - P(S("=["))) * expect(V("Expr"), "ExprIndex") * expect(sym("]"), "CBracketIndex")), -- ./candran/can-parser/parser.lua:633 +["MethodStub"] = tagC("MethodStub", sym(":" * - P(":")) * expect(V("StrId"), "NameMeth")) + tagC("SafeMethodStub", sym("?:" * - P(":")) * expect(V("StrId"), "NameMeth")), -- ./candran/can-parser/parser.lua:635 +["Call"] = tagC("Call", V("FuncArgs")) + tagC("SafeCall", P("?") * V("FuncArgs")), -- ./candran/can-parser/parser.lua:637 +["SelfCall"] = tagC("MethodStub", V("StrId")) * V("Call"), -- ./candran/can-parser/parser.lua:638 +["SelfIndex"] = tagC("DotIndex", V("StrId")), -- ./candran/can-parser/parser.lua:639 +["FuncDef"] = (kw("function") * V("FuncBody")), -- ./candran/can-parser/parser.lua:641 +["FuncArgs"] = sym("(") * commaSep(V("Expr"), "ArgList") ^ - 1 * expect(sym(")"), "CParenArgs") + V("Table") + tagC("String", V("String")), -- ./candran/can-parser/parser.lua:644 +["Table"] = tagC("Table", sym("{") * V("FieldList") ^ - 1 * expect(sym("}"), "CBraceTable")), -- ./candran/can-parser/parser.lua:646 +["FieldList"] = sepBy(V("Field"), V("FieldSep")) * V("FieldSep") ^ - 1, -- ./candran/can-parser/parser.lua:647 +["Field"] = tagC("Pair", V("FieldKey") * expect(sym("="), "EqField") * expect(V("Expr"), "ExprField")) + V("Expr"), -- ./candran/can-parser/parser.lua:649 +["FieldKey"] = sym("[" * - P(S("=["))) * expect(V("Expr"), "ExprFKey") * expect(sym("]"), "CBracketFKey") + V("StrId") * # ("=" * - P("=")), -- ./candran/can-parser/parser.lua:651 +["FieldSep"] = sym(",") + sym(";"), -- ./candran/can-parser/parser.lua:652 +["TableCompr"] = tagC("TableCompr", sym("[") * V("Block") * expect(sym("]"), "CBracketTableCompr")), -- ./candran/can-parser/parser.lua:654 +["SelfId"] = tagC("Id", sym("@") / "self"), -- ./candran/can-parser/parser.lua:656 +["Id"] = tagC("Id", V("Name")) + V("SelfId"), -- ./candran/can-parser/parser.lua:657 +["AttributeSelfId"] = tagC("AttributeId", sym("@") / "self" * V("Attribute") ^ - 1), -- ./candran/can-parser/parser.lua:658 +["AttributeId"] = tagC("AttributeId", V("Name") * V("Attribute") ^ - 1) + V("AttributeSelfId"), -- ./candran/can-parser/parser.lua:659 +["StrId"] = tagC("String", V("Name")), -- ./candran/can-parser/parser.lua:660 +["Attribute"] = sym("<") * expect(kw("const") / "const" + kw("close") / "close", "UnknownAttribute") * expect(sym(">"), "CBracketAttribute"), -- ./candran/can-parser/parser.lua:662 +["Skip"] = (V("Space") + V("Comment")) ^ 0, -- ./candran/can-parser/parser.lua:665 +["Space"] = space ^ 1, -- ./candran/can-parser/parser.lua:666 +["Comment"] = P("--") * V("LongStr") / function() -- ./candran/can-parser/parser.lua:667 +return -- ./candran/can-parser/parser.lua:667 end + P("--") * (P(1) - P("\ -")) ^ 0, -- ./candran/can-parser/parser.lua:673 -["Name"] = token(- V("Reserved") * C(V("Ident"))), -- ./candran/can-parser/parser.lua:675 -["Reserved"] = V("Keywords") * - V("IdRest"), -- ./candran/can-parser/parser.lua:676 -["Keywords"] = P("and") + "break" + "do" + "elseif" + "else" + "end" + "false" + "for" + "function" + "goto" + "if" + "in" + "local" + "nil" + "not" + "or" + "repeat" + "return" + "then" + "true" + "until" + "while", -- ./candran/can-parser/parser.lua:680 -["Ident"] = V("IdStart") * V("IdRest") ^ 0, -- ./candran/can-parser/parser.lua:681 -["IdStart"] = alpha + P("_"), -- ./candran/can-parser/parser.lua:682 -["IdRest"] = alnum + P("_"), -- ./candran/can-parser/parser.lua:683 -["Number"] = token(C(V("Hex") + V("Float") + V("Int"))), -- ./candran/can-parser/parser.lua:685 -["Hex"] = (P("0x") + "0X") * ((xdigit ^ 0 * V("DeciHex")) + (expect(xdigit ^ 1, "DigitHex") * V("DeciHex") ^ - 1)) * V("ExpoHex") ^ - 1, -- ./candran/can-parser/parser.lua:686 -["Float"] = V("Decimal") * V("Expo") ^ - 1 + V("Int") * V("Expo"), -- ./candran/can-parser/parser.lua:688 -["Decimal"] = digit ^ 1 * "." * digit ^ 0 + P(".") * - P(".") * expect(digit ^ 1, "DigitDeci"), -- ./candran/can-parser/parser.lua:690 -["DeciHex"] = P(".") * xdigit ^ 0, -- ./candran/can-parser/parser.lua:691 -["Expo"] = S("eE") * S("+-") ^ - 1 * expect(digit ^ 1, "DigitExpo"), -- ./candran/can-parser/parser.lua:692 -["ExpoHex"] = S("pP") * S("+-") ^ - 1 * expect(xdigit ^ 1, "DigitExpo"), -- ./candran/can-parser/parser.lua:693 -["Int"] = digit ^ 1, -- ./candran/can-parser/parser.lua:694 -["String"] = token(V("ShortStr") + V("LongStr")), -- ./candran/can-parser/parser.lua:696 +")) ^ 0, -- ./candran/can-parser/parser.lua:668 +["Name"] = token(- V("Reserved") * C(V("Ident"))), -- ./candran/can-parser/parser.lua:670 +["Reserved"] = V("Keywords") * - V("IdRest"), -- ./candran/can-parser/parser.lua:671 +["Keywords"] = P("and") + "break" + "do" + "elseif" + "else" + "end" + "false" + "for" + "function" + "goto" + "if" + "in" + "local" + "nil" + "not" + "or" + "repeat" + "return" + "then" + "true" + "until" + "while", -- ./candran/can-parser/parser.lua:675 +["Ident"] = V("IdStart") * V("IdRest") ^ 0, -- ./candran/can-parser/parser.lua:676 +["IdStart"] = alpha + P("_"), -- ./candran/can-parser/parser.lua:677 +["IdRest"] = alnum + P("_"), -- ./candran/can-parser/parser.lua:678 +["Number"] = token(C(V("Hex") + V("Float") + V("Int"))), -- ./candran/can-parser/parser.lua:680 +["Hex"] = (P("0x") + "0X") * ((xdigit ^ 0 * V("DeciHex")) + (expect(xdigit ^ 1, "DigitHex") * V("DeciHex") ^ - 1)) * V("ExpoHex") ^ - 1, -- ./candran/can-parser/parser.lua:681 +["Float"] = V("Decimal") * V("Expo") ^ - 1 + V("Int") * V("Expo"), -- ./candran/can-parser/parser.lua:683 +["Decimal"] = digit ^ 1 * "." * digit ^ 0 + P(".") * - P(".") * expect(digit ^ 1, "DigitDeci"), -- ./candran/can-parser/parser.lua:685 +["DeciHex"] = P(".") * xdigit ^ 0, -- ./candran/can-parser/parser.lua:686 +["Expo"] = S("eE") * S("+-") ^ - 1 * expect(digit ^ 1, "DigitExpo"), -- ./candran/can-parser/parser.lua:687 +["ExpoHex"] = S("pP") * S("+-") ^ - 1 * expect(xdigit ^ 1, "DigitExpo"), -- ./candran/can-parser/parser.lua:688 +["Int"] = digit ^ 1, -- ./candran/can-parser/parser.lua:689 +["String"] = token(V("ShortStr") + V("LongStr")), -- ./candran/can-parser/parser.lua:691 ["ShortStr"] = P("\"") * Cs((V("EscSeq") + (P(1) - S("\"\ "))) ^ 0) * expect(P("\""), "Quote") + P("'") * Cs((V("EscSeq") + (P(1) - S("'\ -"))) ^ 0) * expect(P("'"), "Quote"), -- ./candran/can-parser/parser.lua:698 -["EscSeq"] = P("\\") / "" * (P("a") / "\7" + P("b") / "\8" + P("f") / "\12" + P("n") / "\ -" + P("r") / "\13" + P("t") / "\9" + P("v") / "\11" + P("\ +"))) ^ 0) * expect(P("'"), "Quote"), -- ./candran/can-parser/parser.lua:693 +["EscSeq"] = P("\\") / "" * (P("a") / "" + P("b") / "" + P("f") / " " + P("n") / "\ +" + P("r") / "\r" + P("t") / " " + P("v") / " " + P("\ ") / "\ -" + P("\13") / "\ -" + P("\\") / "\\" + P("\"") / "\"" + P("'") / "'" + P("z") * space ^ 0 / "" + digit * digit ^ - 2 / tonumber / string["char"] + P("x") * expect(C(xdigit * xdigit), "HexEsc") * Cc(16) / tonumber / string["char"] + P("u") * expect("{", "OBraceUEsc") * expect(C(xdigit ^ 1), "DigitUEsc") * Cc(16) * expect("}", "CBraceUEsc") / tonumber / (utf8 and utf8["char"] or string["char"]) + throw("EscSeq")), -- ./candran/can-parser/parser.lua:728 -["LongStr"] = V("Open") * C((P(1) - V("CloseEq")) ^ 0) * expect(V("Close"), "CloseLStr") / function(s, eqs) -- ./candran/can-parser/parser.lua:731 -return s -- ./candran/can-parser/parser.lua:731 -end, -- ./candran/can-parser/parser.lua:731 +" + P("\r") / "\ +" + P("\\") / "\\" + P("\"") / "\"" + P("'") / "'" + P("z") * space ^ 0 / "" + digit * digit ^ - 2 / tonumber / string["char"] + P("x") * expect(C(xdigit * xdigit), "HexEsc") * Cc(16) / tonumber / string["char"] + P("u") * expect("{", "OBraceUEsc") * expect(C(xdigit ^ 1), "DigitUEsc") * Cc(16) * expect("}", "CBraceUEsc") / tonumber / (utf8 and utf8["char"] or string["char"]) + throw("EscSeq")), -- ./candran/can-parser/parser.lua:723 +["LongStr"] = V("Open") * C((P(1) - V("CloseEq")) ^ 0) * expect(V("Close"), "CloseLStr") / function(s, eqs) -- ./candran/can-parser/parser.lua:726 +return s -- ./candran/can-parser/parser.lua:726 +end, -- ./candran/can-parser/parser.lua:726 ["Open"] = "[" * Cg(V("Equals"), "openEq") * "[" * P("\ -") ^ - 1, -- ./candran/can-parser/parser.lua:732 -["Close"] = "]" * C(V("Equals")) * "]", -- ./candran/can-parser/parser.lua:733 -["Equals"] = P("=") ^ 0, -- ./candran/can-parser/parser.lua:734 -["CloseEq"] = Cmt(V("Close") * Cb("openEq"), function(s, i, closeEq, openEq) -- ./candran/can-parser/parser.lua:735 -return # openEq == # closeEq -- ./candran/can-parser/parser.lua:735 -end), -- ./candran/can-parser/parser.lua:735 -["OrOp"] = kw("or") / "or", -- ./candran/can-parser/parser.lua:737 -["AndOp"] = kw("and") / "and", -- ./candran/can-parser/parser.lua:738 -["RelOp"] = sym("~=") / "ne" + sym("==") / "eq" + sym("<=") / "le" + sym(">=") / "ge" + sym("<") / "lt" + sym(">") / "gt", -- ./candran/can-parser/parser.lua:744 -["BOrOp"] = sym("|") / "bor", -- ./candran/can-parser/parser.lua:745 -["BXorOp"] = sym("~" * - P("=")) / "bxor", -- ./candran/can-parser/parser.lua:746 -["BAndOp"] = sym("&") / "band", -- ./candran/can-parser/parser.lua:747 -["ShiftOp"] = sym("<<") / "shl" + sym(">>") / "shr", -- ./candran/can-parser/parser.lua:749 -["ConcatOp"] = sym("..") / "concat", -- ./candran/can-parser/parser.lua:750 -["AddOp"] = sym("+") / "add" + sym("-") / "sub", -- ./candran/can-parser/parser.lua:752 -["MulOp"] = sym("*") / "mul" + sym("//") / "idiv" + sym("/") / "div" + sym("%") / "mod", -- ./candran/can-parser/parser.lua:756 -["UnaryOp"] = kw("not") / "not" + sym("-") / "unm" + sym("#") / "len" + sym("~") / "bnot", -- ./candran/can-parser/parser.lua:760 -["PowOp"] = sym("^") / "pow", -- ./candran/can-parser/parser.lua:761 -["BinOp"] = V("OrOp") + V("AndOp") + V("BOrOp") + V("BXorOp") + V("BAndOp") + V("ShiftOp") + V("ConcatOp") + V("AddOp") + V("MulOp") + V("PowOp") -- ./candran/can-parser/parser.lua:762 -} -- ./candran/can-parser/parser.lua:762 -local macroidentifier = { -- ./candran/can-parser/parser.lua:766 -expect(V("MacroIdentifier"), "InvalidStat") * expect(P(- 1), "Extra"), -- ./candran/can-parser/parser.lua:767 -["MacroIdentifier"] = tagC("MacroFunction", V("Id") * sym("(") * V("MacroFunctionArgs") * expect(sym(")"), "CParenPList")) + V("Id"), -- ./candran/can-parser/parser.lua:770 -["MacroFunctionArgs"] = V("NameList") * (sym(",") * expect(tagC("Dots", sym("...")), "ParList")) ^ - 1 / addDots + Ct(tagC("Dots", sym("..."))) + Ct(Cc()) -- ./candran/can-parser/parser.lua:774 -} -- ./candran/can-parser/parser.lua:774 -for k, v in pairs(G) do -- ./candran/can-parser/parser.lua:777 -if macroidentifier[k] == nil then -- ./candran/can-parser/parser.lua:777 -macroidentifier[k] = v -- ./candran/can-parser/parser.lua:777 +") ^ - 1, -- ./candran/can-parser/parser.lua:727 +["Close"] = "]" * C(V("Equals")) * "]", -- ./candran/can-parser/parser.lua:728 +["Equals"] = P("=") ^ 0, -- ./candran/can-parser/parser.lua:729 +["CloseEq"] = Cmt(V("Close") * Cb("openEq"), function(s, i, closeEq, openEq) -- ./candran/can-parser/parser.lua:730 +return # openEq == # closeEq -- ./candran/can-parser/parser.lua:730 +end), -- ./candran/can-parser/parser.lua:730 +["OrOp"] = kw("or") / "or", -- ./candran/can-parser/parser.lua:732 +["AndOp"] = kw("and") / "and", -- ./candran/can-parser/parser.lua:733 +["RelOp"] = sym("~=") / "ne" + sym("==") / "eq" + sym("<=") / "le" + sym(">=") / "ge" + sym("<") / "lt" + sym(">") / "gt", -- ./candran/can-parser/parser.lua:739 +["BOrOp"] = sym("|") / "bor", -- ./candran/can-parser/parser.lua:740 +["BXorOp"] = sym("~" * - P("=")) / "bxor", -- ./candran/can-parser/parser.lua:741 +["BAndOp"] = sym("&") / "band", -- ./candran/can-parser/parser.lua:742 +["ShiftOp"] = sym("<<") / "shl" + sym(">>") / "shr", -- ./candran/can-parser/parser.lua:744 +["ConcatOp"] = sym("..") / "concat", -- ./candran/can-parser/parser.lua:745 +["AddOp"] = sym("+") / "add" + sym("-") / "sub", -- ./candran/can-parser/parser.lua:747 +["MulOp"] = sym("*") / "mul" + sym("//") / "idiv" + sym("/") / "div" + sym("%") / "mod", -- ./candran/can-parser/parser.lua:751 +["UnaryOp"] = kw("not") / "not" + sym("-") / "unm" + sym("#") / "len" + sym("~") / "bnot", -- ./candran/can-parser/parser.lua:755 +["PowOp"] = sym("^") / "pow", -- ./candran/can-parser/parser.lua:756 +["BinOp"] = V("OrOp") + V("AndOp") + V("BOrOp") + V("BXorOp") + V("BAndOp") + V("ShiftOp") + V("ConcatOp") + V("AddOp") + V("MulOp") + V("PowOp") -- ./candran/can-parser/parser.lua:757 +} -- ./candran/can-parser/parser.lua:757 +local parser = {} -- ./candran/can-parser/parser.lua:760 +local validator = require("candran.can-parser.validator") -- ./candran/can-parser/parser.lua:762 +local validate = validator["validate"] -- ./candran/can-parser/parser.lua:763 +local syntaxerror = validator["syntaxerror"] -- ./candran/can-parser/parser.lua:764 +parser["parse"] = function(subject, filename) -- ./candran/can-parser/parser.lua:766 +local errorinfo = { -- ./candran/can-parser/parser.lua:767 +["subject"] = subject, -- ./candran/can-parser/parser.lua:767 +["filename"] = filename -- ./candran/can-parser/parser.lua:767 +} -- ./candran/can-parser/parser.lua:767 +lpeg["setmaxstack"](1000) -- ./candran/can-parser/parser.lua:768 +local ast, label, errpos = lpeg["match"](G, subject, nil, errorinfo) -- ./candran/can-parser/parser.lua:769 +if not ast then -- ./candran/can-parser/parser.lua:770 +local errmsg = labels[label][2] -- ./candran/can-parser/parser.lua:771 +return ast, syntaxerror(errorinfo, errpos, errmsg) -- ./candran/can-parser/parser.lua:772 +end -- ./candran/can-parser/parser.lua:772 +return validate(ast, errorinfo) -- ./candran/can-parser/parser.lua:774 +end -- ./candran/can-parser/parser.lua:774 +return parser -- ./candran/can-parser/parser.lua:777 end -- ./candran/can-parser/parser.lua:777 -end -- ./candran/can-parser/parser.lua:777 -local parser = {} -- ./candran/can-parser/parser.lua:779 -local validator = require("candran.can-parser.validator") -- ./candran/can-parser/parser.lua:781 -local validate = validator["validate"] -- ./candran/can-parser/parser.lua:782 -local syntaxerror = validator["syntaxerror"] -- ./candran/can-parser/parser.lua:783 -parser["parse"] = function(subject, filename) -- ./candran/can-parser/parser.lua:785 -local errorinfo = { -- ./candran/can-parser/parser.lua:786 -["subject"] = subject, -- ./candran/can-parser/parser.lua:786 -["filename"] = filename -- ./candran/can-parser/parser.lua:786 -} -- ./candran/can-parser/parser.lua:786 -lpeg["setmaxstack"](1000) -- ./candran/can-parser/parser.lua:787 -local ast, label, errpos = lpeg["match"](G, subject, nil, errorinfo) -- ./candran/can-parser/parser.lua:788 -if not ast then -- ./candran/can-parser/parser.lua:789 -local errmsg = labels[label][2] -- ./candran/can-parser/parser.lua:790 -return ast, syntaxerror(errorinfo, errpos, errmsg) -- ./candran/can-parser/parser.lua:791 -end -- ./candran/can-parser/parser.lua:791 -return validate(ast, errorinfo) -- ./candran/can-parser/parser.lua:793 -end -- ./candran/can-parser/parser.lua:793 -parser["parsemacroidentifier"] = function(subject, filename) -- ./candran/can-parser/parser.lua:796 -local errorinfo = { -- ./candran/can-parser/parser.lua:797 -["subject"] = subject, -- ./candran/can-parser/parser.lua:797 -["filename"] = filename -- ./candran/can-parser/parser.lua:797 -} -- ./candran/can-parser/parser.lua:797 -lpeg["setmaxstack"](1000) -- ./candran/can-parser/parser.lua:798 -local ast, label, errpos = lpeg["match"](macroidentifier, subject, nil, errorinfo) -- ./candran/can-parser/parser.lua:799 -if not ast then -- ./candran/can-parser/parser.lua:800 -local errmsg = labels[label][2] -- ./candran/can-parser/parser.lua:801 -return ast, syntaxerror(errorinfo, errpos, errmsg) -- ./candran/can-parser/parser.lua:802 -end -- ./candran/can-parser/parser.lua:802 -return ast -- ./candran/can-parser/parser.lua:804 -end -- ./candran/can-parser/parser.lua:804 -return parser -- ./candran/can-parser/parser.lua:807 -end -- ./candran/can-parser/parser.lua:807 -local parser = _() or parser -- ./candran/can-parser/parser.lua:811 -package["loaded"]["candran.can-parser.parser"] = parser or true -- ./candran/can-parser/parser.lua:812 -local unpack = unpack or table["unpack"] -- candran.can:20 +local parser = _() or parser -- ./candran/can-parser/parser.lua:781 +package["loaded"]["candran.can-parser.parser"] = parser or true -- ./candran/can-parser/parser.lua:782 +local unpack = unpack or table["unpack"] -- candran.can:15 +local candran = { ["VERSION"] = "0.14.0" } -- candran.can:18 +package["loaded"]["candran"] = candran -- candran.can:20 candran["default"] = { -- candran.can:23 ["target"] = "lua54", -- candran.can:24 ["indentation"] = "", -- candran.can:25 @@ -7022,326 +6408,267 @@ candran["default"] = { -- candran.can:23 ["variablePrefix"] = "__CAN_", -- candran.can:27 ["mapLines"] = true, -- candran.can:28 ["chunkname"] = "nil", -- candran.can:29 -["rewriteErrors"] = true, -- candran.can:30 -["builtInMacros"] = true, -- candran.can:31 -["preprocessorEnv"] = {}, -- candran.can:32 -["import"] = {} -- candran.can:33 -} -- candran.can:33 -if _VERSION == "Lua 5.1" then -- candran.can:37 -if package["loaded"]["jit"] then -- candran.can:38 -candran["default"]["target"] = "luajit" -- candran.can:39 -else -- candran.can:39 -candran["default"]["target"] = "lua51" -- candran.can:41 -end -- candran.can:41 -elseif _VERSION == "Lua 5.2" then -- candran.can:43 -candran["default"]["target"] = "lua52" -- candran.can:44 -elseif _VERSION == "Lua 5.3" then -- candran.can:45 -candran["default"]["target"] = "lua53" -- candran.can:46 -end -- candran.can:46 -candran["preprocess"] = function(input, options, _env) -- candran.can:56 -if options == nil then options = {} end -- candran.can:56 -options = util["merge"](candran["default"], options) -- candran.can:57 -local macros = { -- candran.can:58 -["functions"] = {}, -- candran.can:59 -["variables"] = {} -- candran.can:60 -} -- candran.can:60 -for _, mod in ipairs(options["import"]) do -- candran.can:64 -input = (("#import(%q, {loadLocal=false})\ -"):format(mod)) .. input -- candran.can:65 -end -- candran.can:65 -local preprocessor = "" -- candran.can:69 -local i = 0 -- candran.can:70 -local inLongString = false -- candran.can:71 -local inComment = false -- candran.can:72 +["rewriteErrors"] = true -- candran.can:30 +} -- candran.can:30 +if _VERSION == "Lua 5.1" then -- candran.can:34 +if package["loaded"]["jit"] then -- candran.can:35 +candran["default"]["target"] = "luajit" -- candran.can:36 +else -- candran.can:36 +candran["default"]["target"] = "lua51" -- candran.can:38 +end -- candran.can:38 +elseif _VERSION == "Lua 5.2" then -- candran.can:40 +candran["default"]["target"] = "lua52" -- candran.can:41 +elseif _VERSION == "Lua 5.3" then -- candran.can:42 +candran["default"]["target"] = "lua53" -- candran.can:43 +end -- candran.can:43 +candran["preprocess"] = function(input, options) -- candran.can:52 +if options == nil then options = {} end -- candran.can:52 +options = util["merge"](candran["default"], options) -- candran.can:53 +local preprocessor = "" -- candran.can:56 +local i = 0 -- candran.can:57 +local inLongString = false -- candran.can:58 +local inComment = false -- candran.can:59 for line in (input .. "\ "):gmatch("(.-\ -)") do -- candran.can:73 -i = i + (1) -- candran.can:74 -if inComment then -- candran.can:76 -inComment = not line:match("%]%]") -- candran.can:77 -elseif inLongString then -- candran.can:78 -inLongString = not line:match("%]%]") -- candran.can:79 -else -- candran.can:79 -if line:match("[^%-]%[%[") then -- candran.can:81 -inLongString = true -- candran.can:82 -elseif line:match("%-%-%[%[") then -- candran.can:83 -inComment = true -- candran.can:84 -end -- candran.can:84 -end -- candran.can:84 -if not inComment and not inLongString and line:match("^%s*#") and not line:match("^#!") then -- candran.can:87 -preprocessor = preprocessor .. (line:gsub("^%s*#", "")) -- candran.can:88 -else -- candran.can:88 -local l = line:sub(1, - 2) -- candran.can:90 -if not inLongString and options["mapLines"] and not l:match("%-%- (.-)%:(%d+)$") then -- candran.can:91 +)") do -- candran.can:60 +i = i + (1) -- candran.can:61 +if inComment then -- candran.can:63 +inComment = not line:match("%]%]") -- candran.can:64 +elseif inLongString then -- candran.can:65 +inLongString = not line:match("%]%]") -- candran.can:66 +else -- candran.can:66 +if line:match("[^%-]%[%[") then -- candran.can:68 +inLongString = true -- candran.can:69 +elseif line:match("%-%-%[%[") then -- candran.can:70 +inComment = true -- candran.can:71 +end -- candran.can:71 +end -- candran.can:71 +if not inComment and not inLongString and line:match("^%s*#") and not line:match("^#!") then -- candran.can:74 +preprocessor = preprocessor .. (line:gsub("^%s*#", "")) -- candran.can:75 +else -- candran.can:75 +local l = line:sub(1, - 2) -- candran.can:77 +if not inLongString and options["mapLines"] and not l:match("%-%- (.-)%:(%d+)$") then -- candran.can:78 preprocessor = preprocessor .. (("write(%q)"):format(l .. " -- " .. options["chunkname"] .. ":" .. i) .. "\ -") -- candran.can:92 -else -- candran.can:92 +") -- candran.can:79 +else -- candran.can:79 preprocessor = preprocessor .. (("write(%q)"):format(line:sub(1, - 2)) .. "\ -") -- candran.can:94 -end -- candran.can:94 -end -- candran.can:94 -end -- candran.can:94 -preprocessor = preprocessor .. ("return output") -- candran.can:98 -local exportenv = {} -- candran.can:101 -local env = util["merge"](_G, options["preprocessorEnv"]) -- candran.can:102 -env["candran"] = candran -- candran.can:104 -env["output"] = "" -- candran.can:106 -env["import"] = function(modpath, margs) -- candran.can:113 -if margs == nil then margs = {} end -- candran.can:113 -local filepath = assert(util["search"](modpath, { -- candran.can:114 -"can", -- candran.can:114 -"lua" -- candran.can:114 -}), "No module named \"" .. modpath .. "\"") -- candran.can:114 -local f = io["open"](filepath) -- candran.can:117 -if not f then -- candran.can:118 -error("can't open the module file to import") -- candran.can:118 -end -- candran.can:118 -margs = util["merge"](options, { -- candran.can:120 -["chunkname"] = filepath, -- candran.can:120 -["loadLocal"] = true, -- candran.can:120 -["loadPackage"] = true -- candran.can:120 -}, margs) -- candran.can:120 -margs["import"] = {} -- candran.can:121 -local modcontent, modmacros, modenv = assert(candran["preprocess"](f:read("*a"), margs)) -- candran.can:122 -macros = util["recmerge"](macros, modmacros) -- candran.can:123 -for k, v in pairs(modenv) do -- candran.can:124 -env[k] = v -- candran.can:124 -end -- candran.can:124 -f:close() -- candran.can:125 -local modname = modpath:match("[^%.]+$") -- candran.can:128 +") -- candran.can:81 +end -- candran.can:81 +end -- candran.can:81 +end -- candran.can:81 +preprocessor = preprocessor .. ("return output") -- candran.can:85 +local env = util["merge"](_G, options) -- candran.can:88 +env["candran"] = candran -- candran.can:90 +env["output"] = "" -- candran.can:92 +env["import"] = function(modpath, margs) -- candran.can:99 +if margs == nil then margs = {} end -- candran.can:99 +local filepath = assert(util["search"](modpath, { -- candran.can:100 +"can", -- candran.can:100 +"lua" -- candran.can:100 +}), "No module named \"" .. modpath .. "\"") -- candran.can:100 +local f = io["open"](filepath) -- candran.can:103 +if not f then -- candran.can:104 +error("can't open the module file to import") -- candran.can:104 +end -- candran.can:104 +margs = util["merge"](options, { -- candran.can:106 +["chunkname"] = filepath, -- candran.can:106 +["loadLocal"] = true, -- candran.can:106 +["loadPackage"] = true -- candran.can:106 +}, margs) -- candran.can:106 +local modcontent = assert(candran["preprocess"](f:read("*a"), margs)) -- candran.can:107 +f:close() -- candran.can:108 +local modname = modpath:match("[^%.]+$") -- candran.can:111 env["write"]("-- MODULE " .. modpath .. " --\ " .. "local function _()\ " .. modcontent .. "\ " .. "end\ " .. (margs["loadLocal"] and ("local %s = _() or %s\ "):format(modname, modname) or "") .. (margs["loadPackage"] and ("package.loaded[%q] = %s or true\ -"):format(modpath, margs["loadLocal"] and modname or "_()") or "") .. "-- END OF MODULE " .. modpath .. " --") -- candran.can:137 -end -- candran.can:137 -env["include"] = function(file) -- candran.can:142 -local f = io["open"](file) -- candran.can:143 -if not f then -- candran.can:144 -error("can't open the file " .. file .. " to include") -- candran.can:144 -end -- candran.can:144 -env["write"](f:read("*a")) -- candran.can:145 -f:close() -- candran.can:146 -end -- candran.can:146 -env["write"] = function(...) -- candran.can:150 -env["output"] = env["output"] .. (table["concat"]({ ... }, "\9") .. "\ -") -- candran.can:151 -end -- candran.can:151 -env["placeholder"] = function(name) -- candran.can:155 -if env[name] then -- candran.can:156 -env["write"](env[name]) -- candran.can:157 -end -- candran.can:157 -end -- candran.can:157 -env["define"] = function(identifier, replacement) -- candran.can:160 -local iast, ierr = parser["parsemacroidentifier"](identifier, options["chunkname"]) -- candran.can:162 -if not iast then -- candran.can:163 -return error(("in macro identifier: %s"):format(tostring(ierr))) -- candran.can:164 -end -- candran.can:164 -if type(replacement) == "string" then -- candran.can:167 -local rast, rerr = parser["parse"](replacement, options["chunkname"]) -- candran.can:168 -if not rast then -- candran.can:169 -return error(("in macro replacement: %s"):format(tostring(rerr))) -- candran.can:170 -end -- candran.can:170 -if # rast == 1 and rast[1]["tag"] == "Push" and rast[1]["implicit"] then -- candran.can:173 -rast = rast[1][1] -- candran.can:174 -end -- candran.can:174 -replacement = rast -- candran.can:176 -elseif type(replacement) ~= "function" then -- candran.can:177 -error("bad argument #2 to 'define' (string or function expected)") -- candran.can:178 -end -- candran.can:178 -if iast["tag"] == "MacroFunction" then -- candran.can:181 -macros["functions"][iast[1][1]] = { -- candran.can:182 -["args"] = iast[2], -- candran.can:182 -["replacement"] = replacement -- candran.can:182 -} -- candran.can:182 -elseif iast["tag"] == "Id" then -- candran.can:183 -macros["variables"][iast[1]] = replacement -- candran.can:184 -else -- candran.can:184 -error(("invalid macro type %s"):format(tostring(iast["tag"]))) -- candran.can:186 -end -- candran.can:186 -end -- candran.can:186 -env["set"] = function(identifier, value) -- candran.can:189 -exportenv[identifier] = value -- candran.can:190 -env[identifier] = value -- candran.can:191 -end -- candran.can:191 -if options["builtInMacros"] then -- candran.can:195 -env["define"]("__STR__(x)", function(x) -- candran.can:196 -return ("%q"):format(x) -- candran.can:196 -end) -- candran.can:196 -local s = require("candran.serpent") -- candran.can:197 -env["define"]("__CONSTEXPR__(expr)", function(expr) -- candran.can:198 -return s["block"](assert(candran["load"](expr))(), { ["fatal"] = true }) -- candran.can:199 -end) -- candran.can:199 -end -- candran.can:199 -local preprocess, err = candran["compile"](preprocessor, options) -- candran.can:204 -if not preprocess then -- candran.can:205 -return nil, "in preprocessor: " .. err -- candran.can:206 +"):format(modpath, margs["loadLocal"] and modname or "_()") or "") .. "-- END OF MODULE " .. modpath .. " --") -- candran.can:120 +end -- candran.can:120 +env["include"] = function(file) -- candran.can:125 +local f = io["open"](file) -- candran.can:126 +if not f then -- candran.can:127 +error("can't open the file " .. file .. " to include") -- candran.can:127 +end -- candran.can:127 +env["write"](f:read("*a")) -- candran.can:128 +f:close() -- candran.can:129 +end -- candran.can:129 +env["write"] = function(...) -- candran.can:133 +env["output"] = env["output"] .. (table["concat"]({ ... }, " ") .. "\ +") -- candran.can:134 +end -- candran.can:134 +env["placeholder"] = function(name) -- candran.can:138 +if env[name] then -- candran.can:139 +env["write"](env[name]) -- candran.can:140 +end -- candran.can:140 +end -- candran.can:140 +local preprocess, err = candran["compile"](preprocessor, options) -- candran.can:145 +if not preprocess then -- candran.can:146 +return nil, "in preprocessor: " .. err -- candran.can:147 +end -- candran.can:147 +preprocess, err = util["load"](preprocessor, "candran preprocessor", env) -- candran.can:150 +if not preprocess then -- candran.can:151 +return nil, "in preprocessor: " .. err -- candran.can:152 +end -- candran.can:152 +local success, output = pcall(preprocess) -- candran.can:156 +if not success then -- candran.can:157 +return nil, "in preprocessor: " .. output -- candran.can:158 +end -- candran.can:158 +return output -- candran.can:161 +end -- candran.can:161 +candran["compile"] = function(input, options) -- candran.can:170 +if options == nil then options = {} end -- candran.can:170 +options = util["merge"](candran["default"], options) -- candran.can:171 +local ast, errmsg = parser["parse"](input, options["chunkname"]) -- candran.can:173 +if not ast then -- candran.can:175 +return nil, errmsg -- candran.can:176 +end -- candran.can:176 +return require("compiler." .. options["target"])(input, ast, options) -- candran.can:179 +end -- candran.can:179 +candran["make"] = function(code, options) -- candran.can:188 +local r, err = candran["preprocess"](code, options) -- candran.can:189 +if r then -- candran.can:190 +r, err = candran["compile"](r, options) -- candran.can:191 +if r then -- candran.can:192 +return r -- candran.can:193 +end -- candran.can:193 +end -- candran.can:193 +return r, err -- candran.can:196 +end -- candran.can:196 +local errorRewritingActive = false -- candran.can:199 +local codeCache = {} -- candran.can:200 +candran["loadfile"] = function(filepath, env, options) -- candran.can:203 +local f, err = io["open"](filepath) -- candran.can:204 +if not f then -- candran.can:205 +return nil, ("cannot open %s"):format(err) -- candran.can:206 end -- candran.can:206 -preprocess, err = util["load"](preprocessor, "candran preprocessor", env) -- candran.can:209 -if not preprocess then -- candran.can:210 -return nil, "in preprocessor: " .. err -- candran.can:211 +local content = f:read("*a") -- candran.can:208 +f:close() -- candran.can:209 +return candran["load"](content, filepath, env, options) -- candran.can:211 end -- candran.can:211 -local success, output = pcall(preprocess) -- candran.can:215 -if not success then -- candran.can:216 -return nil, "in preprocessor: " .. output -- candran.can:217 -end -- candran.can:217 -return output, macros, exportenv -- candran.can:220 -end -- candran.can:220 -candran["compile"] = function(input, options, macros) -- candran.can:230 -if options == nil then options = {} end -- candran.can:230 -options = util["merge"](candran["default"], options) -- candran.can:231 -local ast, errmsg = parser["parse"](input, options["chunkname"]) -- candran.can:233 -if not ast then -- candran.can:235 -return nil, errmsg -- candran.can:236 -end -- candran.can:236 -return require("compiler." .. options["target"])(input, ast, options, macros) -- candran.can:239 -end -- candran.can:239 -candran["make"] = function(code, options) -- candran.can:248 -local r, err = candran["preprocess"](code, options) -- candran.can:249 -if r then -- candran.can:250 -r, err = candran["compile"](r, options, err) -- candran.can:251 -if r then -- candran.can:252 -return r -- candran.can:253 -end -- candran.can:253 -end -- candran.can:253 -return r, err -- candran.can:256 -end -- candran.can:256 -local errorRewritingActive = false -- candran.can:259 -local codeCache = {} -- candran.can:260 -candran["loadfile"] = function(filepath, env, options) -- candran.can:263 -local f, err = io["open"](filepath) -- candran.can:264 -if not f then -- candran.can:265 -return nil, ("cannot open %s"):format(tostring(err)) -- candran.can:266 -end -- candran.can:266 -local content = f:read("*a") -- candran.can:268 -f:close() -- candran.can:269 -return candran["load"](content, filepath, env, options) -- candran.can:271 -end -- candran.can:271 -candran["load"] = function(chunk, chunkname, env, options) -- candran.can:276 -if options == nil then options = {} end -- candran.can:276 -options = util["merge"]({ ["chunkname"] = tostring(chunkname or chunk) }, options) -- candran.can:277 -local code, err = candran["make"](chunk, options) -- candran.can:279 -if not code then -- candran.can:280 -return code, err -- candran.can:281 -end -- candran.can:281 -codeCache[options["chunkname"]] = code -- candran.can:284 -local f -- candran.can:285 -f, err = util["load"](code, ("=%s(%s)"):format(options["chunkname"], "compiled candran"), env) -- candran.can:286 -if f == nil then -- candran.can:291 -return f, "candran unexpectedly generated invalid code: " .. err -- candran.can:292 -end -- candran.can:292 -if options["rewriteErrors"] == false then -- candran.can:295 -return f -- candran.can:296 -else -- candran.can:296 -return function(...) -- candran.can:298 -if not errorRewritingActive then -- candran.can:299 -errorRewritingActive = true -- candran.can:300 -local t = { xpcall(f, candran["messageHandler"], ...) } -- candran.can:301 -errorRewritingActive = false -- candran.can:302 -if t[1] == false then -- candran.can:303 -error(t[2], 0) -- candran.can:304 -end -- candran.can:304 -return unpack(t, 2) -- candran.can:306 -else -- candran.can:306 -return f(...) -- candran.can:308 -end -- candran.can:308 -end -- candran.can:308 -end -- candran.can:308 -end -- candran.can:308 -candran["dofile"] = function(filename, options) -- candran.can:316 -local f, err = candran["loadfile"](filename, nil, options) -- candran.can:317 -if f == nil then -- candran.can:319 -error(err) -- candran.can:320 -else -- candran.can:320 -return f() -- candran.can:322 -end -- candran.can:322 -end -- candran.can:322 -candran["messageHandler"] = function(message, noTraceback) -- candran.can:328 -message = tostring(message) -- candran.can:329 +candran["load"] = function(chunk, chunkname, env, options) -- candran.can:216 +if options == nil then options = {} end -- candran.can:216 +options = util["merge"]({ ["chunkname"] = tostring(chunkname or chunk) }, options) -- candran.can:217 +local code, err = candran["make"](chunk, options) -- candran.can:219 +if not code then -- candran.can:220 +return code, err -- candran.can:221 +end -- candran.can:221 +codeCache[options["chunkname"]] = code -- candran.can:224 +local f -- candran.can:225 +f, err = util["load"](code, ("=%s(%s)"):format(options["chunkname"], "compiled candran"), env) -- candran.can:226 +if f == nil then -- candran.can:231 +return f, "candran unexpectedly generated invalid code: " .. err -- candran.can:232 +end -- candran.can:232 +if options["rewriteErrors"] == false then -- candran.can:235 +return f -- candran.can:236 +else -- candran.can:236 +return function(...) -- candran.can:238 +if not errorRewritingActive then -- candran.can:239 +errorRewritingActive = true -- candran.can:240 +local t = { xpcall(f, candran["messageHandler"], ...) } -- candran.can:241 +errorRewritingActive = false -- candran.can:242 +if t[1] == false then -- candran.can:243 +error(t[2], 0) -- candran.can:244 +end -- candran.can:244 +return unpack(t, 2) -- candran.can:246 +else -- candran.can:246 +return f(...) -- candran.can:248 +end -- candran.can:248 +end -- candran.can:248 +end -- candran.can:248 +end -- candran.can:248 +candran["dofile"] = function(filename, options) -- candran.can:256 +local f, err = candran["loadfile"](filename, nil, options) -- candran.can:257 +if f == nil then -- candran.can:259 +error(err) -- candran.can:260 +else -- candran.can:260 +return f() -- candran.can:262 +end -- candran.can:262 +end -- candran.can:262 +candran["messageHandler"] = function(message, noTraceback) -- candran.can:268 if not noTraceback and not message:match("\ stack traceback:\ -") then -- candran.can:330 -message = debug["traceback"](message, 2) -- candran.can:331 -end -- candran.can:331 +") then -- candran.can:269 +message = debug["traceback"](message, 2) -- candran.can:270 +end -- candran.can:270 return message:gsub("(\ ?%s*)([^\ -]-)%:(%d+)%:", function(indentation, source, line) -- candran.can:333 -line = tonumber(line) -- candran.can:334 -local originalFile -- candran.can:336 -local strName = source:match("^(.-)%(compiled candran%)$") -- candran.can:337 -if strName then -- candran.can:338 -if codeCache[strName] then -- candran.can:339 -originalFile = codeCache[strName] -- candran.can:340 -source = strName -- candran.can:341 -end -- candran.can:341 -else -- candran.can:341 -do -- candran.can:344 -local fi -- candran.can:344 -fi = io["open"](source, "r") -- candran.can:344 -if fi then -- candran.can:344 -originalFile = fi:read("*a") -- candran.can:345 -fi:close() -- candran.can:346 -end -- candran.can:346 -end -- candran.can:346 -end -- candran.can:346 -if originalFile then -- candran.can:350 -local i = 0 -- candran.can:351 +]-)%:(%d+)%:", function(indentation, source, line) -- candran.can:272 +line = tonumber(line) -- candran.can:273 +local originalFile -- candran.can:275 +local strName = source:match("^(.-)%(compiled candran%)$") -- candran.can:276 +if strName then -- candran.can:277 +if codeCache[strName] then -- candran.can:278 +originalFile = codeCache[strName] -- candran.can:279 +source = strName -- candran.can:280 +end -- candran.can:280 +else -- candran.can:280 +do -- candran.can:283 +local fi -- candran.can:283 +fi = io["open"](source, "r") -- candran.can:283 +if fi then -- candran.can:283 +originalFile = fi:read("*a") -- candran.can:284 +fi:close() -- candran.can:285 +end -- candran.can:285 +end -- candran.can:285 +end -- candran.can:285 +if originalFile then -- candran.can:289 +local i = 0 -- candran.can:290 for l in (originalFile .. "\ "):gmatch("([^\ ]*)\ -") do -- candran.can:352 -i = i + 1 -- candran.can:353 -if i == line then -- candran.can:354 -local extSource, lineMap = l:match(".*%-%- (.-)%:(%d+)$") -- candran.can:355 -if lineMap then -- candran.can:356 -if extSource ~= source then -- candran.can:357 -return indentation .. extSource .. ":" .. lineMap .. "(" .. extSource .. ":" .. line .. "):" -- candran.can:358 -else -- candran.can:358 -return indentation .. extSource .. ":" .. lineMap .. "(" .. line .. "):" -- candran.can:360 -end -- candran.can:360 -end -- candran.can:360 -break -- candran.can:363 -end -- candran.can:363 -end -- candran.can:363 -end -- candran.can:363 -end) -- candran.can:363 -end -- candran.can:363 -candran["searcher"] = function(modpath) -- candran.can:371 -local filepath = util["search"](modpath, { "can" }) -- candran.can:372 -if not filepath then -- candran.can:373 -if _VERSION == "Lua 5.4" then -- candran.can:374 -return "no candran file in package.path" -- candran.can:375 -else -- candran.can:375 +") do -- candran.can:291 +i = i + 1 -- candran.can:292 +if i == line then -- candran.can:293 +local extSource, lineMap = l:match(".*%-%- (.-)%:(%d+)$") -- candran.can:294 +if lineMap then -- candran.can:295 +if extSource ~= source then -- candran.can:296 +return indentation .. extSource .. ":" .. lineMap .. "(" .. extSource .. ":" .. line .. "):" -- candran.can:297 +else -- candran.can:297 +return indentation .. extSource .. ":" .. lineMap .. "(" .. line .. "):" -- candran.can:299 +end -- candran.can:299 +end -- candran.can:299 +break -- candran.can:302 +end -- candran.can:302 +end -- candran.can:302 +end -- candran.can:302 +end) -- candran.can:302 +end -- candran.can:302 +candran["searcher"] = function(modpath) -- candran.can:310 +local filepath = util["search"](modpath, { "can" }) -- candran.can:311 +if not filepath then -- candran.can:312 +if _VERSION == "Lua 5.4" then -- candran.can:313 +return "no candran file in package.path" -- candran.can:314 +else -- candran.can:314 return "\ -\9no candran file in package.path" -- candran.can:377 -end -- candran.can:377 -end -- candran.can:377 -return function(modpath) -- candran.can:380 -local r, s = candran["loadfile"](filepath) -- candran.can:381 -if r then -- candran.can:382 -return r(modpath, filepath) -- candran.can:383 -else -- candran.can:383 + no candran file in package.path" -- candran.can:316 +end -- candran.can:316 +end -- candran.can:316 +return function(modpath) -- candran.can:319 +local r, s = candran["loadfile"](filepath) -- candran.can:320 +if r then -- candran.can:321 +return r(modpath, filepath) -- candran.can:322 +else -- candran.can:322 error(("error loading candran module '%s' from file '%s':\ -\9%s"):format(modpath, filepath, tostring(s)), 0) -- candran.can:385 -end -- candran.can:385 -end, filepath -- candran.can:387 -end -- candran.can:387 -candran["setup"] = function() -- candran.can:391 -local searchers = (function() -- candran.can:392 -if _VERSION == "Lua 5.1" then -- candran.can:392 -return package["loaders"] -- candran.can:393 -else -- candran.can:393 -return package["searchers"] -- candran.can:395 -end -- candran.can:395 -end)() -- candran.can:395 -for _, s in ipairs(searchers) do -- candran.can:398 -if s == candran["searcher"] then -- candran.can:399 -return candran -- candran.can:400 -end -- candran.can:400 -end -- candran.can:400 -table["insert"](searchers, 1, candran["searcher"]) -- candran.can:404 -return candran -- candran.can:405 -end -- candran.can:405 -return candran -- candran.can:408 + %s"):format(modpath, filepath, s), 0) -- candran.can:324 +end -- candran.can:324 +end, filepath -- candran.can:326 +end -- candran.can:326 +candran["setup"] = function() -- candran.can:330 +local searchers = (function() -- candran.can:331 +if _VERSION == "Lua 5.1" then -- candran.can:331 +return package["loaders"] -- candran.can:332 +else -- candran.can:332 +return package["searchers"] -- candran.can:334 +end -- candran.can:334 +end)() -- candran.can:334 +for _, s in ipairs(searchers) do -- candran.can:337 +if s == candran["searcher"] then -- candran.can:338 +return candran -- candran.can:339 +end -- candran.can:339 +end -- candran.can:339 +table["insert"](searchers, 1, candran["searcher"]) -- candran.can:343 +return candran -- candran.can:344 +end -- candran.can:344 +return candran -- candran.can:347 diff --git a/candran/can-parser/parser.lua b/candran/can-parser/parser.lua index 5b44859..6efe5c7 100644 --- a/candran/can-parser/parser.lua +++ b/candran/can-parser/parser.lua @@ -306,11 +306,6 @@ local function fixShortFunc (t) return t end -local function markImplicit (t) - t.implicit = true - return t -end - local function statToExpr (t) -- tag a StatExpr t.tag = t.tag .. "Expr" return t @@ -582,7 +577,7 @@ local G = { V"Lua", RetStat = tagC("Return", kw("return") * commaSep(V"Expr", "RetList")^-1); PushStat = tagC("Push", kw("push") * commaSep(V"Expr", "RetList")^-1); - ImplicitPushStat = tagC("Push", commaSep(V"Expr", "RetList")) / markImplicit; + ImplicitPushStat = tagC("Push", commaSep(V"Expr", "RetList")); NameList = tagC("NameList", commaSep(V"Id")); DestructuringNameList = tagC("NameList", commaSep(V"DestructuringId")), @@ -762,20 +757,6 @@ local G = { V"Lua", BinOp = V"OrOp" + V"AndOp" + V"BOrOp" + V"BXorOp" + V"BAndOp" + V"ShiftOp" + V"ConcatOp" + V"AddOp" + V"MulOp" + V"PowOp"; } --- used to parse macro indentifier in define() preprocessor function -local macroidentifier = { - expect(V"MacroIdentifier", "InvalidStat") * expect(P(-1), "Extra"), - - MacroIdentifier = tagC("MacroFunction", V"Id" * sym("(") * V"MacroFunctionArgs" * expect(sym(")"), "CParenPList")) - + V"Id"; - - MacroFunctionArgs = V"NameList" * (sym(",") * expect(tagC("Dots", sym("...")), "ParList"))^-1 / addDots - + Ct(tagC("Dots", sym("..."))) - + Ct(Cc()); - -} -for k,v in pairs(G) do if macroidentifier[k] == nil then macroidentifier[k] = v end end -- copy other rules from main syntax - local parser = {} local validator = require("candran.can-parser.validator") @@ -793,15 +774,4 @@ function parser.parse (subject, filename) return validate(ast, errorinfo) end -function parser.parsemacroidentifier (subject, filename) - local errorinfo = { subject = subject, filename = filename } - lpeg.setmaxstack(1000) - local ast, label, errpos = lpeg.match(macroidentifier, subject, nil, errorinfo) - if not ast then - local errmsg = labels[label][2] - return ast, syntaxerror(errorinfo, errpos, errmsg) - end - return ast -end - return parser diff --git a/candran/cmdline.lua b/candran/cmdline.lua new file mode 100644 index 0000000..c27e0f9 --- /dev/null +++ b/candran/cmdline.lua @@ -0,0 +1,126 @@ +-- started: 2008-04-12 by Shmuel Zeigerman +-- license: public domain + +local ipairs,pairs,setfenv,tonumber,loadstring,type = + ipairs,pairs,setfenv,tonumber,loadstring,type +local tinsert, tconcat = table.insert, table.concat + +local function commonerror (msg) + return nil, ("[cmdline]: " .. msg) +end + +local function argerror (msg, numarg) + msg = msg and (": " .. msg) or "" + return nil, ("[cmdline]: bad argument #" .. numarg .. msg) +end + +local function iderror (numarg) + return argerror("ID not valid", numarg) +end + +local function idcheck (id) + return id:match("^[%a_][%w_]*$") and true +end + +--[[------------------------------------------------------------------------ +Syntax: + t_out = getparam(t_in [,options] [,params]) + +Parameters: + t_in: table - list of string arguments to be processed in order + (usually it is the `arg' table created by the Lua interpreter). + + * if an argument begins with $, the $ is skipped and the rest is inserted + into the array part of the output table. + + * if an argument begins with -, the rest is a sequence of variables + (separated by commas or semicolons) that are all set to true; + example: -var1,var2 --> var1,var2 = true,true + + * if an argument begins with !, the rest is a Lua chunk; + example: !a=(40+3)*5;b=20;name="John";window={w=600,h=480} + + * if an argument contains =, then it is an assignment in the form + var1,...=value (no space is allowed around the =) + * if value begins with $, the $ is skipped, the rest is a string + example: var1,var2=$ --> var1,var2 = "","" + example: var1,var2=$125 --> var1,var2 = "125","125" + example: var1,var2=$$125 --> var1,var2 = "$125","$125" + * if value is convertible to number, it is a number + example: var1,var2=125 --> var1,var2 = 125,125 + * if value is true of false, it is a boolean + example: var1=false --> var1 = false + * otherwise it is a string + example: name=John --> name = "John" + + * if an argument neither begins with one of the special characters (-,!,$), + nor contains =, it is inserted as is into the array part of the output + table. + + options (optional): a list of names of all command-line options and parameters + permitted in the application; used to check that each found option + is valid; no checks are done if not supplied. + + params (optional): a list of names of all command-line parameters required + by the application; used to check that each required parameter is present; + no checks are done if not supplied. + +Returns: + On success: the output table, e.g. { [1]="./myfile.txt", name="John", age=40 } + On error: nil followed by error message string. + +--]]------------------------------------------------------------------------ +return function(t_in, options, params) + local t_out = {} + for i,v in ipairs(t_in) do + local prefix, command = v:sub(1,1), v:sub(2) + if prefix == "$" then + tinsert(t_out, command) + elseif prefix == "-" then + for id in command:gmatch"[^,;]+" do + if not idcheck(id) then return iderror(i) end + t_out[id] = true + end + elseif prefix == "!" then + local f, err = loadstring(command) + if not f then return argerror(err, i) end + setfenv(f, t_out)() + elseif v:find("=") then + local ids, val = v:match("^([^=]+)%=(.*)") -- no space around = + if not ids then return argerror("invalid assignment syntax", i) end + if val == "false" then + val = false + elseif val == "true" then + val = true + else + val = val:sub(1,1)=="$" and val:sub(2) or tonumber(val) or val + end + for id in ids:gmatch"[^,;]+" do + if not idcheck(id) then return iderror(i) end + t_out[id] = val + end + else + tinsert(t_out, v) + end + end + if options then + local lookup, unknown = {}, {} + for _,v in ipairs(options) do lookup[v] = true end + for k,_ in pairs(t_out) do + if lookup[k]==nil and type(k)=="string" then tinsert(unknown, k) end + end + if #unknown > 0 then + return commonerror("unknown options: " .. tconcat(unknown, ", ")) + end + end + if params then + local missing = {} + for _,v in ipairs(params) do + if t_out[v]==nil then tinsert(missing, v) end + end + if #missing > 0 then + return commonerror("missing parameters: " .. tconcat(missing, ", ")) + end + end + return t_out +end diff --git a/candran/serpent.lua b/candran/serpent.lua deleted file mode 100644 index 067bb29..0000000 --- a/candran/serpent.lua +++ /dev/null @@ -1,163 +0,0 @@ ---[[ -Serpent source is released under the MIT License - -Copyright (c) 2012-2018 Paul Kulchenko (paul@kulchenko.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]] -local n, v = "serpent", "0.302" -- (C) 2012-18 Paul Kulchenko; MIT License -local c, d = "Paul Kulchenko", "Lua serializer and pretty printer" -local snum = {[tostring(1/0)]='1/0 --[[math.huge]]',[tostring(-1/0)]='-1/0 --[[-math.huge]]',[tostring(0/0)]='0/0'} -local badtype = {thread = true, userdata = true, cdata = true} -local getmetatable = debug and debug.getmetatable or getmetatable -local pairs = function(t) return next, t end -- avoid using __pairs in Lua 5.2+ -local keyword, globals, G = {}, {}, (_G or _ENV) -for _,k in ipairs({'and', 'break', 'do', 'else', 'elseif', 'end', 'false', - 'for', 'function', 'goto', 'if', 'in', 'local', 'nil', 'not', 'or', 'repeat', - 'return', 'then', 'true', 'until', 'while'}) do keyword[k] = true end -for k,v in pairs(G) do globals[v] = k end -- build func to name mapping -for _,g in ipairs({'coroutine', 'debug', 'io', 'math', 'string', 'table', 'os'}) do - for k,v in pairs(type(G[g]) == 'table' and G[g] or {}) do globals[v] = g..'.'..k end end - -local function s(t, opts) - local name, indent, fatal, maxnum = opts.name, opts.indent, opts.fatal, opts.maxnum - local sparse, custom, huge = opts.sparse, opts.custom, not opts.nohuge - local space, maxl = (opts.compact and '' or ' '), (opts.maxlevel or math.huge) - local maxlen, metatostring = tonumber(opts.maxlength), opts.metatostring - local iname, comm = '_'..(name or ''), opts.comment and (tonumber(opts.comment) or math.huge) - local numformat = opts.numformat or "%.17g" - local seen, sref, syms, symn = {}, {'local '..iname..'={}'}, {}, 0 - local function gensym(val) return '_'..(tostring(tostring(val)):gsub("[^%w]",""):gsub("(%d%w+)", - -- tostring(val) is needed because __tostring may return a non-string value - function(s) if not syms[s] then symn = symn+1; syms[s] = symn end return tostring(syms[s]) end)) end - local function safestr(s) return type(s) == "number" and tostring(huge and snum[tostring(s)] or numformat:format(s)) - or type(s) ~= "string" and tostring(s) -- escape NEWLINE/010 and EOF/026 - or ("%q"):format(s):gsub("\010","n"):gsub("\026","\\026") end - local function comment(s,l) return comm and (l or 0) < comm and ' --[['..select(2, pcall(tostring, s))..']]' or '' end - local function globerr(s,l) return globals[s] and globals[s]..comment(s,l) or not fatal - and safestr(select(2, pcall(tostring, s))) or error("Can't serialize "..tostring(s)) end - local function safename(path, name) -- generates foo.bar, foo[3], or foo['b a r'] - local n = name == nil and '' or name - local plain = type(n) == "string" and n:match("^[%l%u_][%w_]*$") and not keyword[n] - local safe = plain and n or '['..safestr(n)..']' - return (path or '')..(plain and path and '.' or '')..safe, safe end - local alphanumsort = type(opts.sortkeys) == 'function' and opts.sortkeys or function(k, o, n) -- k=keys, o=originaltable, n=padding - local maxn, to = tonumber(n) or 12, {number = 'a', string = 'b'} - local function padnum(d) return ("%0"..tostring(maxn).."d"):format(tonumber(d)) end - table.sort(k, function(a,b) - -- sort numeric keys first: k[key] is not nil for numerical keys - return (k[a] ~= nil and 0 or to[type(a)] or 'z')..(tostring(a):gsub("%d+",padnum)) - < (k[b] ~= nil and 0 or to[type(b)] or 'z')..(tostring(b):gsub("%d+",padnum)) end) end - local function val2str(t, name, indent, insref, path, plainindex, level) - local ttype, level, mt = type(t), (level or 0), getmetatable(t) - local spath, sname = safename(path, name) - local tag = plainindex and - ((type(name) == "number") and '' or name..space..'='..space) or - (name ~= nil and sname..space..'='..space or '') - if seen[t] then -- already seen this element - sref[#sref+1] = spath..space..'='..space..seen[t] - return tag..'nil'..comment('ref', level) end - -- protect from those cases where __tostring may fail - if type(mt) == 'table' and metatostring ~= false then - local to, tr = pcall(function() return mt.__tostring(t) end) - local so, sr = pcall(function() return mt.__serialize(t) end) - if (to or so) then -- knows how to serialize itself - seen[t] = insref or spath - t = so and sr or tr - ttype = type(t) - end -- new value falls through to be serialized - end - if ttype == "table" then - if level >= maxl then return tag..'{}'..comment('maxlvl', level) end - seen[t] = insref or spath - if next(t) == nil then return tag..'{}'..comment(t, level) end -- table empty - if maxlen and maxlen < 0 then return tag..'{}'..comment('maxlen', level) end - local maxn, o, out = math.min(#t, maxnum or #t), {}, {} - for key = 1, maxn do o[key] = key end - if not maxnum or #o < maxnum then - local n = #o -- n = n + 1; o[n] is much faster than o[#o+1] on large tables - for key in pairs(t) do if o[key] ~= key then n = n + 1; o[n] = key end end end - if maxnum and #o > maxnum then o[maxnum+1] = nil end - if opts.sortkeys and #o > maxn then alphanumsort(o, t, opts.sortkeys) end - local sparse = sparse and #o > maxn -- disable sparsness if only numeric keys (shorter output) - for n, key in ipairs(o) do - local value, ktype, plainindex = t[key], type(key), n <= maxn and not sparse - if opts.valignore and opts.valignore[value] -- skip ignored values; do nothing - or opts.keyallow and not opts.keyallow[key] - or opts.keyignore and opts.keyignore[key] - or opts.valtypeignore and opts.valtypeignore[type(value)] -- skipping ignored value types - or sparse and value == nil then -- skipping nils; do nothing - elseif ktype == 'table' or ktype == 'function' or badtype[ktype] then - if not seen[key] and not globals[key] then - sref[#sref+1] = 'placeholder' - local sname = safename(iname, gensym(key)) -- iname is table for local variables - sref[#sref] = val2str(key,sname,indent,sname,iname,true) end - sref[#sref+1] = 'placeholder' - local path = seen[t]..'['..tostring(seen[key] or globals[key] or gensym(key))..']' - sref[#sref] = path..space..'='..space..tostring(seen[value] or val2str(value,nil,indent,path)) - else - out[#out+1] = val2str(value,key,indent,nil,seen[t],plainindex,level+1) - if maxlen then - maxlen = maxlen - #out[#out] - if maxlen < 0 then break end - end - end - end - local prefix = string.rep(indent or '', level) - local head = indent and '{\n'..prefix..indent or '{' - local body = table.concat(out, ','..(indent and '\n'..prefix..indent or space)) - local tail = indent and "\n"..prefix..'}' or '}' - return (custom and custom(tag,head,body,tail,level) or tag..head..body..tail)..comment(t, level) - elseif badtype[ttype] then - seen[t] = insref or spath - return tag..globerr(t, level) - elseif ttype == 'function' then - seen[t] = insref or spath - if opts.nocode then return tag.."function() --[[..skipped..]] end"..comment(t, level) end - local ok, res = pcall(string.dump, t) - local func = ok and "((loadstring or load)("..safestr(res)..",'@serialized'))"..comment(t, level) - return tag..(func or globerr(t, level)) - else return tag..safestr(t) end -- handle all other types - end - local sepr = indent and "\n" or ";"..space - local body = val2str(t, name, indent) -- this call also populates sref - local tail = #sref>1 and table.concat(sref, sepr)..sepr or '' - local warn = opts.comment and #sref>1 and space.."--[[incomplete output with shared/self-references skipped]]" or '' - return not name and body..warn or "do local "..body..sepr..tail.."return "..name..sepr.."end" -end - -local function deserialize(data, opts) - local env = (opts and opts.safe == false) and G - or setmetatable({}, { - __index = function(t,k) return t end, - __call = function(t,...) error("cannot call functions") end - }) - local f, res = (loadstring or load)('return '..data, nil, nil, env) - if not f then f, res = (loadstring or load)(data, nil, nil, env) end - if not f then return f, res end - if setfenv then setfenv(f, env) end - return pcall(f) -end - -local function merge(a, b) if b then for k,v in pairs(b) do a[k] = v end end; return a; end -return { _NAME = n, _COPYRIGHT = c, _DESCRIPTION = d, _VERSION = v, serialize = s, - load = deserialize, - dump = function(a, opts) return s(a, merge({name = '_', compact = true, sparse = true}, opts)) end, - line = function(a, opts) return s(a, merge({sortkeys = true, comment = true}, opts)) end, - block = function(a, opts) return s(a, merge({indent = ' ', sortkeys = true, comment = true}, opts)) end } diff --git a/candran/util.can b/candran/util.can index f666935..2beb260 100644 --- a/candran/util.can +++ b/candran/util.can @@ -1,4 +1,3 @@ -local candran = require("candran") local util = {} function util.search(modpath, exts={}) @@ -28,20 +27,6 @@ function util.load(str, name, env) end end -function util.recmerge(...) - local r = {} - for _, t in ipairs({...}) do - for k, v in pairs(t) do - if type(v) == "table" then - r[k] = util.merge(v, r[k]) - else - r[k] = v - end - end - end - return r -end - function util.merge(...) local r = {} for _, t in ipairs({...}) do @@ -52,74 +37,4 @@ function util.merge(...) return r end -util.cli = { - -- add option to set Candran options to an argparse parser - addCandranOptions = function(parser) - parser:group("Compiler options", - parser:option("-t --target") - :description "Target Lua version: lua54, lua53, lua52, luajit or lua51" - :default(candran.default.target), - - parser:option("--indentation") - :description "Character(s) used for indentation in the compiled file" - :default(candran.default.indentation), - - parser:option("--newline") - :description "Character(s) used for newlines in the compiled file" - :default(candran.default.newline), - - parser:option("--variable-prefix") - :description "Prefix used when Candran needs to set a local variable to provide some functionality" - :default(candran.default.variablePrefix), - - parser:flag("--no-map-lines") - :description "Do not add comments at the end of each line indicating the associated source line and file (error rewriting will not work)" - ) - - parser:group("Preprocessor options", - parser:flag("--no-builtin-macros") - :description "Disable built-in macros", - - parser:option("-D --define") - :description "Define a preprocessor constant" - :args("1-2") - :argname{"name", "value"} - :count("*"), - - parser:option("-I --import") - :description "Statically import a module into the compiled file" - :argname("module") - :count("*") - ) - - parser:option("--chunkname") - :description "Chunkname used when running the code" - - parser:flag("--no-rewrite-errors") - :description "Disable error rewriting when running the code" - end, - - -- convert parsed arguments to a Candran options table - makeCandranOptions = function(args) - local preprocessorEnv = {} - for _, o in ipairs(args.define) do - preprocessorEnv[o[1]] = tonumber(o[2]) or o[2] or true - end - - local options = { - target = args.target, - indentation = args.indentation, - newline = args.newline, - variablePrefix = args.variable_prefix, - mapLines = not args.no_map_lines, - chunkname = args.chunkname, - rewriteErrors = not args.no_rewrite_errors, - builtInMacros = not args.no_builtin_macros, - preprocessorEnv = preprocessorEnv, - import = args.import - } - return options - end -} - return util diff --git a/compiler/lua51.can b/compiler/lua51.can index 61b07a5..9443454 100644 --- a/compiler/lua51.can +++ b/compiler/lua51.can @@ -33,6 +33,6 @@ end #local patch = output #output = "" -#import("compiler.luajit", { preprocessorEnv = { patch = patch }, loadPackage = false }) +#import("compiler.luajit", { patch = patch, loadPackage = false }) return luajit diff --git a/compiler/lua52.can b/compiler/lua52.can index d42c3a8..7f94efc 100644 --- a/compiler/lua52.can +++ b/compiler/lua52.can @@ -30,6 +30,6 @@ end #local patch = output #output = "" -#import("compiler.lua53", { preprocessorEnv = { patch = patch }, loadPackage = false }) +#import("compiler.lua53", { patch = patch, loadPackage = false }) return lua53 diff --git a/compiler/lua53.can b/compiler/lua53.can index ab354f7..582fa69 100644 --- a/compiler/lua53.can +++ b/compiler/lua53.can @@ -13,6 +13,6 @@ end #local patch = output #output = "" -#import("compiler.lua54", { preprocessorEnv = { patch = patch }, loadPackage = false }) +#import("compiler.lua54", { patch = patch, loadPackage = false }) return lua54 diff --git a/compiler/lua54.can b/compiler/lua54.can index 49bf3a1..6ce91a8 100644 --- a/compiler/lua54.can +++ b/compiler/lua54.can @@ -1,10 +1,6 @@ -local util = require("candran.util") - local targetName = "Lua 5.4" -local unpack = unpack or table.unpack - -return function(code, ast, options, macros={functions={}, variables={}}) +return function(code, ast, options) --- Line mapping local lastInputPos = 1 -- last token position in the input code local prevLinePos = 1 -- last token position in the previous line of code in the input code @@ -51,8 +47,7 @@ return function(code, ast, options, macros={functions={}, variables={}}) local states = { push = {}, -- push stack variable names destructuring = {}, -- list of variable that need to be assigned from a destructure {id = "parent variable", "field1", "field2"...} - scope = {}, -- list of variables defined in the current scope - macroargs = {} -- currently defined arguemnts from a macro function + scope = {} -- list of variables defined in the current scope } -- Push a new value on top of the stack "name". Returns an empty string for chaining. local function push(name, state) @@ -88,9 +83,6 @@ return function(code, ast, options, macros={functions={}, variables={}}) return var end - -- indicate if currently processing a macro, so it cannot be applied recursively - local nomacro = { variables = {}, functions = {} } - --- Module management local required = {} -- { ["full require expression"] = true, ... } local requireStr = "" @@ -544,15 +536,7 @@ return function(code, ast, options, macros={functions={}, variables={}}) end, -- Dots Dots = () - local macroargs = peek("macroargs") - if macroargs and not nomacro.variables["..."] and macroargs["..."] then - nomacro.variables["..."] = true - local r = lua(macroargs["..."], "_lhs") - nomacro.variables["..."] = nil - return r - else - return "..." - end + return "..." end, -- Boolean{ } Boolean = (t) @@ -739,37 +723,6 @@ return function(code, ast, options, macros={functions={}, variables={}}) Call = (t) if t[1].tag == "String" or t[1].tag == "Table" then return "("..lua(t[1])..")("..lua(t, "_lhs", 2)..")" - elseif t[1].tag == "Id" and not nomacro.functions[t[1][1]] and macros.functions[t[1][1]] then - local macro = macros.functions[t[1][1]] - local replacement = macro.replacement - local r - nomacro.functions[t[1][1]] = true - if type(replacement) == "function" then - local args = {} - for i=2, #t do - table.insert(args, lua(t[i])) - end - r = replacement(unpack(args)) - else - local macroargs = util.merge(peek("macroargs")) - for i, arg in ipairs(macro.args) do - if arg.tag == "Dots" then - macroargs["..."] = [for j=i+1, #t do t[j] end] - elseif arg.tag == "Id" then - if t[i+1] == nil then - error("bad argument #%s to macro %s (value expected)":format(i, t[1][1])) - end - macroargs[arg[1]] = t[i+1] - else - error("unexpected argument type %s in macro %s":format(arg.tag, t[1][1])) - end - end - push("macroargs", macroargs) - r = lua(replacement) - pop("macroargs") - end - nomacro.functions[t[1][1]] = nil - return r elseif t[1].tag == "MethodStub" then -- method call if t[1][1].tag == "String" or t[1][1].tag == "Table" then return "("..lua(t[1][1]).."):"..lua(t[1][2], "Id").."("..lua(t, "_lhs", 2)..")" @@ -804,23 +757,7 @@ return function(code, ast, options, macros={functions={}, variables={}}) end, -- Id{ } Id = (t) - local r = t[1] - local macroargs = peek("macroargs") - if not nomacro.variables[t[1]] then - nomacro.variables[t[1]] = true - if macroargs and macroargs[t[1]] then -- replace with macro argument - r = lua(macroargs[t[1]]) - elseif macros.variables[t[1]] ~= nil then -- replace with macro variable - local macro = macros.variables[t[1]] - if type(macro) == "function" then - r = macro() - else - r = lua(macro) - end - end - nomacro.variables[t[1]] = nil - end - return r + return t[1] end, -- AttributeId{ ? } AttributeId = (t) diff --git a/compiler/luajit.can b/compiler/luajit.can index 83def13..511f642 100644 --- a/compiler/luajit.can +++ b/compiler/luajit.can @@ -33,6 +33,6 @@ end #local patch = output #output = "" -#import("compiler.lua52", { preprocessorEnv = { patch = patch }, loadPackage = false }) +#import("compiler.lua52", { patch = patch, loadPackage = false }) return lua52 diff --git a/rockspec/candran-1.0.0-1.rockspec b/rockspec/candran-0.14.0-1.rockspec similarity index 92% rename from rockspec/candran-1.0.0-1.rockspec rename to rockspec/candran-0.14.0-1.rockspec index d291e73..dc82cd2 100644 --- a/rockspec/candran-1.0.0-1.rockspec +++ b/rockspec/candran-0.14.0-1.rockspec @@ -2,7 +2,7 @@ rockspec_format = "3.0" package = "candran" -version = "1.0.0-1" +version = "0.14.0-1" description = { summary = "A simple Lua dialect and preprocessor.", @@ -19,15 +19,14 @@ description = { source = { url = "git://github.com/Reuh/candran", - tag = "v1.0.0" + tag = "v0.14.0" } dependencies = { "lua >= 5.1", "lpeglabel >= 1.5.0", "linenoise >= 0.9", - "luacheck >= 0.23.0", - "argparse >= 0.7.0" + "luacheck >= 0.23.0" } build = { diff --git a/rockspec/candran-scm-1.rockspec b/rockspec/candran-scm-1.rockspec index 27d40b5..c6573dd 100644 --- a/rockspec/candran-scm-1.rockspec +++ b/rockspec/candran-scm-1.rockspec @@ -25,8 +25,7 @@ dependencies = { "lua >= 5.1", "lpeglabel >= 1.5.0", "linenoise >= 0.9", - "luacheck >= 0.23.0", - "argparse >= 0.7.0" + "luacheck >= 0.23.0" } build = { diff --git a/test/test.lua b/test/test.lua index e01a4cf..76bbcb9 100644 --- a/test/test.lua +++ b/test/test.lua @@ -127,7 +127,7 @@ return a test("preprocessor placeholder function", [[ #placeholder('foo') -]], 5, { preprocessorEnv = { foo = "return 5" } }) +]], 5, { foo = "return 5" }) test("preprocessor options", [[ #if not foo == "sky" then @@ -151,65 +151,6 @@ return a #error("preprocessor should ignore long strings") ]]) -test("preprocessor macro remove function", [[ -#define("log(...)", "") -log("test") -return true -]], true) - -test("preprocessor macro replace function", [[ -#define("log(x)", "a = x") -log("test") -return a -]], "test") - -test("preprocessor macro identifier replace function", [[ -#define("test(x)", "x = 42") -test(hello) -return hello -]], 42) - -test("preprocessor macro replace function with vararg", [[ -#define("log(...)", "a, b, c = ...") -log(1, 2, 3) -assert(a == 1) -assert(b == 2) -assert(c == 3) -return true -]], true) - -test("preprocessor macro replace function with vararg and arg", [[ -#define("log(x, ...)", "a, b, c = x, ...") -log(1, 2, 3) -assert(a == 1) -assert(b == 2) -assert(c == 3) -return true -]], true) - -test("preprocessor macro replace variable", [[ -#define("a", "42") -return a -]], 42) - -test("preprocessor macro prevent recursive macro", [[ -#define("f(x)", "x") -local x = 42 -x = f(x) -return x -]], 42) - -test("preprocessor macro replace variable with function", [[ -#define("a", function() return "42" end) -return a -]], 42) - -test("preprocessor macro replace function with function", [[ -#define("test(x)", function(x) return ("%s = 42"):format(x) end) -test(hello) -return hello -]], 42) - ---------------------- -- SYNTAX ADDITIONS -- ----------------------