用 python 寫的 BBS-Lua 模擬器

Posted by tjwei on 星期三, 1月 23, 2008 with No comments

這一陣子,PTT2 上piaip 發展的 BBS-Lua 開始慢慢流行起來,也就在 BBS 文章中寫小程式的新功能。我不會 Lua,但是覺得挺有趣的,原本打算寫個在 web browser 上的 Lua 解譯器玩玩,那時一方面還不知道有個叫做 JS/CC的東西,另一方面,要在 browser 上模擬文字終端機又要花另外一層功夫,所以打算先用 python 寫,然後看看能不能用 pyjamas 轉成 javascript。
因為這個目的,所以選擇使用 PLT。果然也挺好用的,參考了 Lua 的 Reference Manual,就在完全沒寫過 Lua 程式的情形下,完成了這個模擬器。
說這個模擬器有什麼用,還真沒什麼用,不過就是有趣而已。

困難點
語法的部份還簡單,plt 配上 reference Manual 上的 BNF,大致上就是搬過來。語意上的部份就麻煩了,畢竟像前面說的,我其實沒有寫過 Lua 程式。結果裡面有很多小麻煩,比方 lua 的 table 結構, anonymous function、所有的數字都是浮點數、scope 。此外我對於 metatable 的語意也不太了解,更麻煩的是多變數參數的傳遞和設定。
為了解決這些問題,所以額外的在 python 中模擬出 table 這個 class 和 anonymous function 的方法,雖然都還不完整。
真的要完整,應該要另外再寫個多變數的 class,翻譯出來的程式碼才會比較好看。
現在雖然程式可以跑,但很多地方我也只是弄成讓程式可以跑而已。

使用方式
下載 pylua.tgz 。解開之後,直接利用 python (2.5)執行。
比方要跑 test3.lua,就執行
python plmain.py test3.lua
就可以了,然後會自動產生 test3.lua.py 這個翻譯過之後的程式碼。
翻譯程式碼的功能的功能本身與系統無關,但模擬 bbsL 的功能需要你的終端機支援 VT100/ ANSI color。而 getch 功能則需要 termios,這個是 unix-like 系統下才會有的。
我的發展環境是 cygwin,所以 cygwin 下跑是沒有問題的。
不是每個程式都能跑,但至少 BBS-Lua 上的第一個知名大作「貪食蛇」是可以順利模擬成功。
此外打字練習、一些動畫也能成功。部份受歡迎的遊戲如打磚塊,則需要簡單的 patch (兩行而已)。一些 3D 程式和炸彈超人可以某種程度的進入,但是無法真的 in game。

README
PyLua 這是一個簡單 Lua -> Python 的翻譯器和模擬器
主要是模擬一些 ptt2 的 BBS LUA (由 piaip 設計的)
這個模擬器沒有太多實際用途,而且也很不完整,只是練習寫的程式
( test?.lua 幾乎都比 pylua.py+plmain.py 還要大)

執行方式:
python plmain.py test3.lua
接著,就會執行 test3.lua 並且產生 test3.lua.py 。
以後可以直接 python test3.lua.py
.lua 的編碼是 utf-8,產生的 .py 編碼是 big5(因為我的終端機是 big5的)。
測試環境是 cygwin,理論上, linux 上應該也可以跑。
要改變編碼的話,請修改 plmain.py。

檔案分成:

plmain.py 主程式
pylua.py Lua Parser
bbsL.py stringL.py tableL.py mathL.py 簡單的程式庫模擬

yacc.py 這兩個檔案是 David Beazley 的 Ply
lex.py PyLau 的 Parser 是利用 Ply 建立的

測試範例
test1.lua Tm Calculations for Oligos 作者: phyton
test2.lua 打字練習 作者: realkillman
test3.lua 貪食蛇 作者: piaip
test4.lua 打磚塊 作者: phyton
(修改 math.modf(x)+1 成math.modf(x)[0]+1)
test5.lua 打字練習 作者: Feis
test6.lua 炸彈超人 作者: icespiritual
test7.lua 3D物體顯像 作者: realkillman
test8.lua 搬數字 作者: hrs113355 (兩個簡單修改)
test9.lua 小方格點螢幕 作者: phyton

test 1,2,3,5,9 成功。
test 4,8 需要簡單修改一兩行 source。
test 6,7 失敗,一些小問題可以簡單排除,但是還有一些比較麻煩的問題。
Categories: