diff --git a/LICENSE b/LICENSE index 4b0a3df..e117f05 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2017-2021 Étienne "Reuh" Fildadut +Copyright (c) 2017-2019 Étienne "Reuh" Fildadut 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: diff --git a/README.md b/README.md index 76bd1bd..47b6e95 100644 --- a/README.md +++ b/README.md @@ -6,26 +6,19 @@ 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 end let a = { - hey = 5 // 2, -- Lua 5.3+ syntax, that will be translated to work with the current Lua version + hey = true, child = nil, @@ -81,23 +74,20 @@ end Candran is released under the MIT License (see ```LICENSE``` for details). #### Quick setup -Install Candran automatically using LuaRocks: ```sudo luarocks install candran```. +Install Candran automatically using LuaRocks: ```sudo luarocks install rockspec/candran-0.12.0-1.rockspec```. -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. You can register the Candran package searcher in your main Lua file (`require("candran").setup()`) and any subsequent `require` call in your project will automatically search for Candran modules. -If you use LÖVE, some integration with Candran is detailled [here](https://github.com/Reuh/candran/wiki/L%C3%96VE). - #### Editor support Most editors should be able to use their existing Lua support for Candran code. If you want full support for the additional syntax in your editor: * **Sublime Text 3**: * [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. @@ -105,7 +95,7 @@ For linting, if your editor support [luacheck](https://github.com/luarocks/luach The language ------------ ### Syntax additions -After the [preprocessor](#preprocessor) is run the Candran code is compiled to Lua. Candran code adds the folowing syntax to Lua 5.4 syntax: +After the preprocessor is run the Candran code is compiled to Lua. Candran code adds the folowing syntax to Lua: ##### Assignment operators * ````var += nb```` @@ -196,7 +186,7 @@ close b = {} const x, y, z = 1, 2, 3 -- every variable will be defined using ``` -Shortcut to Lua 5.4 variable attribute. Do not behave like `let`, as attributes require the variable to be constant and therefore can't be predeclared. Only compatibel with Lua 5.4 target. +Shortcut to Lua 5.4 variable attribute. Do not behave like `let`, as attributes require the variable to be constant and therefore can't be predeclared. ##### `continue` keyword ```lua @@ -449,54 +439,14 @@ 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: - * ```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). +* ````output````: the current preprocessor output string. Can be redefined at any time. +* ````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. +* ````...````: 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. @@ -518,7 +468,7 @@ Candran will try to translate Lua 5.4 syntax into something usable with the curr Usage ----- ### Command-line usage -The library can be used standalone through the ```canc``` (for compiling Candran files) and ```can``` (for running Candran files directly) utilities: +The library can be used standalone through the ```canc``` and ```can``` utility: * ````canc```` @@ -528,41 +478,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,21 +502,21 @@ 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. * ```can``` - Start a simplisitic Candran REPL. Will automatically call `candran.setup()`. + Start a simplisitic Candran REPL. If you want a better REPL (autocompletion, history, ability to move the cursor), install lua-linenoise: ```luarocks install linenoise``` (automatically installed if Candran was installed using LuaRocks). @@ -592,15 +524,13 @@ The library can be used standalone through the ```canc``` (for compiling Candran Preprocess, compile and run _filename_ using the options provided. - This will automatically register the Candran package searcher using `candran.setup()`, so required Candran modules will be compiled as they are needed. + This will automatically register the Candran package searcher, so required Candran modules will be compiled as they are needed. This command will use error rewriting unless explicitely enabled (by setting the `rewriteErrors=false` option). 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 +547,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 +563,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 @@ -659,13 +589,9 @@ If you are using the preprocessor ```import()``` function, the source Candran fi example.can:12(final.lua:5): attempt to call a nil value (global 'iWantAnError') ``` -Please note that Candran can only wrap code directly called from Candran; if an error is raised from Lua, there will be no rewriting of Candran lines the stacktrace. These lines are indicated using `(compiled candran)` before the line number. +You can perform error rewriting manually using: -If you want Candran to always wrap errors, you will need to wrap your whole code in a `xpcall`: `xpcall(func, candran.messageHandler)`. - -* ```candran.messageHandler(message[, noTraceback])```: the error message handler used by Candran. Given `message` the Lua error string, returns full Candran traceback where soure files and lines are rewritten to their Candran source. You can use it as is in xpcall as a message handler. If `noTraceback` is `true`, Candran will only rewrite `message` and not add a new traceback. - -Also note that the Candran message handler will add a new, rewritten, stacktrace to the error message; it can't replace the default Lua one. You will therefore see two stacktraces when raising an error, the last one being the Lua one and can be ignored. +* ```candran.messageHandler(message)```: the error message handler used by Candran. Given `message` the Lua error string, returns full Candran traceback where soure files and lines are rewritten to their Candran source. You can use it as is in xpcall as a message handler. ##### Package searching helpers Candran comes with a custom package searcher which will automatically find, preprocesses and compile ```.can``` files. @@ -679,22 +605,19 @@ require("candran").setup() at the top of your main Lua file. If a Candran file is found when you call ```require()```, it will be automatically compiled and loaded. If both a Lua and Candran file match a module name, the Candran file will be loaded. * ```candran.searcher(modpath)```: Candran package searcher function. Use the existing package.path. -* ```candran.setup()```: register the Candran package searcher (if not already done), and return the `candran` table. +* ```candran.setup()```: register the Candran package searcher, and return the `candran` table. ##### Available compiler & preprocessor options 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..a960e00 100644 --- a/bin/can +++ b/bin/can @@ -1,57 +1,44 @@ #!/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 candran = require("candran") +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) end - local r, e = xpcall(f, candran.messageHandler) - if not r then - io.stderr:write(e.."\n") - os.exit(1) - end + f() -- 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) else - local r, e = xpcall(f, candran.messageHandler) - if not r then - io.stderr:write(e.."\n") - os.exit(1) - end + f() 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 +105,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 +144,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..995a01d 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,10 @@ package.loaded["candran"] = candran local unpack = unpack or table.unpack +local candran = { + VERSION = "0.13.0" +} + --- Default options. candran.default = { target = "lua54", @@ -27,10 +26,7 @@ candran.default = { variablePrefix = "__CAN_", mapLines = true, chunkname = "nil", - rewriteErrors = true, - builtInMacros = true, - preprocessorEnv = {}, - import = {} + rewriteErrors = true } -- Autodetect version @@ -50,20 +46,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 +84,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 +103,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 +139,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 +157,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 +175,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 +187,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 +202,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() @@ -282,8 +221,7 @@ function candran.load(chunk, chunkname, env, options={}) end codeCache[options.chunkname] = code - local f - f, err = util.load(code, "=%s(%s)":format(options.chunkname, "compiled candran"), env) + local f, err = util.load(code, options.chunkname, env) -- Um. Candran isn't supposed to generate invalid Lua code, so this is a major issue. -- This is not going to raise an error because this is supposed to behave similarly to Lua's load function. @@ -296,9 +234,10 @@ function candran.load(chunk, chunkname, env, options={}) return f else return function(...) + local params = {...} if not errorRewritingActive then errorRewritingActive = true - local t = { xpcall(f, candran.messageHandler, ...) } + local t = { xpcall(() return f(unpack(params)) end, candran.messageHandler) } errorRewritingActive = false if t[1] == false then error(t[2], 0) @@ -325,23 +264,20 @@ 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 - return message:gsub("(\n?%s*)([^\n]-)%:(%d+)%:", function(indentation, source, line) +function candran.messageHandler(message) + return debug.traceback(message, 2):gsub("(\n?%s*)([^\n]-)%:(%d+)%:", function(indentation, source, line) line = tonumber(line) local originalFile - local strName = source:match("^(.-)%(compiled candran%)$") + local strName = source:match("%[string \"(.-)\"%]") if strName then if codeCache[strName] then originalFile = codeCache[strName] source = strName end else - if fi = io.open(source, "r") then + local fi = io.open(source, "r") + if fi then originalFile = fi:read("*a") fi:close() end @@ -377,31 +313,21 @@ function candran.searcher(modpath) return "\n\tno candran file in package.path" end end - return (modpath) -- 2nd argument is not passed in Lua 5.1, so a closure is required - local r, s = candran.loadfile(filepath) - 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) - end - end, filepath + local r, s = candran.loadfile(filepath) + if r then + return r + else + return s + end end --- Register the Candran package searcher. function candran.setup() - local searchers = if _VERSION == "Lua 5.1" then - package.loaders + if _VERSION == "Lua 5.1" then + table.insert(package.loaders, 2, candran.searcher) else - package.searchers + table.insert(package.searchers, 2, candran.searcher) end - -- check if already setup - for _, s in ipairs(searchers) do - if s == candran.searcher then - return candran - end - end - -- setup - table.insert(searchers, 1, candran.searcher) return candran end diff --git a/candran.lua b/candran.lua index f3945ad..fa5cca6 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,699 +6060,597 @@ 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 +"))) ^ 0) * expect(P("'"), "Quote"), -- ./candran/can-parser/parser.lua:693 ["EscSeq"] = P("\\") / "" * (P("a") / "\7" + P("b") / "\8" + P("f") / "\12" + P("n") / "\ " + P("r") / "\13" + P("t") / "\9" + P("v") / "\11" + 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("\\") / "\\" + 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 -candran["default"] = { -- candran.can:23 -["target"] = "lua54", -- candran.can:24 -["indentation"] = "", -- candran.can:25 +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.13.0" } -- candran.can:18 +candran["default"] = { -- candran.can:22 +["target"] = "lua54", -- candran.can:23 +["indentation"] = "", -- candran.can:24 ["newline"] = "\ -", -- candran.can:26 -["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 +", -- candran.can:25 +["variablePrefix"] = "__CAN_", -- candran.can:26 +["mapLines"] = true, -- candran.can:27 +["chunkname"] = "nil", -- candran.can:28 +["rewriteErrors"] = true -- candran.can:29 +} -- candran.can:29 +if _VERSION == "Lua 5.1" then -- candran.can:33 +if package["loaded"]["jit"] then -- candran.can:34 +candran["default"]["target"] = "luajit" -- candran.can:35 +else -- candran.can:35 +candran["default"]["target"] = "lua51" -- candran.can:37 +end -- candran.can:37 +elseif _VERSION == "Lua 5.2" then -- candran.can:39 +candran["default"]["target"] = "lua52" -- candran.can:40 +elseif _VERSION == "Lua 5.3" then -- candran.can:41 +candran["default"]["target"] = "lua53" -- candran.can:42 +end -- candran.can:42 +candran["preprocess"] = function(input, options) -- candran.can:51 +if options == nil then options = {} end -- candran.can:51 +options = util["merge"](candran["default"], options) -- candran.can:52 +local preprocessor = "" -- candran.can:55 +local i = 0 -- candran.can:56 +local inLongString = false -- candran.can:57 +local inComment = false -- candran.can:58 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:59 +i = i + (1) -- candran.can:60 +if inComment then -- candran.can:62 +inComment = not line:match("%]%]") -- candran.can:63 +elseif inLongString then -- candran.can:64 +inLongString = not line:match("%]%]") -- candran.can:65 +else -- candran.can:65 +if line:match("[^%-]%[%[") then -- candran.can:67 +inLongString = true -- candran.can:68 +elseif line:match("%-%-%[%[") then -- candran.can:69 +inComment = true -- candran.can:70 +end -- candran.can:70 +end -- candran.can:70 +if not inComment and not inLongString and line:match("^%s*#") and not line:match("^#!") then -- candran.can:73 +preprocessor = preprocessor .. (line:gsub("^%s*#", "")) -- candran.can:74 +else -- candran.can:74 +local l = line:sub(1, - 2) -- candran.can:76 +if not inLongString and options["mapLines"] and not l:match("%-%- (.-)%:(%d+)$") then -- candran.can:77 preprocessor = preprocessor .. (("write(%q)"):format(l .. " -- " .. options["chunkname"] .. ":" .. i) .. "\ -") -- candran.can:92 -else -- candran.can:92 +") -- candran.can:78 +else -- candran.can:78 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:80 +end -- candran.can:80 +end -- candran.can:80 +end -- candran.can:80 +preprocessor = preprocessor .. ("return output") -- candran.can:84 +local env = util["merge"](_G, options) -- candran.can:87 +env["candran"] = candran -- candran.can:89 +env["output"] = "" -- candran.can:91 +env["import"] = function(modpath, margs) -- candran.can:98 +if margs == nil then margs = {} end -- candran.can:98 +local filepath = assert(util["search"](modpath, { -- candran.can:99 +"can", -- candran.can:99 +"lua" -- candran.can:99 +}), "No module named \"" .. modpath .. "\"") -- candran.can:99 +local f = io["open"](filepath) -- candran.can:102 +if not f then -- candran.can:103 +error("can't open the module file to import") -- candran.can:103 +end -- candran.can:103 +margs = util["merge"](options, { -- candran.can:105 +["chunkname"] = filepath, -- candran.can:105 +["loadLocal"] = true, -- candran.can:105 +["loadPackage"] = true -- candran.can:105 +}, margs) -- candran.can:105 +local modcontent = assert(candran["preprocess"](f:read("*a"), margs)) -- candran.can:106 +f:close() -- candran.can:107 +local modname = modpath:match("[^%.]+$") -- candran.can:110 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 +"):format(modpath, margs["loadLocal"] and modname or "_()") or "") .. "-- END OF MODULE " .. modpath .. " --") -- candran.can:119 +end -- candran.can:119 +env["include"] = function(file) -- candran.can:124 +local f = io["open"](file) -- candran.can:125 +if not f then -- candran.can:126 +error("can't open the file " .. file .. " to include") -- candran.can:126 +end -- candran.can:126 +env["write"](f:read("*a")) -- candran.can:127 +f:close() -- candran.can:128 +end -- candran.can:128 +env["write"] = function(...) -- candran.can:132 env["output"] = env["output"] .. (table["concat"]({ ... }, "\9") .. "\ -") -- candran.can:151 +") -- candran.can:133 +end -- candran.can:133 +env["placeholder"] = function(name) -- candran.can:137 +if env[name] then -- candran.can:138 +env["write"](env[name]) -- candran.can:139 +end -- candran.can:139 +end -- candran.can:139 +local preprocess, err = candran["compile"](preprocessor, options) -- candran.can:144 +if not preprocess then -- candran.can:145 +return nil, "in preprocessor: " .. err -- candran.can:146 +end -- candran.can:146 +preprocess, err = util["load"](preprocessor, "candran preprocessor", env) -- candran.can:149 +if not preprocess then -- candran.can:150 +return nil, "in preprocessor: " .. err -- 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 +local success, output = pcall(preprocess) -- candran.can:155 +if not success then -- candran.can:156 +return nil, "in preprocessor: " .. output -- 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 +return output -- candran.can:160 +end -- candran.can:160 +candran["compile"] = function(input, options) -- candran.can:169 +if options == nil then options = {} end -- candran.can:169 +options = util["merge"](candran["default"], options) -- candran.can:170 +local ast, errmsg = parser["parse"](input, options["chunkname"]) -- candran.can:172 +if not ast then -- candran.can:174 +return nil, errmsg -- candran.can:175 +end -- candran.can:175 +return require("compiler." .. options["target"])(input, ast, options) -- 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 -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 -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 +candran["make"] = function(code, options) -- candran.can:187 +local r, err = candran["preprocess"](code, options) -- candran.can:188 +if r then -- candran.can:189 +r, err = candran["compile"](r, options) -- candran.can:190 +if r then -- candran.can:191 +return r -- candran.can:192 +end -- candran.can:192 +end -- candran.can:192 +return r, err -- candran.can:195 +end -- candran.can:195 +local errorRewritingActive = false -- candran.can:198 +local codeCache = {} -- candran.can:199 +candran["loadfile"] = function(filepath, env, options) -- candran.can:202 +local f, err = io["open"](filepath) -- candran.can:203 +if not f then -- candran.can:204 +return nil, ("cannot open %s"):format(err) -- candran.can:205 +end -- candran.can:205 +local content = f:read("*a") -- candran.can:207 +f:close() -- candran.can:208 +return candran["load"](content, filepath, env, options) -- candran.can:210 +end -- candran.can:210 +candran["load"] = function(chunk, chunkname, env, options) -- candran.can:215 +if options == nil then options = {} end -- candran.can:215 +options = util["merge"]({ ["chunkname"] = tostring(chunkname or chunk) }, options) -- candran.can:216 +local code, err = candran["make"](chunk, options) -- candran.can:218 +if not code then -- candran.can:219 +return code, err -- 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 -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 -return message:gsub("(\ +codeCache[options["chunkname"]] = code -- candran.can:223 +local f, err = util["load"](code, options["chunkname"], env) -- candran.can:224 +if f == nil then -- candran.can:229 +return f, "candran unexpectedly generated invalid code: " .. err -- candran.can:230 +end -- candran.can:230 +if options["rewriteErrors"] == false then -- candran.can:233 +return f -- candran.can:234 +else -- candran.can:234 +return function(...) -- candran.can:236 +local params = { ... } -- candran.can:237 +if not errorRewritingActive then -- candran.can:238 +errorRewritingActive = true -- candran.can:239 +local t = { xpcall(function() -- candran.can:240 +return f(unpack(params)) -- candran.can:240 +end, candran["messageHandler"]) } -- candran.can:240 +errorRewritingActive = false -- candran.can:241 +if t[1] == false then -- candran.can:242 +error(t[2], 0) -- candran.can:243 +end -- candran.can:243 +return unpack(t, 2) -- candran.can:245 +else -- candran.can:245 +return f(...) -- candran.can:247 +end -- candran.can:247 +end -- candran.can:247 +end -- candran.can:247 +end -- candran.can:247 +candran["dofile"] = function(filename, options) -- candran.can:255 +local f, err = candran["loadfile"](filename, nil, options) -- candran.can:256 +if f == nil then -- candran.can:258 +error(err) -- candran.can:259 +else -- candran.can:259 +return f() -- candran.can:261 +end -- candran.can:261 +end -- candran.can:261 +candran["messageHandler"] = function(message) -- candran.can:267 +return debug["traceback"](message, 2):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:268 +line = tonumber(line) -- candran.can:269 +local originalFile -- candran.can:271 +local strName = source:match("%[string \"(.-)\"%]") -- candran.can:272 +if strName then -- candran.can:273 +if codeCache[strName] then -- candran.can:274 +originalFile = codeCache[strName] -- candran.can:275 +source = strName -- candran.can:276 +end -- candran.can:276 +else -- candran.can:276 +local fi = io["open"](source, "r") -- candran.can:279 +if fi then -- candran.can:280 +originalFile = fi:read("*a") -- candran.can:281 +fi:close() -- candran.can:282 +end -- candran.can:282 +end -- candran.can:282 +if originalFile then -- candran.can:286 +local i = 0 -- candran.can:287 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:288 +i = i + 1 -- candran.can:289 +if i == line then -- candran.can:290 +local extSource, lineMap = l:match(".*%-%- (.-)%:(%d+)$") -- candran.can:291 +if lineMap then -- candran.can:292 +if extSource ~= source then -- candran.can:293 +return indentation .. extSource .. ":" .. lineMap .. "(" .. extSource .. ":" .. line .. "):" -- candran.can:294 +else -- candran.can:294 +return indentation .. extSource .. ":" .. lineMap .. "(" .. line .. "):" -- candran.can:296 +end -- candran.can:296 +end -- candran.can:296 +break -- candran.can:299 +end -- candran.can:299 +end -- candran.can:299 +end -- candran.can:299 +end) -- candran.can:299 +end -- candran.can:299 +candran["searcher"] = function(modpath) -- candran.can:307 +local filepath = util["search"](modpath, { "can" }) -- candran.can:308 +if not filepath then -- candran.can:309 +if _VERSION == "Lua 5.4" then -- candran.can:310 +return "no candran file in package.path" -- candran.can:311 +else -- candran.can:311 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 -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 +\9no candran file in package.path" -- candran.can:313 +end -- candran.can:313 +end -- candran.can:313 +local r, s = candran["loadfile"](filepath) -- candran.can:316 +if r then -- candran.can:317 +return r -- candran.can:318 +else -- candran.can:318 +return s -- candran.can:320 +end -- candran.can:320 +end -- candran.can:320 +candran["setup"] = function() -- candran.can:325 +if _VERSION == "Lua 5.1" then -- candran.can:326 +table["insert"](package["loaders"], 2, candran["searcher"]) -- candran.can:327 +else -- candran.can:327 +table["insert"](package["searchers"], 2, candran["searcher"]) -- candran.can:329 +end -- candran.can:329 +return candran -- candran.can:331 +end -- candran.can:331 +return candran -- candran.can:334 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.13.0-1.rockspec similarity index 92% rename from rockspec/candran-1.0.0-1.rockspec rename to rockspec/candran-0.13.0-1.rockspec index d291e73..1df15eb 100644 --- a/rockspec/candran-1.0.0-1.rockspec +++ b/rockspec/candran-0.13.0-1.rockspec @@ -2,7 +2,7 @@ rockspec_format = "3.0" package = "candran" -version = "1.0.0-1" +version = "0.13.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.13.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 -- ----------------------