Lua 语法

lua-users home
wiki

此页面列出了关于 Lua 的词法分析/解析/编译的各种资源。

OMeta 版 Lua 5.2/5.1 语法

[OMeta] 以 OMeta 语言编写的 Lua 5.1、Lua 5.2 语法,Lua 抽象语法模型(用于 AST 构建),AST 到源代码的转换器等。

JavaCC 版 Lua 5.2 语法

[Lua5.2.jj] JavaCC 的语法输入,用于基于 Java 的 Lua 解释器 [luaj 3.0]

Lua 版 Lua 5.2 解析器

[LuaMinify] 包含一个用 Lua 编写的 Lua 5.2 解析器,以及各种输出 AST 的方法。

JavaCC 版 Lua 5.1 语法

[Lua5.1.jj] JavaCC 的语法输入,用于基于 Java 的 Lua 解释器 [luaj 2.0]

Antlr 版 Lua 5.1 语法

列于 http://www.antlr3.org/grammar/list

Lua 参考手册中的 Lua 5.1 语法

Lua 参考手册》的“第 8 章 - Lua 的完整语法”[1] 提供了 Lua 5.1 的扩展 BNF 语法(不包含运算符优先级)。有关优先级,请参见 [第 2.5.6 章 - 优先级]

Lemon 格式的 Lua 5.1 语法

这本质上与 Lemon[2] 格式相同,只是它允许使用带引号的字符串作为字面终结符。参见下面的列表 1。

C 版 Lua 5.1/5.0 编译器

Lua 的原始 C 解析器当然存在于 Lua 发行版的源代码中,但它是手工编写的 C 代码,不易重用。

LPeg 版 Lua 5.1 词法分析器和解析器(Lua 实现)

LpegRecipes 列出了 Lua LPeg 中的 Lua 5.1 词法分析器和解析器。

Lua 版 Lua 5.1 解析器

mlp 解析器(包含在 MetaLua 中)可以解析 Lua(以及具有语法扩展的 Lua)并将其转换为 AST。mlp 基于 gg 语法生成器构建,后者可以构建具有用户定义语法的*可扩展*解析器。mlp 和 gg 完全用 Lua 编写,其词法分析器基于 Yueliang(见下文)。gg/mlp 例如用于 MetaLuaLuaToCee

Cheese[3] 是一个解析器生成器,它使用解析表达式语法 (PEG) 作为其描述形式,并使用 Lua 本身作为解析器的描述语言。它包含一个能够理解 Lua 5.1 完整语法的解析器。(PEG 似乎是一个早于 LPeg 的项目。)

LuaBalanced 提供了一些函数,用于匹配字符串中分隔的 Lua 代码片段。它通过假设 Lua 代码在语法上是正确的(稍后可以使用 loadstring 进行验证)来避免严格地进行词法分析和语法解析。

PenLight? 提供了一个仅包含词法分析器的 Lua 词法分析器 [4][5],用 Lua 实现。

Lua 版 Lua 5.1 编译器

[Yueliang] 用 Lua 实现了一个完整的 Lua 编译器。它是 Lua C 代码到 Lua 的一个相当直接的移植。

Parrot 版 Lua 5.1 编译器

Parrot [6] 包含一个用 Perl5 编写的编译器,它将 Lua 5.1 编译为 Parrot VM 字节码(尽管仍是进行中的项目)。还有一个指向子版本库的 Web 界面 [7]

另请参阅相关项目

Lua 5.1/5.0 测试套件

重写 Lua 的人可能对 5.1 的测试套件 LuaList:2006-03/msg00716.html 和 5.0 的测试套件 LuaList:2005-12/msg00312.html 感兴趣。

Lua 版 Lua 5.0 解析器 - LuaParse

2004 年 8 月,Rici Lake 在 lua 邮件列表中宣布了一个用 Lua 实现的新的 Lua 5.0 解析器:[LuaParse]

Gentle 版 Lua 5.0 语法

[Lua2js] 包含使用 Gentle[8] 编译器构建工具套件完成的 Lua 5.0 的完整语法。

Haskell/Parsec 版 Lua 5.0 解析器

lua-xgettext 工具包含一个 Haskell/Parsec 版解析器:LuaList:2006-10/msg00609.html

C++ Spirit 版 Lua 5.0 解析器

一个基本完整的 Lua 5.0 C++ 解析器,使用了 Boost 中的 Spirit:http://article.gmane.org/gmane.comp.parsers.spirit.general/4846

这似乎是一个不错的起点,可以在那些需要 C++ 版 Lua 解释器的项目中使用。作者已放弃此项目,以上是截至 2004 年 2 月的最新版本。2005 年 2 月,我仔细研究了此语法以尝试使用它。它存在一些问题:

最后一点对我来说是决定性的。因此,我未能使 Spirit 正确解析 Lua。

-- Asger Ottar Alstrup (aalstrup at laerdal.dk)

我为 SZARP SCADA 系统编写了另一个 spirit 解析器。它主要针对简单的用例进行了测试,在这种情况下,我们可以绕过实际的 Lua 而无需 VM 来执行语句,但总的来说,它似乎运行良好。它不应该存在上述缺陷,并且使用了最新的 spirit API。由于它是更大系统的一部分,可能初次使用会有点困难,但其依赖项相对较少。

解析器文件可以在这里找到:http://szarp.git.sourceforge.net/git/gitweb.cgi?p=szarp/szarp;a=tree;f=libSzarp2;hb=master 它被分成四个文件:include/lua_syntax.h 和 szbase/lua_parser.cc, szbase/lua_parser_extra.cc, szbase/lua_parser_extra.h

如有任何疑问,请给我发电子邮件:Darek Marcinkiewicz (reksio at newterm.pl)

re2c 版 Lua 5.0 词法分析器

词法分析

Lua 4.1 语法

已移至 LuaFourOneGrammar

Java 版 Lua 4 解释器 - JLua

用 Java 实现的不完整的 Lua 4 解释器:http://www.hetland.org/jlua/ (链接已失效)

OCaml 版 Lua 2.5 解释器 - Lua-ml

[Lua-ml] 是用 OCaml 实现的 Lua 2.5。解析器是用某个 OCaml 解析器生成器构建的,并包含在某种文档编程系统中。

列表 1

Lemon 格式的 Lua 5.1 语法 --RiciLake [在 LJS 中实现]

%fallback  OPEN '(' .

chunk      ::= block .

semi       ::= ';' .
semi       ::= .

block      ::= scope statlist .
block      ::= scope statlist laststat semi .
ublock     ::= block 'until' exp .

scope      ::= .
scope      ::= scope statlist binding semi.
           
statlist   ::= .
statlist   ::= statlist stat semi .

stat       ::= 'do' block 'end' .
stat       ::= 'while' exp 'do' block 'end' .
stat       ::= repetition 'do' block 'end' .
stat       ::= 'repeat' ublock .
stat       ::= 'if' conds 'end' .
stat       ::= 'function' funcname funcbody .
stat       ::= setlist '=' explist1 .
stat       ::= functioncall .

repetition ::= 'for' NAME '=' explist23 .
repetition ::= 'for' namelist 'in' explist1 .
           
conds      ::= condlist .
conds      ::= condlist 'else' block .
condlist   ::= cond .
condlist   ::= condlist 'elseif' cond .
cond       ::= exp 'then' block .
           
laststat   ::= 'break' .
laststat   ::= 'return' .
laststat   ::= 'return' explist1 .

binding    ::= 'local' namelist .
binding    ::= 'local' namelist '=' explist1 .
binding    ::= 'local' 'function' NAME funcbody .

funcname   ::= dottedname .
funcname   ::= dottedname ':' NAME .

dottedname ::= NAME .
dottedname ::= dottedname '.' NAME .

namelist   ::= NAME .
namelist   ::= namelist ',' NAME .

explist1   ::= exp .
explist1   ::= explist1 ',' exp .
explist23  ::= exp ',' exp .
explist23  ::= exp ',' exp ',' exp .

%left      'or' .
%left      'and' .
%left      '<' '<=' '>' '>=' '==' '~=' .
%right     '..' .
%left      '+' '-' .
%left      '*' '/' '%' .
%right     'not' '#' .
%right     '^' .

exp        ::= 'nil'|'true'|'false'|NUMBER|STRING|'...' .
exp        ::= function .
exp        ::= prefixexp .
exp        ::= tableconstructor .
exp        ::= 'not'|'#'|'-' exp .         ['not']
exp        ::= exp 'or' exp .
exp        ::= exp 'and' exp .
exp        ::= exp '<'|'<='|'>'|'>='|'=='|'~=' exp .
exp        ::= exp '..' exp .
exp        ::= exp '+'|'-' exp .
exp        ::= exp '*'|'/'|'%' exp .
exp        ::= exp '^' exp .
           
setlist    ::= var .
setlist    ::= setlist ',' var .

var        ::= NAME .
var        ::= prefixexp '[' exp ']' .
var        ::= prefixexp '.' NAME .

prefixexp  ::= var .
prefixexp  ::= functioncall .
prefixexp  ::= OPEN exp ')' .

functioncall ::= prefixexp args .
functioncall ::= prefixexp ':' NAME args .

args        ::= '(' ')' .
args        ::= '(' explist1 ')' .
args        ::= tableconstructor .
args        ::= STRING .

function    ::= 'function' funcbody .

funcbody    ::= params block 'end' .

params      ::= '(' parlist ')' .

parlist     ::= .
parlist     ::= namelist .
parlist     ::= '...' .
parlist     ::= namelist ',' '...' .

tableconstructor ::= '{' '}' .
tableconstructor ::= '{' fieldlist '}' .
tableconstructor ::= '{' fieldlist ','|';' '}' .

fieldlist   ::= field .
fieldlist   ::= fieldlist ','|';' field .
            
field       ::= exp .
field       ::= NAME '=' exp .
field       ::= '[' exp ']' '=' exp .

RecentChanges · preferences
编辑 · 历史
最后编辑于 2023 年 8 月 14 日下午 5:20 GMT (差异)