为Python添加中文关键字
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添加中文关键字的更多相关文章
- 为clang添加中文关键字
原址: https://zhuanlan.zhihu.com/p/31158537 以clang为基础做了一个与C++.C兼容中英文关键字的编译器 swizl/cnlang 原理就是加与英文关键字等效 ...
- Python中添加中文注释报错SyntaxError: Non-UTF-8 code starting with '\xc1'
问题:在文本编辑器中编辑Python文件时添加中文注释,运行python文件时报错.SyntaxError: Non-UTF-8 code starting with '\xc1' 解决方法:在文本开 ...
- python中super关键字的用法
http://python.jobbole.com/86787/ class A: def __init__(self): print "enter A" print ...
- python matplotlib 中文显示乱码设置
python matplotlib 中文显示乱码设置 原因:是matplotlib库中没有中文字体.1 解决方案:1.进入C:\Anaconda64\Lib\site-packages\matplot ...
- Python pytagcloud 中文分词 生成标签云 系列(一)
转载地址:https://zhuanlan.zhihu.com/p/20432734工具 Python 2.7 (前几天试了试 Scrapy 所以用的 py2 .血泪的教训告诉我们能用 py3 千万别 ...
- Windows server 2012 添加中文语言包(英文转为中文)(离线)
Windows server 2012 添加中文语言包(英文转为中文)(离线) 相关资料: 公司环境:亚马孙aws虚拟机 英文版Windows2012 中文SQL Server2012安装包,需要安装 ...
- python matplotlib 中文显示参数设置
python matplotlib 中文显示参数设置 方法一:每次编写代码时进行参数设置 #coding:utf-8import matplotlib.pyplot as pltplt.rcParam ...
- 让VS2010/VS2012添加新类时自动添加public关键字
在VS添加类别的时候,每次都需要添加public关键字,表示好麻烦. 但是可以避免这个麻烦的. 通过修改VS2010的ItemTemplate,可以避免这个麻烦. 修改方法如下: 1. 打开文件夹Mi ...
- python截取中文字符串
python的中文处理还是比较麻烦的,utf-8的字符串的长度是1-6个字符,一不小心就会从中截断,出现所谓的乱码.下面这个函数提供了,从一段utf-8编码的字符串中,截取固定长度的字串.ord(ch ...
随机推荐
- postgres 9.5 FDW变化
9.5主要是2个方法有变动: create_foreignscan_path extern ForeignPath *create_foreignscan_path(PlannerInfo *root ...
- 站在 Android 开发的角度,聊聊 Airbnb 的 Lottie!!!
一.前言 你有没有遇上一些设计师,对一些酷炫的动画着迷,喜欢根据场景设计出可爱而流畅的动画.但是在实际工作中,哪怕开发人员也觉得这些动画非常的棒,可我们知道,越是定制化的动画,实现起来将会越麻烦和耗时 ...
- Codeforces 821E Okabe and El Psy Kongroo
题意:我们现在位于(0,0)处,目标是走到(K,0)处.每一次我们都可以从(x,y)走到(x+1,y-1)或者(x+1,y)或者(x+1,y+1)三个位子之一.现在一共有N段线段,每条线段都是平行于X ...
- MySQL系列:基于binlog的增量订阅与消费(一)
在一些业务场景中,像在数据分析中我们有时候需要捕获数据变化(CDC):在数据审计中,我们也往往需要知道数据从这个点到另一个点的变化:同样在实时分析中,我们有时候需要看到某个值得实时变化等. 要解决以上 ...
- POJ 1251 Jungle Roads(最小生成树)
题意 有n个村子 输入n 然后n-1行先输入村子的序号和与该村子相连的村子数t 后面依次输入t组s和tt s为村子序号 tt为与当前村子的距离 求链接全部村子的最短路径 还是裸的最小生成树咯 ...
- hdu 2209 bfs+状压
http://acm.hdu.edu.cn/showproblem.php?pid=2209 不知为啥有种直觉.会出状压+搜索的题,刷几道先 简单的BFS.状压表示牌的状态, //#pragma co ...
- dma_alloc_coherent (建立一致性 DMA 映射函数)
1.函数申明 /** * dma_alloc_coherent - allocate consistent memory for DMA * @dev: valid struct device poi ...
- Ajax 请求后打开新窗口被拦截的解决方案
公司业务上有个场景,需请求后台获取支付链接地址,再打开地址引导用户购买.这样的场景在其他企业应该也很场景.但是遇到个很常见的问题,Ajax后直接用window.open(url),会被浏览器作为广告拦 ...
- 转:Natas Wargame Level28 Writeup(EBC加密破解)
From:http://alkalinesecurity.com/blog/ctf-writeups/natas-28-getting-it-wrong/ Now that I knew it was ...
- 记一次诡异的jetty问题
问题出现 用eclipse开发,用jetty跑某个项目时,如果是jsp页面,会出现以下错误. ------------------------------------------------ java ...
