rufus-lua-win 5.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +69 -0
- data/Rakefile +1 -0
- data/lib/rufus/lua/win.rb +18 -0
- data/lib/rufus/lua/win/version.rb +7 -0
- data/rufus-lua-win.gemspec +23 -0
- data/vendor/lua/bin/liblua.dll +0 -0
- data/vendor/lua/lib/lua/LuaXml.lua +119 -0
- data/vendor/lua/lib/lua/alien.lua +250 -0
- data/vendor/lua/lib/lua/alien/core.dll +0 -0
- data/vendor/lua/lib/lua/alien/struct.dll +0 -0
- data/vendor/lua/lib/lua/base.lua +536 -0
- data/vendor/lua/lib/lua/bin.lua +20 -0
- data/vendor/lua/lib/lua/bit.dll +0 -0
- data/vendor/lua/lib/lua/cdlua.dll +0 -0
- data/vendor/lua/lib/lua/cdluacontextplus.dll +0 -0
- data/vendor/lua/lib/lua/cdluagl.dll +0 -0
- data/vendor/lua/lib/lua/cdluaim.dll +0 -0
- data/vendor/lua/lib/lua/cdluapdf.dll +0 -0
- data/vendor/lua/lib/lua/copas.lua +543 -0
- data/vendor/lua/lib/lua/coxpcall.lua +57 -0
- data/vendor/lua/lib/lua/date.lua +745 -0
- data/vendor/lua/lib/lua/debug_ext.lua +84 -0
- data/vendor/lua/lib/lua/debug_init.lua +2 -0
- data/vendor/lua/lib/lua/des56.dll +0 -0
- data/vendor/lua/lib/lua/dist/config.lua +109 -0
- data/vendor/lua/lib/lua/dist/constraints.lua +271 -0
- data/vendor/lua/lib/lua/dist/depends.lua +601 -0
- data/vendor/lua/lib/lua/dist/git.lua +307 -0
- data/vendor/lua/lib/lua/dist/init.lua +278 -0
- data/vendor/lua/lib/lua/dist/manifest.lua +225 -0
- data/vendor/lua/lib/lua/dist/package.lua +583 -0
- data/vendor/lua/lib/lua/dist/sys.lua +367 -0
- data/vendor/lua/lib/lua/dist/utils.lua +130 -0
- data/vendor/lua/lib/lua/ex.dll +0 -0
- data/vendor/lua/lib/lua/fstable.lua +116 -0
- data/vendor/lua/lib/lua/getopt.lua +273 -0
- data/vendor/lua/lib/lua/git.lua +5 -0
- data/vendor/lua/lib/lua/git/core.dll +0 -0
- data/vendor/lua/lib/lua/git/objects.lua +121 -0
- data/vendor/lua/lib/lua/git/pack.lua +316 -0
- data/vendor/lua/lib/lua/git/protocol.lua +188 -0
- data/vendor/lua/lib/lua/git/repo.lua +283 -0
- data/vendor/lua/lib/lua/git/util.lua +233 -0
- data/vendor/lua/lib/lua/gzio.dll +0 -0
- data/vendor/lua/lib/lua/gzip.lua +81 -0
- data/vendor/lua/lib/lua/iconv.dll +0 -0
- data/vendor/lua/lib/lua/imlua.dll +0 -0
- data/vendor/lua/lib/lua/imlua_fftw.dll +0 -0
- data/vendor/lua/lib/lua/imlua_jp2.dll +0 -0
- data/vendor/lua/lib/lua/imlua_process.dll +0 -0
- data/vendor/lua/lib/lua/imlua_process_omp.dll +0 -0
- data/vendor/lua/lib/lua/io_ext.lua +115 -0
- data/vendor/lua/lib/lua/iuplua.dll +0 -0
- data/vendor/lua/lib/lua/iuplua_mglplot.dll +0 -0
- data/vendor/lua/lib/lua/iuplua_pplot.dll +0 -0
- data/vendor/lua/lib/lua/iupluacd.dll +0 -0
- data/vendor/lua/lib/lua/iupluacontrols.dll +0 -0
- data/vendor/lua/lib/lua/iupluagl.dll +0 -0
- data/vendor/lua/lib/lua/iupluaim.dll +0 -0
- data/vendor/lua/lib/lua/iupluaimglib.dll +0 -0
- data/vendor/lua/lib/lua/iupluatuio.dll +0 -0
- data/vendor/lua/lib/lua/lanes-keeper.lua +302 -0
- data/vendor/lua/lib/lua/lanes.lua +591 -0
- data/vendor/lua/lib/lua/lanes/core.dll +0 -0
- data/vendor/lua/lib/lua/lcs.lua +55 -0
- data/vendor/lua/lib/lua/lemock.lua +659 -0
- data/vendor/lua/lib/lua/lfs.dll +0 -0
- data/vendor/lua/lib/lua/list.lua +375 -0
- data/vendor/lua/lib/lua/logging.lua +189 -0
- data/vendor/lua/lib/lua/logging/console.lua +22 -0
- data/vendor/lua/lib/lua/logging/email.lua +44 -0
- data/vendor/lua/lib/lua/logging/file.lua +55 -0
- data/vendor/lua/lib/lua/logging/rolling_file.lua +81 -0
- data/vendor/lua/lib/lua/logging/socket.lua +35 -0
- data/vendor/lua/lib/lua/logging/sql.lua +64 -0
- data/vendor/lua/lib/lua/loop/base.lua +68 -0
- data/vendor/lua/lib/lua/loop/cached.lua +312 -0
- data/vendor/lua/lib/lua/loop/collection/MapWithArrayOfKeys.lua +64 -0
- data/vendor/lua/lib/lua/loop/collection/ObjectCache.lua +39 -0
- data/vendor/lua/lib/lua/loop/collection/OrderedSet.lua +164 -0
- data/vendor/lua/lib/lua/loop/collection/PriorityQueue.lua +86 -0
- data/vendor/lua/lib/lua/loop/collection/UnorderedArray.lua +32 -0
- data/vendor/lua/lib/lua/loop/collection/UnorderedArraySet.lua +56 -0
- data/vendor/lua/lib/lua/loop/compiler/Arguments.lua +108 -0
- data/vendor/lua/lib/lua/loop/compiler/Conditional.lua +50 -0
- data/vendor/lua/lib/lua/loop/compiler/Expression.lua +215 -0
- data/vendor/lua/lib/lua/loop/component/base.lua +221 -0
- data/vendor/lua/lib/lua/loop/component/contained.lua +71 -0
- data/vendor/lua/lib/lua/loop/component/dynamic.lua +223 -0
- data/vendor/lua/lib/lua/loop/component/intercepted.lua +354 -0
- data/vendor/lua/lib/lua/loop/component/wrapped.lua +195 -0
- data/vendor/lua/lib/lua/loop/debug/Inspector.lua +521 -0
- data/vendor/lua/lib/lua/loop/debug/Matcher.lua +192 -0
- data/vendor/lua/lib/lua/loop/debug/Verbose.lua +266 -0
- data/vendor/lua/lib/lua/loop/debug/Viewer.lua +200 -0
- data/vendor/lua/lib/lua/loop/multiple.lua +105 -0
- data/vendor/lua/lib/lua/loop/object/Exception.lua +57 -0
- data/vendor/lua/lib/lua/loop/object/Publisher.lua +43 -0
- data/vendor/lua/lib/lua/loop/object/Wrapper.lua +39 -0
- data/vendor/lua/lib/lua/loop/scoped.lua +585 -0
- data/vendor/lua/lib/lua/loop/serial/FileStream.lua +48 -0
- data/vendor/lua/lib/lua/loop/serial/Serializer.lua +291 -0
- data/vendor/lua/lib/lua/loop/serial/SocketStream.lua +51 -0
- data/vendor/lua/lib/lua/loop/serial/StringStream.lua +47 -0
- data/vendor/lua/lib/lua/loop/simple.lua +75 -0
- data/vendor/lua/lib/lua/loop/table.lua +71 -0
- data/vendor/lua/lib/lua/loop/thread/CoSocket.lua +416 -0
- data/vendor/lua/lib/lua/loop/thread/IOScheduler.lua +170 -0
- data/vendor/lua/lib/lua/loop/thread/Scheduler.lua +327 -0
- data/vendor/lua/lib/lua/loop/thread/SocketScheduler.lua +88 -0
- data/vendor/lua/lib/lua/loop/thread/Timer.lua +54 -0
- data/vendor/lua/lib/lua/lpeg.dll +0 -0
- data/vendor/lua/lib/lua/ltn12.lua +292 -0
- data/vendor/lua/lib/lua/luaXML_lib.dll +0 -0
- data/vendor/lua/lib/lua/luacurl.dll +0 -0
- data/vendor/lua/lib/lua/luadoc/config.lua +34 -0
- data/vendor/lua/lib/lua/luadoc/doclet/debug.lua +46 -0
- data/vendor/lua/lib/lua/luadoc/doclet/formatter.lua +84 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html.lua +289 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/file.lp +113 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/function.lp +64 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/index.lp +70 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/luadoc.css +286 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/menu.lp +55 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/module.lp +109 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/table.lp +15 -0
- data/vendor/lua/lib/lua/luadoc/doclet/raw.lua +12 -0
- data/vendor/lua/lib/lua/luadoc/init.lua +58 -0
- data/vendor/lua/lib/lua/luadoc/lp.lua +130 -0
- data/vendor/lua/lib/lua/luadoc/taglet/standard.lua +495 -0
- data/vendor/lua/lib/lua/luadoc/taglet/standard/tags.lua +171 -0
- data/vendor/lua/lib/lua/luadoc/util.lua +233 -0
- data/vendor/lua/lib/lua/luagl.dll +0 -0
- data/vendor/lua/lib/lua/luaglu.dll +0 -0
- data/vendor/lua/lib/lua/luaidl.lua +113 -0
- data/vendor/lua/lib/lua/luaidl/lex.lua +793 -0
- data/vendor/lua/lib/lua/luaidl/pre.lua +149 -0
- data/vendor/lua/lib/lua/luaidl/sin.lua +3631 -0
- data/vendor/lua/lib/lua/luarocks/add.lua +108 -0
- data/vendor/lua/lib/lua/luarocks/admin_remove.lua +87 -0
- data/vendor/lua/lib/lua/luarocks/build.lua +330 -0
- data/vendor/lua/lib/lua/luarocks/build/builtin.lua +253 -0
- data/vendor/lua/lib/lua/luarocks/build/cmake.lua +54 -0
- data/vendor/lua/lib/lua/luarocks/build/command.lua +32 -0
- data/vendor/lua/lib/lua/luarocks/build/make.lua +92 -0
- data/vendor/lua/lib/lua/luarocks/cache.lua +85 -0
- data/vendor/lua/lib/lua/luarocks/cfg.lua +449 -0
- data/vendor/lua/lib/lua/luarocks/command_line.lua +163 -0
- data/vendor/lua/lib/lua/luarocks/deps.lua +654 -0
- data/vendor/lua/lib/lua/luarocks/dir.lua +69 -0
- data/vendor/lua/lib/lua/luarocks/download.lua +90 -0
- data/vendor/lua/lib/lua/luarocks/fetch.lua +321 -0
- data/vendor/lua/lib/lua/luarocks/fetch/cvs.lua +44 -0
- data/vendor/lua/lib/lua/luarocks/fetch/git.lua +81 -0
- data/vendor/lua/lib/lua/luarocks/fetch/git_file.lua +17 -0
- data/vendor/lua/lib/lua/luarocks/fetch/hg.lua +54 -0
- data/vendor/lua/lib/lua/luarocks/fetch/sscm.lua +42 -0
- data/vendor/lua/lib/lua/luarocks/fetch/svn.lua +53 -0
- data/vendor/lua/lib/lua/luarocks/fs.lua +40 -0
- data/vendor/lua/lib/lua/luarocks/fs/lua.lua +676 -0
- data/vendor/lua/lib/lua/luarocks/fs/unix.lua +88 -0
- data/vendor/lua/lib/lua/luarocks/fs/unix/tools.lua +325 -0
- data/vendor/lua/lib/lua/luarocks/fs/win32.lua +107 -0
- data/vendor/lua/lib/lua/luarocks/fs/win32/tools.lua +334 -0
- data/vendor/lua/lib/lua/luarocks/help.lua +101 -0
- data/vendor/lua/lib/lua/luarocks/index.lua +172 -0
- data/vendor/lua/lib/lua/luarocks/install.lua +151 -0
- data/vendor/lua/lib/lua/luarocks/list.lua +35 -0
- data/vendor/lua/lib/lua/luarocks/loader.lua +228 -0
- data/vendor/lua/lib/lua/luarocks/make.lua +71 -0
- data/vendor/lua/lib/lua/luarocks/make_manifest.lua +34 -0
- data/vendor/lua/lib/lua/luarocks/manif.lua +360 -0
- data/vendor/lua/lib/lua/luarocks/manif_core.lua +75 -0
- data/vendor/lua/lib/lua/luarocks/new_version.lua +141 -0
- data/vendor/lua/lib/lua/luarocks/pack.lua +205 -0
- data/vendor/lua/lib/lua/luarocks/path.lua +315 -0
- data/vendor/lua/lib/lua/luarocks/persist.lua +173 -0
- data/vendor/lua/lib/lua/luarocks/refresh_cache.lua +30 -0
- data/vendor/lua/lib/lua/luarocks/remove.lua +135 -0
- data/vendor/lua/lib/lua/luarocks/rep.lua +313 -0
- data/vendor/lua/lib/lua/luarocks/require.lua +6 -0
- data/vendor/lua/lib/lua/luarocks/search.lua +399 -0
- data/vendor/lua/lib/lua/luarocks/show.lua +138 -0
- data/vendor/lua/lib/lua/luarocks/site_config.lua +23 -0
- data/vendor/lua/lib/lua/luarocks/tools/patch.lua +712 -0
- data/vendor/lua/lib/lua/luarocks/tools/tar.lua +144 -0
- data/vendor/lua/lib/lua/luarocks/tools/zip.lua +245 -0
- data/vendor/lua/lib/lua/luarocks/type_check.lua +267 -0
- data/vendor/lua/lib/lua/luarocks/unpack.lua +151 -0
- data/vendor/lua/lib/lua/luarocks/util.lua +420 -0
- data/vendor/lua/lib/lua/luarocks/validate.lua +164 -0
- data/vendor/lua/lib/lua/luars232.dll +0 -0
- data/vendor/lua/lib/lua/luasql/mysql.dll +0 -0
- data/vendor/lua/lib/lua/luasql/postgres.dll +0 -0
- data/vendor/lua/lib/lua/luasql/sqlite3.dll +0 -0
- data/vendor/lua/lib/lua/luaunit.lua +601 -0
- data/vendor/lua/lib/lua/lxp.dll +0 -0
- data/vendor/lua/lib/lua/lxp/lom.lua +60 -0
- data/vendor/lua/lib/lua/math_ext.lua +27 -0
- data/vendor/lua/lib/lua/mbox.lua +53 -0
- data/vendor/lua/lib/lua/md5.lua +19 -0
- data/vendor/lua/lib/lua/md5/core.dll +0 -0
- data/vendor/lua/lib/lua/metalua.lua +0 -0
- data/vendor/lua/lib/lua/metalua/ast_to_string.mlua +553 -0
- data/vendor/lua/lib/lua/metalua/base.lua +104 -0
- data/vendor/lua/lib/lua/metalua/bytecode.lua +0 -0
- data/vendor/lua/lib/lua/metalua/clopts.mlua +204 -0
- data/vendor/lua/lib/lua/metalua/compiler.lua +3 -0
- data/vendor/lua/lib/lua/metalua/dollar.mlua +24 -0
- data/vendor/lua/lib/lua/metalua/extension/H-runtime.mlua +216 -0
- data/vendor/lua/lib/lua/metalua/extension/H.mlua +22 -0
- data/vendor/lua/lib/lua/metalua/extension/anaphoric.mlua +54 -0
- data/vendor/lua/lib/lua/metalua/extension/clist.mlua +149 -0
- data/vendor/lua/lib/lua/metalua/extension/continue.mlua +53 -0
- data/vendor/lua/lib/lua/metalua/extension/localin.mlua +2 -0
- data/vendor/lua/lib/lua/metalua/extension/log.mlua +39 -0
- data/vendor/lua/lib/lua/metalua/extension/match.mlua +374 -0
- data/vendor/lua/lib/lua/metalua/extension/ternary.mlua +10 -0
- data/vendor/lua/lib/lua/metalua/extension/trycatch.mlua +189 -0
- data/vendor/lua/lib/lua/metalua/extension/types-runtime.mlua +159 -0
- data/vendor/lua/lib/lua/metalua/extension/types.mlua +352 -0
- data/vendor/lua/lib/lua/metalua/extension/withdo.mlua +30 -0
- data/vendor/lua/lib/lua/metalua/extension/xglobal-runtime.lua +41 -0
- data/vendor/lua/lib/lua/metalua/extension/xglobal.mlua +20 -0
- data/vendor/lua/lib/lua/metalua/extension/xloop.mlua +100 -0
- data/vendor/lua/lib/lua/metalua/extension/xmatch.mlua +216 -0
- data/vendor/lua/lib/lua/metalua/metaloop.mlua +76 -0
- data/vendor/lua/lib/lua/metalua/mlc.lua +0 -0
- data/vendor/lua/lib/lua/metalua/mlc_xcall.lua +119 -0
- data/vendor/lua/lib/lua/metalua/mlp.lua +0 -0
- data/vendor/lua/lib/lua/metalua/package2.lua +101 -0
- data/vendor/lua/lib/lua/metalua/runtime.lua +3 -0
- data/vendor/lua/lib/lua/metalua/string2.lua +44 -0
- data/vendor/lua/lib/lua/metalua/table2.lua +372 -0
- data/vendor/lua/lib/lua/metalua/walk.mlua +304 -0
- data/vendor/lua/lib/lua/metalua/walk/bindings.mlua +41 -0
- data/vendor/lua/lib/lua/metalua/walk/id.mlua +186 -0
- data/vendor/lua/lib/lua/metalua/walk/scope.lua +54 -0
- data/vendor/lua/lib/lua/mime.lua +87 -0
- data/vendor/lua/lib/lua/mime/core.dll +0 -0
- data/vendor/lua/lib/lua/mobdebug.lua +1484 -0
- data/vendor/lua/lib/lua/modules.lua +16 -0
- data/vendor/lua/lib/lua/object.lua +56 -0
- data/vendor/lua/lib/lua/oil/Exception.lua +26 -0
- data/vendor/lua/lib/lua/oil/arch.lua +27 -0
- data/vendor/lua/lib/lua/oil/arch/basic/client.lua +29 -0
- data/vendor/lua/lib/lua/oil/arch/basic/common.lua +13 -0
- data/vendor/lua/lib/lua/oil/arch/basic/server.lua +27 -0
- data/vendor/lua/lib/lua/oil/arch/cooperative/common.lua +10 -0
- data/vendor/lua/lib/lua/oil/arch/cooperative/server.lua +16 -0
- data/vendor/lua/lib/lua/oil/arch/corba/client.lua +39 -0
- data/vendor/lua/lib/lua/oil/arch/corba/common.lua +58 -0
- data/vendor/lua/lib/lua/oil/arch/corba/intercepted/client.lua +9 -0
- data/vendor/lua/lib/lua/oil/arch/corba/intercepted/server.lua +9 -0
- data/vendor/lua/lib/lua/oil/arch/corba/server.lua +35 -0
- data/vendor/lua/lib/lua/oil/arch/ludo/byref.lua +18 -0
- data/vendor/lua/lib/lua/oil/arch/ludo/client.lua +19 -0
- data/vendor/lua/lib/lua/oil/arch/ludo/common.lua +18 -0
- data/vendor/lua/lib/lua/oil/arch/ludo/server.lua +19 -0
- data/vendor/lua/lib/lua/oil/arch/typed/client.lua +27 -0
- data/vendor/lua/lib/lua/oil/arch/typed/common.lua +9 -0
- data/vendor/lua/lib/lua/oil/arch/typed/server.lua +18 -0
- data/vendor/lua/lib/lua/oil/assert.lua +87 -0
- data/vendor/lua/lib/lua/oil/builder.lua +45 -0
- data/vendor/lua/lib/lua/oil/builder/basic/client.lua +31 -0
- data/vendor/lua/lib/lua/oil/builder/basic/common.lua +11 -0
- data/vendor/lua/lib/lua/oil/builder/basic/server.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/cooperative/common.lua +11 -0
- data/vendor/lua/lib/lua/oil/builder/cooperative/server.lua +11 -0
- data/vendor/lua/lib/lua/oil/builder/corba/client.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/corba/common.lua +24 -0
- data/vendor/lua/lib/lua/oil/builder/corba/gencode.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/corba/intercepted/client.lua +11 -0
- data/vendor/lua/lib/lua/oil/builder/corba/intercepted/server.lua +11 -0
- data/vendor/lua/lib/lua/oil/builder/corba/server.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/lua/client.lua +11 -0
- data/vendor/lua/lib/lua/oil/builder/lua/server.lua +12 -0
- data/vendor/lua/lib/lua/oil/builder/ludo/byref.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/ludo/client.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/ludo/common.lua +14 -0
- data/vendor/lua/lib/lua/oil/builder/ludo/server.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/typed/client.lua +16 -0
- data/vendor/lua/lib/lua/oil/builder/typed/server.lua +12 -0
- data/vendor/lua/lib/lua/oil/compat.lua +846 -0
- data/vendor/lua/lib/lua/oil/component.lua +1 -0
- data/vendor/lua/lib/lua/oil/corba/giop.lua +301 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Codec.lua +1568 -0
- data/vendor/lua/lib/lua/oil/corba/giop/CodecGen.lua +589 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Exception.lua +25 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Indexer.lua +63 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Listener.lua +343 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Messenger.lua +228 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Referrer.lua +180 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Requester.lua +462 -0
- data/vendor/lua/lib/lua/oil/corba/idl.lua +597 -0
- data/vendor/lua/lib/lua/oil/corba/idl/Compiler.lua +133 -0
- data/vendor/lua/lib/lua/oil/corba/idl/Importer.lua +235 -0
- data/vendor/lua/lib/lua/oil/corba/idl/Indexer.lua +95 -0
- data/vendor/lua/lib/lua/oil/corba/idl/Registry.lua +1821 -0
- data/vendor/lua/lib/lua/oil/corba/idl/ir.lua +847 -0
- data/vendor/lua/lib/lua/oil/corba/idl/sysex.lua +21 -0
- data/vendor/lua/lib/lua/oil/corba/iiop/Profiler.lua +200 -0
- data/vendor/lua/lib/lua/oil/corba/intercepted/Listener.lua +158 -0
- data/vendor/lua/lib/lua/oil/corba/intercepted/Requester.lua +181 -0
- data/vendor/lua/lib/lua/oil/corba/services/event.lua +126 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/ConsumerAdmin.lua +50 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/EventFactory.lua +15 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/EventQueue.lua +37 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/ProxyPushConsumer.lua +75 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/ProxyPushSupplier.lua +62 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/SingleDeferredDispatcher.lua +60 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/SingleSynchronousDispatcher.lua +39 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/SupplierAdmin.lua +50 -0
- data/vendor/lua/lib/lua/oil/corba/services/naming.lua +436 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Acceptor.lua +268 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Channels.lua +121 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Connector.lua +147 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Dispatcher.lua +99 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Proxies.lua +86 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Proxies/asynchronous.lua +56 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Proxies/protected.lua +17 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Proxies/synchronous.lua +17 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Proxies/utils.lua +29 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Receiver.lua +110 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Servants.lua +207 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Sockets.lua +44 -0
- data/vendor/lua/lib/lua/oil/kernel/cooperative/Receiver.lua +139 -0
- data/vendor/lua/lib/lua/oil/kernel/intercepted/Listener.lua +47 -0
- data/vendor/lua/lib/lua/oil/kernel/intercepted/Requester.lua +58 -0
- data/vendor/lua/lib/lua/oil/kernel/lua/Dispatcher.lua +76 -0
- data/vendor/lua/lib/lua/oil/kernel/lua/Proxies.lua +69 -0
- data/vendor/lua/lib/lua/oil/kernel/typed/Dispatcher.lua +91 -0
- data/vendor/lua/lib/lua/oil/kernel/typed/Proxies.lua +153 -0
- data/vendor/lua/lib/lua/oil/kernel/typed/Servants.lua +137 -0
- data/vendor/lua/lib/lua/oil/ludo/Codec.lua +66 -0
- data/vendor/lua/lib/lua/oil/ludo/CodecByRef.lua +103 -0
- data/vendor/lua/lib/lua/oil/ludo/Listener.lua +151 -0
- data/vendor/lua/lib/lua/oil/ludo/Referrer.lua +72 -0
- data/vendor/lua/lib/lua/oil/ludo/Requester.lua +107 -0
- data/vendor/lua/lib/lua/oil/oo.lua +1 -0
- data/vendor/lua/lib/lua/oil/port.lua +1 -0
- data/vendor/lua/lib/lua/oil/properties.lua +57 -0
- data/vendor/lua/lib/lua/oil/verbose.lua +133 -0
- data/vendor/lua/lib/lua/package_ext.lua +15 -0
- data/vendor/lua/lib/lua/parser.lua +268 -0
- data/vendor/lua/lib/lua/pl/Date.lua +555 -0
- data/vendor/lua/lib/lua/pl/List.lua +613 -0
- data/vendor/lua/lib/lua/pl/Map.lua +113 -0
- data/vendor/lua/lib/lua/pl/MultiMap.lua +62 -0
- data/vendor/lua/lib/lua/pl/OrderedMap.lua +151 -0
- data/vendor/lua/lib/lua/pl/Set.lua +153 -0
- data/vendor/lua/lib/lua/pl/app.lua +165 -0
- data/vendor/lua/lib/lua/pl/array2d.lua +501 -0
- data/vendor/lua/lib/lua/pl/class.lua +180 -0
- data/vendor/lua/lib/lua/pl/comprehension.lua +286 -0
- data/vendor/lua/lib/lua/pl/config.lua +176 -0
- data/vendor/lua/lib/lua/pl/data.lua +606 -0
- data/vendor/lua/lib/lua/pl/dir.lua +475 -0
- data/vendor/lua/lib/lua/pl/file.lua +70 -0
- data/vendor/lua/lib/lua/pl/func.lua +376 -0
- data/vendor/lua/lib/lua/pl/init.lua +68 -0
- data/vendor/lua/lib/lua/pl/input.lua +173 -0
- data/vendor/lua/lib/lua/pl/lapp.lua +407 -0
- data/vendor/lua/lib/lua/pl/lexer.lua +456 -0
- data/vendor/lua/lib/lua/pl/luabalanced.lua +264 -0
- data/vendor/lua/lib/lua/pl/operator.lua +201 -0
- data/vendor/lua/lib/lua/pl/path.lua +398 -0
- data/vendor/lua/lib/lua/pl/permute.lua +63 -0
- data/vendor/lua/lib/lua/pl/platf/luajava.lua +101 -0
- data/vendor/lua/lib/lua/pl/pretty.lua +285 -0
- data/vendor/lua/lib/lua/pl/seq.lua +551 -0
- data/vendor/lua/lib/lua/pl/sip.lua +344 -0
- data/vendor/lua/lib/lua/pl/strict.lua +70 -0
- data/vendor/lua/lib/lua/pl/stringio.lua +158 -0
- data/vendor/lua/lib/lua/pl/stringx.lua +440 -0
- data/vendor/lua/lib/lua/pl/tablex.lua +817 -0
- data/vendor/lua/lib/lua/pl/template.lua +103 -0
- data/vendor/lua/lib/lua/pl/test.lua +135 -0
- data/vendor/lua/lib/lua/pl/text.lua +243 -0
- data/vendor/lua/lib/lua/pl/utils.lua +550 -0
- data/vendor/lua/lib/lua/pl/xml.lua +689 -0
- data/vendor/lua/lib/lua/profiler.dll +0 -0
- data/vendor/lua/lib/lua/re.lua +248 -0
- data/vendor/lua/lib/lua/rex_onig.dll +0 -0
- data/vendor/lua/lib/lua/rex_pcre.dll +0 -0
- data/vendor/lua/lib/lua/rex_posix.dll +0 -0
- data/vendor/lua/lib/lua/rings.dll +0 -0
- data/vendor/lua/lib/lua/serialize.lua +193 -0
- data/vendor/lua/lib/lua/set.lua +149 -0
- data/vendor/lua/lib/lua/socket.lua +133 -0
- data/vendor/lua/lib/lua/socket/core.dll +0 -0
- data/vendor/lua/lib/lua/socket/ftp.lua +281 -0
- data/vendor/lua/lib/lua/socket/http.lua +350 -0
- data/vendor/lua/lib/lua/socket/smtp.lua +251 -0
- data/vendor/lua/lib/lua/socket/tp.lua +123 -0
- data/vendor/lua/lib/lua/socket/url.lua +297 -0
- data/vendor/lua/lib/lua/ssl.dll +0 -0
- data/vendor/lua/lib/lua/ssl.lua +93 -0
- data/vendor/lua/lib/lua/ssl/https.lua +138 -0
- data/vendor/lua/lib/lua/stable.lua +28 -0
- data/vendor/lua/lib/lua/std.lua +16 -0
- data/vendor/lua/lib/lua/strbuf.lua +32 -0
- data/vendor/lua/lib/lua/strict.lua +45 -0
- data/vendor/lua/lib/lua/string_ext.lua +274 -0
- data/vendor/lua/lib/lua/table_ext.lua +117 -0
- data/vendor/lua/lib/lua/tar.lua +262 -0
- data/vendor/lua/lib/lua/task.dll +0 -0
- data/vendor/lua/lib/lua/tree.lua +81 -0
- data/vendor/lua/lib/lua/unicode.dll +0 -0
- data/vendor/lua/lib/lua/verbose_require.lua +11 -0
- data/vendor/lua/lib/lua/vstruct.lua +86 -0
- data/vendor/lua/lib/lua/vstruct/ast.lua +192 -0
- data/vendor/lua/lib/lua/vstruct/ast/Bitpack.lua +33 -0
- data/vendor/lua/lib/lua/vstruct/ast/Generator.lua +174 -0
- data/vendor/lua/lib/lua/vstruct/ast/IO.lua +45 -0
- data/vendor/lua/lib/lua/vstruct/ast/List.lua +56 -0
- data/vendor/lua/lib/lua/vstruct/ast/Name.lua +20 -0
- data/vendor/lua/lib/lua/vstruct/ast/Repeat.lua +23 -0
- data/vendor/lua/lib/lua/vstruct/ast/Root.lua +19 -0
- data/vendor/lua/lib/lua/vstruct/ast/Table.lua +65 -0
- data/vendor/lua/lib/lua/vstruct/cursor.lua +81 -0
- data/vendor/lua/lib/lua/vstruct/io.lua +45 -0
- data/vendor/lua/lib/lua/vstruct/io/a.lua +24 -0
- data/vendor/lua/lib/lua/vstruct/io/b.lua +28 -0
- data/vendor/lua/lib/lua/vstruct/io/bigendian.lua +21 -0
- data/vendor/lua/lib/lua/vstruct/io/c.lua +25 -0
- data/vendor/lua/lib/lua/vstruct/io/defaults.lua +24 -0
- data/vendor/lua/lib/lua/vstruct/io/endianness.lua +41 -0
- data/vendor/lua/lib/lua/vstruct/io/f.lua +129 -0
- data/vendor/lua/lib/lua/vstruct/io/hostendian.lua +21 -0
- data/vendor/lua/lib/lua/vstruct/io/i.lua +42 -0
- data/vendor/lua/lib/lua/vstruct/io/littleendian.lua +21 -0
- data/vendor/lua/lib/lua/vstruct/io/m.lua +62 -0
- data/vendor/lua/lib/lua/vstruct/io/p.lua +23 -0
- data/vendor/lua/lib/lua/vstruct/io/s.lua +27 -0
- data/vendor/lua/lib/lua/vstruct/io/seekb.lua +18 -0
- data/vendor/lua/lib/lua/vstruct/io/seekf.lua +18 -0
- data/vendor/lua/lib/lua/vstruct/io/seekto.lua +18 -0
- data/vendor/lua/lib/lua/vstruct/io/u.lua +54 -0
- data/vendor/lua/lib/lua/vstruct/io/x.lua +34 -0
- data/vendor/lua/lib/lua/vstruct/io/z.lua +63 -0
- data/vendor/lua/lib/lua/vstruct/lexer.lua +100 -0
- data/vendor/lua/lib/lua/vstruct/pack.lua +142 -0
- data/vendor/lua/lib/lua/vstruct/test.lua +47 -0
- data/vendor/lua/lib/lua/vstruct/test/basic.lua +73 -0
- data/vendor/lua/lib/lua/vstruct/test/common.lua +100 -0
- data/vendor/lua/lib/lua/vstruct/test/fp-bigendian.lua +56 -0
- data/vendor/lua/lib/lua/vstruct/test/fp-littleendian.lua +56 -0
- data/vendor/lua/lib/lua/vstruct/test/struct-test-gen.lua +1230 -0
- data/vendor/lua/lib/lua/vstruct/unpack.lua +126 -0
- data/vendor/lua/lib/lua/wx.dll +0 -0
- data/vendor/lua/lib/lua/xml.lua +75 -0
- data/vendor/lua/lib/lua/zip.dll +0 -0
- data/vendor/lua/lib/lua/zlib.dll +0 -0
- metadata +529 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
require 'metalua.walk.id'
|
|
2
|
+
-{ extension 'log' }
|
|
3
|
+
|
|
4
|
+
mlp.expr.prefix:add{ '!', prec = 5,
|
|
5
|
+
builder = function(_,x)
|
|
6
|
+
local v = mlp.gensym()
|
|
7
|
+
return `Stat{ +{ block:
|
|
8
|
+
local -{v} = -{x};
|
|
9
|
+
(-{v}).h_boundary=true },
|
|
10
|
+
v }
|
|
11
|
+
end }
|
|
12
|
+
|
|
13
|
+
mlp.stat:add{ '!', mlp.expr, builder = |x| +{stat: (-{x[1]}).h_boundary=true } }
|
|
14
|
+
|
|
15
|
+
-- * if there's no boundary in it, is there a need to rename vars?
|
|
16
|
+
-- ==> first pass to mark binders which contain boundaries,
|
|
17
|
+
-- then 2nd pass only touched those which have a splice
|
|
18
|
+
-- in them.
|
|
19
|
+
|
|
20
|
+
return +{ require (-{ `String{ package.metalua_extension_prefix .. 'H-runtime' } }) }
|
|
21
|
+
|
|
22
|
+
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
--------------------------------------------------------------------------------
|
|
2
|
+
--
|
|
3
|
+
-- Anaphoric macros.
|
|
4
|
+
--
|
|
5
|
+
-- This extension turns 'it' into a special variable, that's bound to
|
|
6
|
+
-- an often used value:
|
|
7
|
+
--
|
|
8
|
+
-- * in an 'if' statement, 'it' is bound, in a block, to the condition
|
|
9
|
+
-- that triggered the block's execution:
|
|
10
|
+
-- > if 1234 then y=it end; assert (y == 1234)
|
|
11
|
+
--
|
|
12
|
+
-- * in a while loop, it's bound to the test:
|
|
13
|
+
-- > while file:read "*a" do table.insert (lines, it) end
|
|
14
|
+
--
|
|
15
|
+
-- 'it' is bound the the most closely surrounding structure. If you wanted to
|
|
16
|
+
-- use its content at a deeper position in the AST, you would have to save it
|
|
17
|
+
-- in a temporary variable. But what you should really do in such a case is
|
|
18
|
+
-- avoiding to use anaphoric macros: they're fine for one-liner, but they
|
|
19
|
+
-- reduce readability for bigger functions.
|
|
20
|
+
--------------------------------------------------------------------------------
|
|
21
|
+
|
|
22
|
+
-- TODO: 'and' operator could, and maybe should, be anaphoric as well
|
|
23
|
+
-- TODO: anaphoric functions would be cool for recursive functions, but
|
|
24
|
+
-- recursive calls are always in an 'if' statement, so the pronoun
|
|
25
|
+
-- used for functions must not be the same as for 'if'.
|
|
26
|
+
|
|
27
|
+
require 'freevars'
|
|
28
|
+
|
|
29
|
+
local function anaphoric_if(ast)
|
|
30
|
+
local it_found = false
|
|
31
|
+
for i=2, #ast do
|
|
32
|
+
if freevars.block(ast[i])['it'] then
|
|
33
|
+
it_found = true
|
|
34
|
+
break
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
if it_found then
|
|
38
|
+
local cond = ast[1]
|
|
39
|
+
ast[1] = +{it}
|
|
40
|
+
return +{stat: do local it = -{cond}; -{ast} end }
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
local function anaphoric_while(ast)
|
|
45
|
+
local it_found = false
|
|
46
|
+
if freevars.block(ast[2])['it'] then
|
|
47
|
+
local cond = ast[1]
|
|
48
|
+
ast[1] = +{it}
|
|
49
|
+
return +{stat: do local it = -{cond}; -{ast} end }
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
mlp.stat:get'if'.transformers:add(anaphoric_if)
|
|
54
|
+
mlp.stat:get'while'.transformers:add(anaphoric_while)
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
----------------------------------------------------------------------
|
|
2
|
+
-- Metalua samples: $Id$
|
|
3
|
+
--
|
|
4
|
+
-- Summary: Lists by comprehension
|
|
5
|
+
--
|
|
6
|
+
----------------------------------------------------------------------
|
|
7
|
+
--
|
|
8
|
+
-- Copyright (c) 2006-2007, Fabien Fleutot <metalua@gmail.com>.
|
|
9
|
+
--
|
|
10
|
+
-- This software is released under the MIT Licence, see licence.txt
|
|
11
|
+
-- for details.
|
|
12
|
+
--
|
|
13
|
+
--------------------------------------------------------------------------------
|
|
14
|
+
--
|
|
15
|
+
-- This extension implements list comprehensions, similar to Haskell and
|
|
16
|
+
-- Python syntax, to easily describe lists.
|
|
17
|
+
--
|
|
18
|
+
--------------------------------------------------------------------------------
|
|
19
|
+
|
|
20
|
+
-{ extension "match" }
|
|
21
|
+
|
|
22
|
+
local function dots_builder (x) return `Dots{ x } end
|
|
23
|
+
|
|
24
|
+
local function for_builder (x, h)
|
|
25
|
+
match x with
|
|
26
|
+
| `Comp{ _, acc } -> table.insert (acc, h[1]); return x
|
|
27
|
+
| `Pair{ _, _ } -> error "No explicit key in a for list generator"
|
|
28
|
+
| _ -> return `Comp{ x, {h[1]} }
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
local function if_builder (x, p)
|
|
33
|
+
match x with
|
|
34
|
+
| `Comp{ _, acc } -> table.insert (acc, `If{ p[1] }); return x
|
|
35
|
+
| `Pair{ _, _ } -> error "No explicit key in a list guard"
|
|
36
|
+
| _ -> return `Comp{ x, p[1] }
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
local function comp_builder(core, list, no_unpack)
|
|
41
|
+
-- [ti] = temp var holding table.insert
|
|
42
|
+
-- [v] = variable holding the table being built
|
|
43
|
+
-- [r] = the core of the list being built
|
|
44
|
+
local ti, v, r = mlp.gensym "table_insert", mlp.gensym "table"
|
|
45
|
+
|
|
46
|
+
-----------------------------------------------------------------------------
|
|
47
|
+
-- 1 - Build the loop's core: if it has suffix "...", every elements of the
|
|
48
|
+
-- multi-return must be inserted, hence the extra [for] loop.
|
|
49
|
+
-----------------------------------------------------------------------------
|
|
50
|
+
match core with
|
|
51
|
+
| `Dots{ x } ->
|
|
52
|
+
local w = mlp.gensym()
|
|
53
|
+
r = +{stat: for -{w} in values( -{x} ) do -{ `Call{ ti, v, w } } end }
|
|
54
|
+
| `Pair{ k, w } ->
|
|
55
|
+
r = `Set{ { `Index{ v, k } }, { w } }
|
|
56
|
+
| _ -> r = `Call{ ti, v, core }
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
-----------------------------------------------------------------------------
|
|
60
|
+
-- 2 - Stack the if and for control structures, from outside to inside.
|
|
61
|
+
-- This is done in a destructive way for the elements of [list].
|
|
62
|
+
-----------------------------------------------------------------------------
|
|
63
|
+
for i = #list, 1, -1 do
|
|
64
|
+
table.insert (list[i], {r})
|
|
65
|
+
r = list[i]
|
|
66
|
+
end
|
|
67
|
+
if no_unpack then
|
|
68
|
+
return `Stat{ { `Local{ {ti, v}, { +{table.insert}, `Table} }, r }, v }
|
|
69
|
+
else
|
|
70
|
+
return +{ function()
|
|
71
|
+
local -{ti}, -{v} = table.insert, { }
|
|
72
|
+
-{r}; return unpack(-{v})
|
|
73
|
+
end () }
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
local function table_content_builder (list)
|
|
78
|
+
match list with
|
|
79
|
+
| { `Comp{ y, acc } } -> return comp_builder( y, acc, "no unpack")
|
|
80
|
+
| _ ->
|
|
81
|
+
local tables = { `Table }
|
|
82
|
+
local ctable = tables[1]
|
|
83
|
+
local function flush() ctable=`Table; table.insert(tables, ctable) end
|
|
84
|
+
for x in values(list) do
|
|
85
|
+
match x with
|
|
86
|
+
| `Comp{ y, acc } -> table.insert(ctable, comp_builder(y, acc)); flush()
|
|
87
|
+
| `Dots{ y } -> table.insert(ctable, y); flush()
|
|
88
|
+
| _ -> table.insert (ctable, x);
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
match tables with
|
|
92
|
+
| { x } | { x, { } } -> return x
|
|
93
|
+
| _ ->
|
|
94
|
+
if #tables[#tables]==0 then table.remove(tables) end --suppress empty table
|
|
95
|
+
return `Call{ +{table.cat}, unpack(tables) }
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
mlp.table_field = gg.expr{ name="table cell",
|
|
101
|
+
primary = mlp.table_field,
|
|
102
|
+
suffix = { name="table cell suffix",
|
|
103
|
+
{ "...", builder = dots_builder },
|
|
104
|
+
{ "for", mlp.for_header, builder = for_builder },
|
|
105
|
+
{ "if", mlp.expr, builder = if_builder } } }
|
|
106
|
+
|
|
107
|
+
mlp.table_content.builder = table_content_builder
|
|
108
|
+
|
|
109
|
+
--[[
|
|
110
|
+
mlp.stat:add{ "for", gg.expr {
|
|
111
|
+
primary = for_header,
|
|
112
|
+
suffix = {
|
|
113
|
+
{ "for", mlp.for_header, builder = for_builder },
|
|
114
|
+
{ "if", mlp.expr, builder = if_builder } } },
|
|
115
|
+
"do", mlp.block, "end", builder = for_stat_builder }
|
|
116
|
+
--]]
|
|
117
|
+
|
|
118
|
+
--------------------------------------------------------------------------------
|
|
119
|
+
-- Back-end for improved index operator.
|
|
120
|
+
--------------------------------------------------------------------------------
|
|
121
|
+
local function index_builder(a, suffix)
|
|
122
|
+
match suffix[1] with
|
|
123
|
+
-- Single index, no range: keep the native semantics
|
|
124
|
+
| { { e, false } } -> return `Index{ a, e }
|
|
125
|
+
-- Either a range, or multiple indexes, or both
|
|
126
|
+
| ranges ->
|
|
127
|
+
local r = `Call{ +{table.isub}, a }
|
|
128
|
+
local function acc (x,y) table.insert (r,x); table.insert (r,y) end
|
|
129
|
+
for seq in ivalues (ranges) do
|
|
130
|
+
match seq with
|
|
131
|
+
| { e, false } -> acc(e,e)
|
|
132
|
+
| { e, f } -> acc(e,f)
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
return r
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
--------------------------------------------------------------------------------
|
|
140
|
+
-- Improved "[...]" index operator:
|
|
141
|
+
-- * support for multi-indexes ("foo[bar, gnat]")
|
|
142
|
+
-- * support for ranges ("foo[bar ... gnat]")
|
|
143
|
+
--------------------------------------------------------------------------------
|
|
144
|
+
mlp.expr.suffix:del '['
|
|
145
|
+
mlp.expr.suffix:add{ name="table index/range",
|
|
146
|
+
"[", gg.list{
|
|
147
|
+
gg.sequence { mlp.expr, gg.onkeyword{ "...", mlp.expr } } ,
|
|
148
|
+
separators = { ",", ";" } },
|
|
149
|
+
"]", builder = index_builder }
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
require "metalua.walk"
|
|
2
|
+
|
|
3
|
+
----------------------------------------------------------------------
|
|
4
|
+
-- * [loop_tags] are the tags of statements which support continue.
|
|
5
|
+
-- * [loop_keywords] are the initial keywords which trigger the parsing
|
|
6
|
+
-- of these statements: they're indeed indexed by keyword in [mlp.stat].
|
|
7
|
+
----------------------------------------------------------------------
|
|
8
|
+
|
|
9
|
+
local loop_tags = table.transpose{ "Forin", "Fornum", "While", "Repeat" }
|
|
10
|
+
local loop_keywords = { "for", "while", "repeat" }
|
|
11
|
+
|
|
12
|
+
----------------------------------------------------------------------
|
|
13
|
+
-- This function takes the AST of a continue-enabled loop, parse
|
|
14
|
+
-- its body to find all instances of [`Continue]. If any of them
|
|
15
|
+
-- is found ([label~=nil]), they're transformed in [`Goto{...}], and
|
|
16
|
+
-- the corresponding label is added at the end of the loop's body.
|
|
17
|
+
--
|
|
18
|
+
-- Caveat: if a [continue] appears in the non-body part of a loop
|
|
19
|
+
-- (and therefore is relative to some enclosing loop), it isn't
|
|
20
|
+
-- handled, and therefore causes a compilation error. This could
|
|
21
|
+
-- only happen due in a [`Stat{ }], however, since [`Function{ }]
|
|
22
|
+
-- cuts the search for [`Continue].
|
|
23
|
+
----------------------------------------------------------------------
|
|
24
|
+
local function loop_transformer (ast)
|
|
25
|
+
local label
|
|
26
|
+
local cfg = { stat = { }; expr = { } }
|
|
27
|
+
|
|
28
|
+
function cfg.stat.down (x)
|
|
29
|
+
if loop_tags[x.tag] then return 'break'
|
|
30
|
+
elseif x.tag=='Continue' then
|
|
31
|
+
if not label then label = mlp.gensym 'continue' end
|
|
32
|
+
x <- `Goto{ label }
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
function cfg.expr.down (x)
|
|
37
|
+
return x.tag=='Function' and 'break'
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
local loop_body = ast.tag=="Repeat" and ast[1] or ast[#ast]
|
|
41
|
+
walk.block (cfg, loop_body)
|
|
42
|
+
if label then table.insert (loop_body, `Label{ label }) end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
----------------------------------------------------------------------
|
|
46
|
+
-- Register the transformer for each kind of loop:
|
|
47
|
+
----------------------------------------------------------------------
|
|
48
|
+
for keyword in values (loop_keywords) do
|
|
49
|
+
mlp.stat:get(keyword).transformers:add (loop_transformer)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
mlp.lexer:add "continue"
|
|
53
|
+
mlp.stat:add{ "continue", builder = ||`Continue }
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require 'metalua.dollar'
|
|
2
|
+
|
|
3
|
+
-{ extension 'match' }
|
|
4
|
+
|
|
5
|
+
function dollar.log(...)
|
|
6
|
+
local args = {...}
|
|
7
|
+
local ti = table.insert
|
|
8
|
+
local code = { }
|
|
9
|
+
local nohash = false
|
|
10
|
+
local width = 80
|
|
11
|
+
|
|
12
|
+
local i=1
|
|
13
|
+
if args[i].tag=='String' then
|
|
14
|
+
ti(code, +{print(" [LOG] "..-{args[1]})})
|
|
15
|
+
i += 1
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
local xtra_args, names, vals = { }, { }, { }
|
|
19
|
+
for i=i, #args do
|
|
20
|
+
match args[i] with
|
|
21
|
+
| +{ 'nohash' } -> nohash = true
|
|
22
|
+
| `Number{ w } -> width = w
|
|
23
|
+
--| `String{...} | `Number{...} -> ti (xtra_args, args[i])
|
|
24
|
+
| `Id{n} -> ti (names, n); ti (vals, args[i])
|
|
25
|
+
| x -> ti (names, table.tostring(x, 'nohash')); ti (vals, x)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
for i=1, #names do
|
|
30
|
+
local msg = string.format(" [LOG] %s = ", names[i])
|
|
31
|
+
local printer = `Call{ +{table.tostring},
|
|
32
|
+
vals[i],
|
|
33
|
+
`Number{ width },
|
|
34
|
+
`Number{ #msg } }
|
|
35
|
+
if nohash then ti(printer, +{'nohash'}) end
|
|
36
|
+
ti (code, `Call{ +{printf}, +{"%s%s"}, `String{ msg }, printer })
|
|
37
|
+
end
|
|
38
|
+
return code
|
|
39
|
+
end
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
----------------------------------------------------------------------
|
|
2
|
+
-- Metalua samples: $Id$
|
|
3
|
+
--
|
|
4
|
+
-- Summary: Structural pattern matching for metalua ADT.
|
|
5
|
+
--
|
|
6
|
+
----------------------------------------------------------------------
|
|
7
|
+
--
|
|
8
|
+
-- Copyright (c) 2006-2008, Fabien Fleutot <metalua@gmail.com>.
|
|
9
|
+
--
|
|
10
|
+
-- This software is released under the MIT Licence, see licence.txt
|
|
11
|
+
-- for details.
|
|
12
|
+
--
|
|
13
|
+
--------------------------------------------------------------------------------
|
|
14
|
+
--
|
|
15
|
+
-- Glossary:
|
|
16
|
+
--
|
|
17
|
+
-- * term_seq: the tested stuff, a sequence of terms
|
|
18
|
+
-- * pattern_element: might match one term of a term seq. Represented
|
|
19
|
+
-- as expression ASTs.
|
|
20
|
+
-- * pattern_seq: might match a term_seq
|
|
21
|
+
-- * pattern_group: several pattern seqs, one of them might match
|
|
22
|
+
-- the term seq.
|
|
23
|
+
-- * case: pattern_group * guard option * block
|
|
24
|
+
-- * match_statement: tested term_seq * case list
|
|
25
|
+
--
|
|
26
|
+
-- Hence a complete match statement is a:
|
|
27
|
+
--
|
|
28
|
+
-- { list(expr), list{ list(list(expr)), expr or false, block } }
|
|
29
|
+
--
|
|
30
|
+
-- Implementation hints
|
|
31
|
+
-- ====================
|
|
32
|
+
--
|
|
33
|
+
-- The implementation is made as modular as possible, so that parts
|
|
34
|
+
-- can be reused in other extensions. The priviledged way to share
|
|
35
|
+
-- contextual information across functions is through the 'cfg' table
|
|
36
|
+
-- argument. Its fields include:
|
|
37
|
+
--
|
|
38
|
+
-- * code: code generated from pattern. A pattern_(element|seq|group)
|
|
39
|
+
-- is compiled as a sequence of instructions which will jump to
|
|
40
|
+
-- label [cfg.on_failure] if the tested term doesn't match.
|
|
41
|
+
--
|
|
42
|
+
-- * on_failure: name of the label where the code will jump if the
|
|
43
|
+
-- pattern doesn't match
|
|
44
|
+
--
|
|
45
|
+
-- * locals: names of local variables used by the pattern. This
|
|
46
|
+
-- includes bound variables, and temporary variables used to
|
|
47
|
+
-- destructure tables. Names are stored as keys of the table,
|
|
48
|
+
-- values are meaningless.
|
|
49
|
+
--
|
|
50
|
+
-- * after_success: label where the code must jump after a pattern
|
|
51
|
+
-- succeeded to capture a term, and the guard suceeded if there is
|
|
52
|
+
-- any, and the conditional block has run.
|
|
53
|
+
--
|
|
54
|
+
-- * ntmp: number of temporary variables used to destructurate table
|
|
55
|
+
-- in the current case.
|
|
56
|
+
--
|
|
57
|
+
-- Code generation is performed by acc_xxx() functions, which accumulate
|
|
58
|
+
-- code in cfg.code:
|
|
59
|
+
--
|
|
60
|
+
-- * acc_test(test, cfg) will generate a jump to cfg.on_failure
|
|
61
|
+
-- *when the test returns TRUE*
|
|
62
|
+
--
|
|
63
|
+
-- * acc_stat accumulates a statement
|
|
64
|
+
--
|
|
65
|
+
-- * acc_assign accumulate an assignment statement, and makes sure that
|
|
66
|
+
-- the LHS variable the registered as local in cfg.locals.
|
|
67
|
+
--
|
|
68
|
+
----------------------------------------------------------------------
|
|
69
|
+
|
|
70
|
+
-- TODO: hygiene wrt type()
|
|
71
|
+
-- TODO: cfg.ntmp isn't reset as often as it could. I'm not even sure
|
|
72
|
+
-- the corresponding locals are declared.
|
|
73
|
+
|
|
74
|
+
module ('spmatch', package.seeall)
|
|
75
|
+
|
|
76
|
+
----------------------------------------------------------------------
|
|
77
|
+
-- This would have been best done through library 'metalua.walk',
|
|
78
|
+
-- but walk depends on match, so we have to break the dependency.
|
|
79
|
+
-- It replaces all instances of `...' in `ast' with `term', unless
|
|
80
|
+
-- it appears in a function.
|
|
81
|
+
----------------------------------------------------------------------
|
|
82
|
+
function replace_dots (ast, term)
|
|
83
|
+
local function rec (x)
|
|
84
|
+
if type(x) == 'table' then
|
|
85
|
+
if x.tag=='Dots' then
|
|
86
|
+
if term=='ambiguous' then
|
|
87
|
+
error ("You can't use `...' on the right of a match case when it appears "..
|
|
88
|
+
"more than once on the left")
|
|
89
|
+
else
|
|
90
|
+
x <- term
|
|
91
|
+
end
|
|
92
|
+
elseif x.tag=='Function' then return
|
|
93
|
+
else for y in ivalues (x) do rec (y) end end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
return rec (ast)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
tmpvar_base = mlp.gensym 'submatch.' [1]
|
|
100
|
+
function next_tmpvar(cfg)
|
|
101
|
+
assert (cfg.ntmp, "No cfg.ntmp imbrication level in the match compiler")
|
|
102
|
+
cfg.ntmp = cfg.ntmp+1
|
|
103
|
+
return `Id{ tmpvar_base .. cfg.ntmp }
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
-- Code accumulators
|
|
107
|
+
acc_stat = |x,cfg| table.insert (cfg.code, x)
|
|
108
|
+
acc_test = |x,cfg| acc_stat(+{stat: if -{x} then -{`Goto{cfg.on_failure}} end}, cfg)
|
|
109
|
+
-- lhs :: `Id{ string }
|
|
110
|
+
-- rhs :: expr
|
|
111
|
+
function acc_assign (lhs, rhs, cfg)
|
|
112
|
+
assert(lhs.tag=='Id')
|
|
113
|
+
cfg.locals[lhs[1]] = true
|
|
114
|
+
acc_stat (`Set{ {lhs}, {rhs} }, cfg)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
literal_tags = table.transpose{ 'String', 'Number', 'True', 'False', 'Nil' }
|
|
118
|
+
|
|
119
|
+
-- pattern :: `Id{ string }
|
|
120
|
+
-- term :: expr
|
|
121
|
+
function id_pattern_element_builder (pattern, term, cfg)
|
|
122
|
+
assert (pattern.tag == "Id")
|
|
123
|
+
if pattern[1] == "_" then
|
|
124
|
+
-- "_" is used as a dummy var ==> no assignment, no == checking
|
|
125
|
+
cfg.locals._ = true
|
|
126
|
+
elseif cfg.locals[pattern[1]] then
|
|
127
|
+
-- This var is already bound ==> test for equality
|
|
128
|
+
acc_test (+{ -{term} ~= -{pattern} }, cfg)
|
|
129
|
+
else
|
|
130
|
+
-- Free var ==> bind it, and remember it for latter linearity checking
|
|
131
|
+
acc_assign (pattern, term, cfg)
|
|
132
|
+
cfg.locals[pattern[1]] = true
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
-- Concatenate code in [cfg.code], that will jump to label
|
|
137
|
+
-- [cfg.on_failure] if [pattern] doesn't match [term]. [pattern]
|
|
138
|
+
-- should be an identifier, or at least cheap to compute and
|
|
139
|
+
-- side-effects free.
|
|
140
|
+
--
|
|
141
|
+
-- pattern :: pattern_element
|
|
142
|
+
-- term :: expr
|
|
143
|
+
function pattern_element_builder (pattern, term, cfg)
|
|
144
|
+
if literal_tags[pattern.tag] then
|
|
145
|
+
acc_test (+{ -{term} ~= -{pattern} }, cfg)
|
|
146
|
+
elseif "Id" == pattern.tag then
|
|
147
|
+
id_pattern_element_builder (pattern, term, cfg)
|
|
148
|
+
elseif "Op" == pattern.tag and "div" == pattern[1] then
|
|
149
|
+
regexp_pattern_element_builder (pattern, term, cfg)
|
|
150
|
+
elseif "Op" == pattern.tag and "eq" == pattern[1] then
|
|
151
|
+
eq_pattern_element_builder (pattern, term, cfg)
|
|
152
|
+
elseif "Table" == pattern.tag then
|
|
153
|
+
table_pattern_element_builder (pattern, term, cfg)
|
|
154
|
+
else
|
|
155
|
+
error ("Invalid pattern: "..table.tostring(pattern, "nohash"))
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
function eq_pattern_element_builder (pattern, term, cfg)
|
|
160
|
+
local _, pat1, pat2 = unpack (pattern)
|
|
161
|
+
local ntmp_save = cfg.ntmp
|
|
162
|
+
pattern_element_builder (pat1, term, cfg)
|
|
163
|
+
cfg.ntmp = ntmp_save
|
|
164
|
+
pattern_element_builder (pat2, term, cfg)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
-- pattern :: `Op{ 'div', string, list{`Id string} or `Id{ string }}
|
|
168
|
+
-- term :: expr
|
|
169
|
+
function regexp_pattern_element_builder (pattern, term, cfg)
|
|
170
|
+
local op, regexp, sub_pattern = unpack(pattern)
|
|
171
|
+
|
|
172
|
+
-- Sanity checks --
|
|
173
|
+
assert (op=='div', "Don't know what to do with that op in a pattern")
|
|
174
|
+
assert (regexp.tag=="String",
|
|
175
|
+
"Left hand side operand for '/' in a pattern must be "..
|
|
176
|
+
"a literal string representing a regular expression")
|
|
177
|
+
if sub_pattern.tag=="Table" then
|
|
178
|
+
for x in ivalues(sub_pattern) do
|
|
179
|
+
assert (x.tag=="Id" or x.tag=='Dots',
|
|
180
|
+
"Right hand side operand for '/' in a pattern must be "..
|
|
181
|
+
"a list of identifiers")
|
|
182
|
+
end
|
|
183
|
+
else
|
|
184
|
+
assert (sub_pattern.tag=="Id",
|
|
185
|
+
"Right hand side operand for '/' in a pattern must be "..
|
|
186
|
+
"an identifier or a list of identifiers")
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
-- Regexp patterns can only match strings
|
|
190
|
+
acc_test (+{ type(-{term}) ~= 'string' }, cfg)
|
|
191
|
+
-- put all captures in a list
|
|
192
|
+
local capt_list = +{ { string.strmatch(-{term}, -{regexp}) } }
|
|
193
|
+
-- save them in a var_n for recursive decomposition
|
|
194
|
+
local v2 = next_tmpvar(cfg)
|
|
195
|
+
acc_stat (+{stat: local -{v2} = -{capt_list} }, cfg)
|
|
196
|
+
-- was capture successful?
|
|
197
|
+
acc_test (+{ not next (-{v2}) }, cfg)
|
|
198
|
+
pattern_element_builder (sub_pattern, v2, cfg)
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
-- pattern :: pattern and `Table{ }
|
|
202
|
+
-- term :: expr
|
|
203
|
+
function table_pattern_element_builder (pattern, term, cfg)
|
|
204
|
+
local seen_dots, len = false, 0
|
|
205
|
+
acc_test (+{ type( -{term} ) ~= "table" }, cfg)
|
|
206
|
+
for i = 1, #pattern do
|
|
207
|
+
local key, sub_pattern
|
|
208
|
+
if pattern[i].tag=="Pair" then -- Explicit key/value pair
|
|
209
|
+
key, sub_pattern = unpack (pattern[i])
|
|
210
|
+
assert (literal_tags[key.tag], "Invalid key")
|
|
211
|
+
else -- Implicit key
|
|
212
|
+
len, key, sub_pattern = len+1, `Number{ len+1 }, pattern[i]
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
-- '...' can only appear in final position
|
|
216
|
+
-- Could be fixed actually...
|
|
217
|
+
assert (not seen_dots, "Wrongly placed `...' ")
|
|
218
|
+
|
|
219
|
+
if sub_pattern.tag == "Id" then
|
|
220
|
+
-- Optimization: save a useless [ v(n+1)=v(n).key ]
|
|
221
|
+
id_pattern_element_builder (sub_pattern, `Index{ term, key }, cfg)
|
|
222
|
+
if sub_pattern[1] ~= "_" then
|
|
223
|
+
acc_test (+{ -{sub_pattern} == nil }, cfg)
|
|
224
|
+
end
|
|
225
|
+
elseif sub_pattern.tag == "Dots" then
|
|
226
|
+
-- Remember where the capture is, and thatt arity checking shouldn't occur
|
|
227
|
+
seen_dots = true
|
|
228
|
+
else
|
|
229
|
+
-- Business as usual:
|
|
230
|
+
local v2 = next_tmpvar(cfg)
|
|
231
|
+
acc_assign (v2, `Index{ term, key }, cfg)
|
|
232
|
+
pattern_element_builder (sub_pattern, v2, cfg)
|
|
233
|
+
-- TODO: restore ntmp?
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
if seen_dots then -- remember how to retrieve `...'
|
|
237
|
+
-- FIXME: check, but there might be cases where the variable -{term}
|
|
238
|
+
-- will be overridden in contrieved tables.
|
|
239
|
+
-- ==> save it now, and clean the setting statement if unused
|
|
240
|
+
if cfg.dots_replacement then cfg.dots_replacement = 'ambiguous'
|
|
241
|
+
else cfg.dots_replacement = +{ select (-{`Number{len}}, unpack(-{term})) } end
|
|
242
|
+
else -- Check arity
|
|
243
|
+
acc_test (+{ #-{term} ~= -{`Number{len}} }, cfg)
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
-- Jumps to [cfg.on_faliure] if pattern_seq doesn't match
|
|
248
|
+
-- term_seq.
|
|
249
|
+
function pattern_seq_builder (pattern_seq, term_seq, cfg)
|
|
250
|
+
if #pattern_seq ~= #term_seq then error ("Bad seq arity") end
|
|
251
|
+
cfg.locals = { } -- reset bound variables between alternatives
|
|
252
|
+
for i=1, #pattern_seq do
|
|
253
|
+
cfg.ntmp = 1 -- reset the tmp var generator
|
|
254
|
+
pattern_element_builder(pattern_seq[i], term_seq[i], cfg)
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
--------------------------------------------------
|
|
259
|
+
-- for each case i:
|
|
260
|
+
-- pattern_seq_builder_i:
|
|
261
|
+
-- * on failure, go to on_failure_i
|
|
262
|
+
-- * on success, go to on_success
|
|
263
|
+
-- label on_success:
|
|
264
|
+
-- block
|
|
265
|
+
-- goto after_success
|
|
266
|
+
-- label on_failure_i
|
|
267
|
+
--------------------------------------------------
|
|
268
|
+
function case_builder (case, term_seq, cfg)
|
|
269
|
+
local patterns_group, guard, block = unpack(case)
|
|
270
|
+
local on_success = mlp.gensym 'on_success' [1]
|
|
271
|
+
for i = 1, #patterns_group do
|
|
272
|
+
local pattern_seq = patterns_group[i]
|
|
273
|
+
cfg.on_failure = mlp.gensym 'match_fail' [1]
|
|
274
|
+
cfg.dots_replacement = false
|
|
275
|
+
pattern_seq_builder (pattern_seq, term_seq, cfg)
|
|
276
|
+
if i<#patterns_group then
|
|
277
|
+
acc_stat (`Goto{on_success}, cfg)
|
|
278
|
+
acc_stat (`Label{cfg.on_failure}, cfg)
|
|
279
|
+
end
|
|
280
|
+
end
|
|
281
|
+
acc_stat (`Label{on_success}, cfg)
|
|
282
|
+
if guard then acc_test (+{not -{guard}}, cfg) end
|
|
283
|
+
if cfg.dots_replacement then
|
|
284
|
+
replace_dots (block, cfg.dots_replacement)
|
|
285
|
+
end
|
|
286
|
+
block.tag = 'Do'
|
|
287
|
+
acc_stat (block, cfg)
|
|
288
|
+
acc_stat (`Goto{cfg.after_success}, cfg)
|
|
289
|
+
acc_stat (`Label{cfg.on_failure}, cfg)
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
function match_builder (x)
|
|
293
|
+
local term_seq, cases = unpack(x)
|
|
294
|
+
local cfg = {
|
|
295
|
+
code = `Do{ },
|
|
296
|
+
after_success = mlp.gensym "_after_success" }
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
-- Some sharing issues occur when modifying term_seq,
|
|
300
|
+
-- so it's replaced by a copy new_term_seq.
|
|
301
|
+
-- TODO: clean that up, and re-suppress the useless copies
|
|
302
|
+
-- (cf. remarks about capture bug below).
|
|
303
|
+
local new_term_seq = { }
|
|
304
|
+
|
|
305
|
+
local match_locals
|
|
306
|
+
|
|
307
|
+
-- Make sure that all tested terms are variables or literals
|
|
308
|
+
for i=1, #term_seq do
|
|
309
|
+
local t = term_seq[i]
|
|
310
|
+
-- Capture problem: the following would compile wrongly:
|
|
311
|
+
-- `match x with x -> end'
|
|
312
|
+
-- Temporary workaround: suppress the condition, so that
|
|
313
|
+
-- all external variables are copied into unique names.
|
|
314
|
+
--if t.tag ~= 'Id' and not literal_tags[t.tag] then
|
|
315
|
+
local v = mlp.gensym 'v'
|
|
316
|
+
if not match_locals then match_locals = `Local{ {v}, {t} } else
|
|
317
|
+
table.insert(match_locals[1], v)
|
|
318
|
+
table.insert(match_locals[2], t)
|
|
319
|
+
end
|
|
320
|
+
new_term_seq[i] = v
|
|
321
|
+
--end
|
|
322
|
+
end
|
|
323
|
+
term_seq = new_term_seq
|
|
324
|
+
|
|
325
|
+
if match_locals then acc_stat(match_locals, cfg) end
|
|
326
|
+
|
|
327
|
+
for i=1, #cases do
|
|
328
|
+
local case_cfg = {
|
|
329
|
+
after_success = cfg.after_success,
|
|
330
|
+
code = `Do{ }
|
|
331
|
+
-- locals = { } -- unnecessary, done by pattern_seq_builder
|
|
332
|
+
}
|
|
333
|
+
case_builder (cases[i], term_seq, case_cfg)
|
|
334
|
+
if next (case_cfg.locals) then
|
|
335
|
+
local case_locals = { }
|
|
336
|
+
table.insert (case_cfg.code, 1, `Local{ case_locals, { } })
|
|
337
|
+
for v in keys (case_cfg.locals) do
|
|
338
|
+
table.insert (case_locals, `Id{ v })
|
|
339
|
+
end
|
|
340
|
+
end
|
|
341
|
+
acc_stat(case_cfg.code, cfg)
|
|
342
|
+
end
|
|
343
|
+
acc_stat(+{error 'mismatch'}, cfg)
|
|
344
|
+
acc_stat(`Label{cfg.after_success}, cfg)
|
|
345
|
+
return cfg.code
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
----------------------------------------------------------------------
|
|
349
|
+
-- Syntactical front-end
|
|
350
|
+
----------------------------------------------------------------------
|
|
351
|
+
|
|
352
|
+
mlp.lexer:add{ "match", "with", "->" }
|
|
353
|
+
mlp.block.terminators:add "|"
|
|
354
|
+
|
|
355
|
+
match_cases_list_parser = gg.list{ name = "match cases list",
|
|
356
|
+
gg.sequence{ name = "match case",
|
|
357
|
+
gg.list{ name = "match case patterns list",
|
|
358
|
+
primary = mlp.expr_list,
|
|
359
|
+
separators = "|",
|
|
360
|
+
terminators = { "->", "if" } },
|
|
361
|
+
gg.onkeyword{ "if", mlp.expr, consume = true },
|
|
362
|
+
"->",
|
|
363
|
+
mlp.block },
|
|
364
|
+
separators = "|",
|
|
365
|
+
terminators = "end" }
|
|
366
|
+
|
|
367
|
+
mlp.stat:add{ name = "match statement",
|
|
368
|
+
"match",
|
|
369
|
+
mlp.expr_list,
|
|
370
|
+
"with", gg.optkeyword "|",
|
|
371
|
+
match_cases_list_parser,
|
|
372
|
+
"end",
|
|
373
|
+
builder = |x| match_builder{ x[1], x[3] } }
|
|
374
|
+
|