日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

2017-11-17 为Python添加中文关键字

發布時間:2024/4/17 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2017-11-17 为Python添加中文关键字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

知乎原文地址 作者:@狗屎咖啡

swizl/cnpython

1.大部分語法,可以按下面方法加同義的中文token
第1步. 編譯pgen
cd到python的源代碼目錄下,

./configure make Parser/pgen

第2步. 修改 ./Grammar/Grammar,添加同義詞并生成語法代碼。

以while,else為例
原文:

while_stmt: 'while' test ':' suite ['else' ':' suite]

改為:

while_stmt: ('while'|當) test ':' suite [('else'|另) ':' suite]

保存 ./Grammar/Grammar為UTF-8格式

執行

./Parser/pgen ./Grammar/Grammar ./Include/graminit.h ./Python/graminit.c

雖然會提示錯誤,但輸出是有效正確的。

其實pgen不支持UTF-8,這里 中文名 不需要用單引號或雙引號,利用pgen的容錯性,減少工作量。

2.還有一較復雜語法在/Python/ast.c 里有輔助解析

例如

comp_op: ... |'in'|'not' 'in'|'is'|'is' 'not'

改為

comp_op: ... |('in'|在)|('not' 'in'|不在)|('is'|為)|('is' 'not'|不為)

在ast.c里的 ast_for_comp_op 中

if (NCH(n) == 1)switch (TYPE(n))case NAME: /******添加如下代碼*******/if (strcmp(STR(n), "在") == 0) return In;if (strcmp(STR(n), "不在") == 0) return NotIn;if (strcmp(STR(n), "為") == 0) return Is;if (strcmp(STR(n), "不為") == 0) return IsNot;

其實從源代碼我們可以看出來,comp_op原來的判斷是token有兩個單詞的話,第二個單詞為in返回NotIn,第一個單詞為is返回IsNot。

另外就是 None,True,False,finally,async,await 需要添加一下。

3.內置函數 中文化

在/Python/bltinmodule.c中的builtin_methods[]中添加

以print為例,將含"print"的一行復制粘貼,替換第二行的"print"為"打印"即可

{"print", (PyCFunction)builtin_print, METH_FASTCALL | METH_KEYWORDS, print_doc},{"打印", (PyCFunction)builtin_print, METH_FASTCALL | METH_KEYWORDS, print_doc},

其他的還有一些宏,展開看一下,就明白了。

BUILTIN_LEN_METHODDEF{"長", (PyCFunction)builtin_len, METH_O, builtin_len__doc__},

之后 make 編譯python即可。

中文的py文件也需要保存為UTF-8格式。

總結

以上是生活随笔為你收集整理的2017-11-17 为Python添加中文关键字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。