爲「木蘭」編程語言添加對中文命名標識符的支持

基於 @肖劍 的逆向工程(如很多人已經知道的, 當然是 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章