Lua 5.4 · Powered by JavaScript

在浏览器里运行 Lua

一个用纯 JavaScript 从零实现的 Lua 解释器:词法分析、语法树、元表、协程、模式匹配, 不需要后端,也不需要安装任何东西。打开页面,写代码,按 Ctrl + Enter。

零依赖 完全离线 元表 / 协程 Lua 模式匹配
main.lua
Ctrl/⌘ + Enter 运行 · Tab 缩进 0 行
READY
点击「运行」或按 Ctrl/⌘ + Enter 执行代码。print 的输出会显示在这里。
就绪 用时 — 步数 — 纯 JavaScript · 无网络请求
🧩

完整核心语法

变量、闭包与 upvalue、可变参数、多返回值、goto/label、<const>、数值与泛型 for,语法覆盖 Lua 5.4 的主要部分。

🧱

元表与面向对象

__index、__newindex、__call、__add、__tostring、__eq 等元方法齐全,可以直接写 class、继承和运算符重载。

🔁

真正的协程

求值器基于 JavaScript generator 构建,coroutine.yield 可以跨越嵌套函数、pcall、table.sort、gsub 回调挂起和恢复。

🔤

Lua 模式匹配

独立实现的 Lua pattern 引擎:字符类、集合、捕获、位置捕获、反向引用、%b 平衡匹配与 %f 边界,不是简单替换成正则。

已实现的标准库

  • base print, type, tostring, tonumber, ipairs, pairs, next, select, assert, error, pcall, xpcall, load, rawget/rawset, setmetatable/getmetatable
  • string len, sub, byte, char, rep, reverse, upper, lower, format, find, match, gmatch, gsub
  • table insert, remove, concat, sort, unpack, pack, move
  • math abs, ceil, floor, sqrt, fmod, modf, max, min, random, randomseed, tointeger, type, 三角函数与常量
  • coroutine create, resume, yield, status, wrap, running, isyieldable, close
  • os / io / utf8 os.time, os.date, os.clock, os.difftime;io.write, io.read;utf8.char, utf8.len, utf8.codepoint, utf8.codes
  • debug traceback, getmetatable, setmetatable

实现说明与差异

整个解释器约 4000 行 JavaScript,分为词法分析、递归下降解析器、树遍历求值器和标准库四层。协程直接复用 JS generator,因此 yield 可以穿过任意深度的 Lua 调用。

项目说明
数字统一使用双精度浮点,没有独立的 64 位整数子类型;2/1 显示为 2 而非 2.0,超出 253 的整数会损失精度;位运算通过 BigInt 模拟 64 位
字符串按 UTF-16 索引,中文按字符处理,string.char 接受 Unicode 码点;Lua 原生按字节索引,string.char 只接受 0–255
文件 IO浏览器不提供文件系统,io.read 从页面的「标准输入」读取,io.write 写入输出面板
模块没有 require / package;可用 load 动态执行代码
递归普通递归受 JavaScript 调用栈限制,约 200 层;尾调用 return f(...) 会复用栈帧,可无限递归
其他不支持 <close>、__gc、string.pack;goto 不做局部变量作用域的静态检查

小技巧

print 会用制表符分隔多个值;表和函数默认显示地址。
用 string.format("%q", s) 查看字符串的转义形式。
按下「分享」会把代码放进 URL hash,发给别人打开即可看到同一段代码。
死循环会被自动中断:默认上限约 300 万步 / 5 秒。

评论与讨论

评论保存在 GitHub Issues,登录 GitHub 后即可参与讨论。

评论暂未开放,站点管理员尚未配置 GitHub OAuth。

前往 GitHub Issues