Lua 語法 |
|
Lua 參考手冊 中的「第 8 章 — Lua 的完整語法」[1] 提供了 Lua 5.1 延伸的巴科斯-諾爾語法(沒有運算符優先權)。有關優先權,請見 [第 2.5.6 章 — 優先權]。
這基本上與 [2] Lemon 格式相同,只不過允許使用引號字符串作為字元終端。請見下列第 1 清單。
原始的 C Lua 剖析器當然存在於 Lua 散佈的原始程式碼,但它是用 C 手寫,而且不易重複使用。
LpegRecipes 列出 Lua 中 Lua 5.1 詞法分析器和 LPeg 剖析器。
包含在 MetaLua 中的 mlp 剖析器可以剖析 Lua(以及具有語法延伸的 Lua),並將其轉換為 AST。mlp 建構在 gg 語法產生器的基礎上,可以搭配使用者定義的語法建構可延伸的剖析器。mlp 和 gg 完全使用 Lua 編寫,而且其詞法分析器是以 Yueliang(下列)為基礎。gg/mlp 用於例如 MetaLua 和 LuaToCee。
Cheese[3] 是一個剖析器產生器,使用剖析表達式語法(PEG)作為其說明形式,並使用 Lua 本身作為剖析器的說明語言。它包含一個剖析器,可以了解 Lua 5.1 的完整語法。(PEG 看似是早於 LPeg 的一種嘗試。)
LuaBalanced 提供了一些函式,可以比對字串中以分隔符分隔的 Lua 程式碼片段。它透過假設 Lua 程式碼語法正確,避免嚴謹地對 Lua 語法進行詞法分析和剖析(稍後可以用 loadstring
驗證)。
PenLight?僅提供一實作於 Lua 中的 Lua 詞法分析器 [4][5]。
[岳亮]實作了一款完全以 Lua 撰寫的 Lua 編譯器。它是 Lua C 程式碼的直接轉譯版本。
Parrot [6]包含一款編譯器,由 Perl5 撰寫,可將 Lua 5.1 編譯為 Parrot VM 位元碼(仍處於開發中)。其版本控制軟體庫也有提供網頁介面 [7]。
另請參閱相關計畫
那些 reimplementing Lua 的人可能會對 5.1 的測試套件 LuaList:2006-03/msg00716.html 和 5.0 的 LuaList:2005-12/msg00312.html 感興趣。
剖析2004 年 8 月,Rici Lake 在 lua 郵寄清單上公布了一款新的 Lua 5.0 剖析器,實作於 Lua 中:[LuaParse]。
[Lua2js]包含完整的 Lua 5.0 語法,是以 Gentle[8]編譯器建置套件完成。
lua-xgettext 工具包含一款 Haskell/Parsec 剖析器:LuaList:2006-10/msg00609.html
一款近乎完整的 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)
在 Java 中實作的 Lua 4 不完整解譯器:http://www.hetland.org/jlua/(失效連結)
[Lua-ml] 是在 OCaml 中實作的 Lua 2.5。剖析器是由某種 OCaml 剖析器產生器建構,包覆在某種文字編程系統中。
在 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 .