Lua 語法

lua-users home
指南

此頁面列舉了各種有關 Lua 的詞法分析/剖析/編譯資源。

OMeta 的 Lua 5.2/5.1 語法

[OMeta] Lua 5.1、Lua 5.2 的 OMeta 語言語法,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 5.1 語法

Lua 參考手冊 中的「第 8 章 — Lua 的完整語法」[1] 提供了 Lua 5.1 延伸的巴科斯-諾爾語法(沒有運算符優先權)。有關優先權,請見 [第 2.5.6 章 — 優先權]

Lemon 格式的 Lua 5.1 語法

這基本上與 [2] Lemon 格式相同,只不過允許使用引號字符串作為字元終端。請見下列第 1 清單。

C 中的 Lua 5.1/5.0 編譯器

原始的 C Lua 剖析器當然存在於 Lua 散佈的原始程式碼,但它是用 C 手寫,而且不易重複使用。

Lua 中 LPeg 的 Lua 5.1 詞法分析器和剖析器

LpegRecipes 列出 Lua 中 Lua 5.1 詞法分析器和 LPeg 剖析器。

Lua 中的 Lua 5.1 剖析器

包含在 MetaLua 中的 mlp 剖析器可以剖析 Lua(以及具有語法延伸的 Lua),並將其轉換為 AST。mlp 建構在 gg 語法產生器的基礎上,可以搭配使用者定義的語法建構可延伸的剖析器。mlp 和 gg 完全使用 Lua 編寫,而且其詞法分析器是以 Yueliang(下列)為基礎。gg/mlp 用於例如 MetaLuaLuaToCee

Cheese[3] 是一個剖析器產生器,使用剖析表達式語法(PEG)作為其說明形式,並使用 Lua 本身作為剖析器的說明語言。它包含一個剖析器,可以了解 Lua 5.1 的完整語法。(PEG 看似是早於 LPeg 的一種嘗試。)

LuaBalanced 提供了一些函式,可以比對字串中以分隔符分隔的 Lua 程式碼片段。它透過假設 Lua 程式碼語法正確,避免嚴謹地對 Lua 語法進行詞法分析和剖析(稍後可以用 loadstring 驗證)。

PenLight?僅提供一實作於 Lua 中的 Lua 詞法分析器 [4][5]

Lua 5.1 編譯器實作於 Lua 中

[岳亮]實作了一款完全以 Lua 撰寫的 Lua 編譯器。它是 Lua C 程式碼的直接轉譯版本。

Lua 5.1 編譯器實作於 Parrot 中

Parrot [6]包含一款編譯器,由 Perl5 撰寫,可將 Lua 5.1 編譯為 Parrot VM 位元碼(仍處於開發中)。其版本控制軟體庫也有提供網頁介面 [7]

另請參閱相關計畫

Lua 5.1/5.0 測試套件

那些 reimplementing Lua 的人可能會對 5.1 的測試套件 LuaList:2006-03/msg00716.html 和 5.0 的 LuaList:2005-12/msg00312.html 感興趣。

Lua 5.0 - Lua 中的剖析器剖析

2004 年 8 月,Rici Lake 在 lua 郵寄清單上公布了一款新的 Lua 5.0 剖析器,實作於 Lua 中:[LuaParse]

Gentle 中的 Lua 5.0 語法

[Lua2js]包含完整的 Lua 5.0 語法,是以 Gentle[8]編譯器建置套件完成。

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 · 設定
編輯 · 歷史
於 2023 年 8 月 15 日凌晨 11:20 最後編輯(GMT (diff)