狗屎咖啡

2 个月前
原址: https://zhuanlan.zhihu.com/p/31159526

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

为Python添加中文关键字的更多相关文章

  1. 为clang添加中文关键字

    原址: https://zhuanlan.zhihu.com/p/31158537 以clang为基础做了一个与C++.C兼容中英文关键字的编译器 swizl/cnlang 原理就是加与英文关键字等效 ...

  2. Python中添加中文注释报错SyntaxError: Non-UTF-8 code starting with '\xc1'

    问题:在文本编辑器中编辑Python文件时添加中文注释,运行python文件时报错.SyntaxError: Non-UTF-8 code starting with '\xc1' 解决方法:在文本开 ...

  3. python中super关键字的用法

    http://python.jobbole.com/86787/ class A: def __init__(self):    print "enter A"    print ...

  4. python matplotlib 中文显示乱码设置

    python matplotlib 中文显示乱码设置 原因:是matplotlib库中没有中文字体.1 解决方案:1.进入C:\Anaconda64\Lib\site-packages\matplot ...

  5. Python pytagcloud 中文分词 生成标签云 系列(一)

    转载地址:https://zhuanlan.zhihu.com/p/20432734工具 Python 2.7 (前几天试了试 Scrapy 所以用的 py2 .血泪的教训告诉我们能用 py3 千万别 ...

  6. Windows server 2012 添加中文语言包(英文转为中文)(离线)

    Windows server 2012 添加中文语言包(英文转为中文)(离线) 相关资料: 公司环境:亚马孙aws虚拟机 英文版Windows2012 中文SQL Server2012安装包,需要安装 ...

  7. python matplotlib 中文显示参数设置

    python matplotlib 中文显示参数设置 方法一:每次编写代码时进行参数设置 #coding:utf-8import matplotlib.pyplot as pltplt.rcParam ...

  8. 让VS2010/VS2012添加新类时自动添加public关键字

    在VS添加类别的时候,每次都需要添加public关键字,表示好麻烦. 但是可以避免这个麻烦的. 通过修改VS2010的ItemTemplate,可以避免这个麻烦. 修改方法如下: 1. 打开文件夹Mi ...

  9. python截取中文字符串

    python的中文处理还是比较麻烦的,utf-8的字符串的长度是1-6个字符,一不小心就会从中截断,出现所谓的乱码.下面这个函数提供了,从一段utf-8编码的字符串中,截取固定长度的字串.ord(ch ...

随机推荐

  1. MySql基础入门-mysql的结构层次

    了解MySql必须牢牢记住其体系结构图,Mysql是由SQL接口,解析器,优化器,缓存,存储引擎组成的. 1.Connectors指的是不同语言中与SQL的交互 2.Management Servei ...

  2. ChromeExtension那些事儿

    Chrome Extension是什么呢? 简而言之,就是Chrome扩展,它是基于Chrome浏览器的,我们可以理解它为一个独立运行在Chrome浏览器下的APP,当然核心编程语言就是JavaScr ...

  3. SpringMVC+Mybatis架构中的问题记录

    2014/08/16 记录 今天遇到个问题.折腾了我大约4个小时,好坑啊由于之前没遇到过 我的包是这么分的:com.project名.模块名.service.impl     在spring 配置这个 ...

  4. 【SICP练习】151 练习4.7

    练习4-7 原文 Exercise 4.7. Let* is similar to let, except that the bindings of the let variables are per ...

  5. 第一次面试&第一次霸面

    哈哈哈哈,第一次面试和第一次都献给了CVTE! CVTE的招聘流程有点特别:网測-- 一面--笔试--二面--offer 想起网測那天就心酸.那先在做第三部分的专业測试.计时器突然出错........ ...

  6. 有关JS控制时间的几个小Demo

    一.Document自带的定时和延时方法:  循环运行:var timeid = window.setInterval("方法名或方法"."延时");windo ...

  7. 《RabbitMQ Tutorial》译文 第 6 章 远程过程调用(RPC)

    原文来自 RabbitMQ 英文官网的教程(6.Remote procedure call - RPC),其示例代码采用了 .NET C# 语言. In the second tutorial we ...

  8. 《跟我学IDEA》四、配置模板(提高代码编写效率)

    上一篇博文,我们学习了idea的一些实用配置,相信大家也对idea这个开发工具有了一个大概的了解.今天我们来学习模板的配置,idea提供很多模板从而提高编写代码的效率,比如说一些经常用的代码及生成文件 ...

  9. MPSOC之9——host、embeded间tftp、nfs、ftp环境搭建

    tftp 可传输单个文件,不能传文件夹 需要通过命令传输文件,略显复杂 ==一般调试kernel时,用uboot通过tftp方式启动,不用每次都烧写存储介质== nfs 在host linux(ubu ...

  10. Django的Models(二)映射关系

    关系分为三种: 一对一 :user2 = models.OneToOneField("UserInfo") 一对多:user = models.ForeignKey("U ...