为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格式。
2017-11-17
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
为clang添加中文关键字
知乎原文地址 作者:@狗屎咖啡 以clang为基础做了一个与C++、C兼容中英文关键字的编译器 swizl/cnlang 原理就是加与英文关键字等效的中文关键字 在/include/clang/Basic/TokenKinds.def 中 用ALIAS添加中文关键字 例如 KEYWORD(char, KEYALL) ALIAS("字", char, KEYALL) 在 /lib/Basic/IdentifierTable.cpp 中 加个头文件 #include "llvm/ADT/StringSwitch.h" 在 tok::PPKeywordKind IdentifierInfo::getPPKeywordID() const 里 用 llvm::StringSwitch 添加 中文宏 例如 //default: return tok::pp_not_keyword; default: return llvm::StringSwitch<tok::PPKeywordKind>(Name) .Case("如", tok::pp_if) .Case("定义", tok::p...
- 下一篇
如何使GCC支持中文(utf-8)的变量名、函数名?
知乎原文地址 作者:@狗屎咖啡 目前VS 和Clang都是支持utf-8的变量名、函数名,但 GCC不支持。 有人提意见,提了好几年了:UTF-8 support for identifier names in GCC GCC并没有解决,但官方给了一个解决方案:FAQ - GCC Wiki 就是用这样一条脚本语句转换一下源文件 perl -pe 'BEGIN { binmode STDIN, ":utf8"; } s/(.)/ord($1) < 128 ? $1 : sprintf("\\U%08x", ord($1))/ge;' 这条语句的意思是将源文件按utf-8读取出来,大于128的unicode(不在ASCII里)都用16进制的Uxxxxxxxx的格式替代。 这种格式叫UCN。 实际上gcc内部还是将UCN转换成utf-8字符串,再加到符号表。却不支持原生的UTF-8符号,这个就有点搞笑了。 虽然有人会说,C、C++的标准里没有对UTF-8符号的支持,GCC不支持UTF-8符号是符合标准的。但是GCC从来就不是死守标准的乖宝宝对吧,加了不少扩展了。为啥这个不能扩展一下呢?...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- MySQL8.0.19开启GTID主从同步CentOS8
- Hadoop3单机部署,实现最简伪集群
- Docker安装Oracle12C,快速搭建Oracle学习环境