基於 @肖劍 的逆向工程(如很多人已經知道的, 當然是 Python 代碼, 很不錯, 嗯).
開始對「木蘭」編程語言進行分析。首先打算摸索它的基本功能。前文戳破針對「木蘭」編程語言的拙劣謠言已經進行了少量代碼測試.
但, 可惜木蘭尚未支持中文命名標識符, 打算先改進一下, 以便編寫更易維護的測試代碼. 測試代碼打算先在逆向工程中運行(主力機器是 Mac),待基本確定範圍後,再在 exe 中確認一遍。
運行 ulang-0.2.2.exe 後, 如果輸入下面代碼:
年 = year()
會報錯LexingError
.
在我 fork 出的逆向工程中運行python -m ulang
可以啓動同樣的交互環境 ulang’s REPL. 但同樣的代碼報錯不同, 似乎信息更多一些:
> 年 = year()
SyntaxError: File "<STDIN>", line 1:1, unknown token is found here
年 = year()
^
回頭可以研究一下報錯機制, 爲何 exe 和逆向的不同.
早先回答時猜想是由於"實現的前端在詞法分析這步攔住了"中文命名, 於是查看逆向代碼中, 果然看到parser/lexer.py
中關於標識符的正則表達規則中, 只允許英文/數字/下劃線:
lg.add('IDENTIFIER', '\\$?[_a-zA-Z][_a-zA-Z0-9]*')
接下去就熟門熟路, 添加上中文字符的 unicode 範圍:
lg.add('IDENTIFIER', '\\$?[_a-zA-Z\u4e00-\u9fa5][_a-zA-Z0-9\u4e00-\u9fa5]*')
再從逆向工程中運行:
$ python3 -m ulang
Welcome to ulang's REPL..
Type 'help' for more informations.
> 年 = year()
> 年
2020
嗯, 告別過去, 不錯的第一步.
逆向工程地址: https://github.com/MulanRevive/mulan