python可以改成中文吗_为Python添加中文关键字

本文详细介绍了如何将Python的语法和内置函数进行中文本地化。首先,通过修改Grammar文件并使用pgen生成器添加同义中文token。接着,对Python的ast.c文件进行辅助解析,实现复杂语法的汉化。最后,说明了在bltinmodule.c中添加中文内置函数的方法。整个过程涉及源代码修改和重新编译。
摘要由CSDN通过智能技术生成

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格式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值