为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 ...
随机推荐
- XSS攻击原理及防御措施
概述 XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器 执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列 表,然后向联系 ...
- Etcd全套安装教程
一.安装 1.1 二进制安装 从这里下载: etcd-v3.2.11-linux-amd64.tar.gz 下载包后解压即可运行: # 解压 tar zxvf etcd-v3.2.11-linux-a ...
- jQuery选取所有复选框被选中的值并用Ajax异步提交数据
昨天和朋友做一个后台管理系统项目的时候涉及到复选框批量操作,如果用submit表单提交挺方便的,但是要实现用jQuery结合Ajax异步提交数据就有点麻烦了,因为我之前做过的项目中基本上没用Ajax来 ...
- Zepto中的Swipe事件失效
需要阻止浏览器默认滑动的事件 document.addEventListener('touchmove', function (event) { event.preventDefault(); }, ...
- 40.Linux应用调试-使用gdb和gdbserver
1.gdb和gdbserver调试原理 通过linux虚拟机里的gdb,来向开发板里的gdbserver发送命令,比如设置断点,运行setp等,然后开发板上的gdbserver收到命令后,便会执行应用 ...
- 【Win 10 应用开发】MIDI 音乐合成——音符消息篇
在上一篇中,老周介绍了一些乐理知识,有了那些常识后,进行 MIDI 编程就简单得多了.尽管微软已经把 API 封装好,用起来也很简单,但是,如果你没有相应的音乐知识基础,你是无法进行 MIDI 编程的 ...
- Replace Pioneer
Replace Pioneer(官网:http://www.mind-pioneer.com)是一款专业的文本批量处理软件.仅仅要给定不论什么纯文本文件或文件列表.仅仅要准确设置转换规则.就能得到不论 ...
- 零基础学python-2.8 字典
字典类型,事实上就是相当于java的map,通过key-value来记录数据,工作原理类似于哈希表 差点儿全部的python对象都能够作为key,可是一般最经常使用的还是数字和字符串 字典元素使用{} ...
- javascript跳跃式前进(3) - 跳入JSON
前言 JSON崛起不是意外,是顺应时代;相当简洁小巧的书写模式及阅读方式; 基础 看这篇文章: JSON知识点汇总_W3SCHOOL 初步进阶 早期的解析仅仅实用eval() ,可是这货太easy给注 ...
- poj - 1185 炮兵阵地 状压DP 解题报告
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21553 Accepted: 8363 Description ...