内容简介:Python 3.9.0 已发布一月有余。作为 Python 汉化版,草蟒当然会及时跟进。 Python 新版本的最大变化之一是用基于 PEG 的新解析器替代了原来的 LL(1)。据称新解析器的性能与旧解析器大致相当,但 PEG 在设计新语言...
Python 3.9.0 已发布一月有余。作为 Python 汉化版,草蟒当然会及时跟进。
Python 新版本的最大变化之一是用基于 PEG 的新解析器替代了原来的 LL(1)。据称新解析器的性能与旧解析器大致相当,但 PEG 在设计新语言特性时的形式化比 LL(1) 更灵活,Python 3.10 及之后版本将开始使用这种灵活性。
由于采用了新解析器,关键字(保留字)的添加(汉化)自然与之前的版本有所不同。下面是详细步骤和踩坑记录。
老吴使用的系统和工具:Windows 10,Windows Terminal(非必需,但强烈推荐使用),Visual Studio 2019 免费版,WSL + gcc 10.1。
- 从 Python 官方网站下载 3.9.0 版本源代码。
- 打开 Windows Terminal,在 PowerShell 中 cd 到 PCbuild 目录。按照 ./PCbuild/readme.txt 中的说明,首先运行 build.bat。正式 build 之前会下载所需的外部依赖,源代码目录会多出一个文件夹 externals. 结果是成功 build 出一个 32 位 python.exe。
- 打开 /Grammar/python.gram 文件,添加中文保留字。作为试验,笔者仅添加了一个保留字 '函',对应英文的 'def'。语法文件中有三个出现 'def' 的地方需要添加 '函'。
| &('def' | '函' | '@' | ASYNC) function_def ...... | ('def' | '函') n=NAME '(' params=[params] ')' a=['->' z=expression { z }] ':' tc=[func_type_comment] b=block { ...... | ASYNC ('def' | '函') n=NAME '(' params=[params] ')' a=['->' z=expression { z }] ':' tc=[func_type_comment] b=block {
- 从 Windows Terminal 打开 WSL,cd 到源代码目录,运行 ./configure。
- 按照 Changing CPython's Grammar 第 24 节的说明,在 WSL 中运行 make regen-pgen 以生成 Parser/parser.c。这里出现了第一个坑,提示不认识 ':=' 这个符号。这是海象运算符,Python 3.8 才引入的,我的 WSL 默认 python3 版本较低,所以需要给这个 make 命令加一个参数 PYTHON_FOR_REGEN=python3.8(这个参数值依具体情况而定,前提当然是已经安装了 python 3.8.x)。
- 加上参数后运行上述 make 命令,仍然提示错误:AssertionError: '函' is not a know literal,这是第二个坑。搜索这个错误信息,找到一个文件 Tools/peg_generator/pegen/c_generator.py,发现出错地方上面有个 re.match(r"[a-zA-Z_]\w*\Z", val),怪不得,改成 re.match(r"[a-zA-Z_\u4e00-\u9fa5]\w*\Z", val) 以使它能匹配中文。再次 make,成功生成 parser.c。
- 在 VS 2019 中打开 pcbuild.sln。根据之前的汉化经验,现在包含汉字的 parser.c 这个文件的编译命令须加上 /utf-8。设置好编译目标后,点击 pythoncore 这个项目,重新生成,成功得到 python39.dll。
- 双击打开 PCbuild/win32 目录中 python.exe,用 '函' 写一个函数并运行,结果并不像预期的那样成功执行,而是提示语法错误。这个坑耗费老吴半天时间才解决。那么,问题出在哪里呢?在上述步骤中,只有 parser.c 这个文件发生了改变,应该还是这个文件的问题。但打开看看,'函' 已被当作关键字处理,似乎没什么问题。
static KeywordToken *reserved_keywords[] = { (KeywordToken[]) {{NULL, -1}}, (KeywordToken[]) { {"函", 532}, {NULL, -1}, }, (KeywordToken[]) { {"if", 510}, {"in", 518}, {"as", 520}, {"is", 526}, {"or", 533}, {NULL, -1}, }, (KeywordToken[]) { {"del", 503}, {"try", 511}, {"for", 517}, {"not", 525}, {"def", 531}, {"and", 534},
- 为了查清问题所在,老吴想到先不忙着添加中文关键字,而是添加英文关键字,比如给 def 取个别名 fn,看成不成。重复上述步骤,结果是成功。相应的 parser.c 的前几行如下:
static KeywordToken *reserved_keywords[] = { (KeywordToken[]) {{NULL, -1}}, (KeywordToken[]) { {NULL, -1}, }, (KeywordToken[]) { {"if", 510}, {"in", 518}, {"as", 520}, {"is", 526}, {"fn", 532}, {"or", 533}, {NULL, -1}, }, (KeywordToken[]) { {"del", 503}, {"try", 511}, {"for", 517}, {"not", 525}, {"def", 531}, {"and", 534},
- 比较上述两段代码,细心的读者应该已经知道答案啦。这里先卖个关子,答案过几天在评论里揭晓 (>‿◠)
保留字的完整汉化还涉及到 ast、tokenizer 等的修改。老吴瞄了一眼,这部分的修改应该与草蟒 380 的汉化大致相同。草蟒 39x 已排上日程。
老吴尚未在 WSL 中编译添加了中文保留字的 python,但相信没问题。
草蟒(Python 汉化版)中文编程语言旨在给编程“去魅”,让普通人也能亲近编程、喜欢编程,借助编程这个强大的 工具 给自己的工作和生活带来便利,例如随心所欲地操纵 excel 表格和数据,再也不用去记忆和编写极不人道的 excel 函数(更不用说 VBA,连他亲爹微软都不要了)。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Redis只往zset有序集合添加不存在的数据:关键字索引查询构建+源码分析
- 番外篇2-基本规范、注释、static关键字、import关键字
- 说说iOS中的常用的关键字static ,class(仅限Swift关键字)
- Golang 关键字
- 2019 关键字
- golang关键字
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
学习JavaScript数据结构与算法(第2版)
[巴西] Loiane Groner / 邓 钢、孙晓博、吴 双、陈 迪、袁 源 / 人民邮电出版社 / 2017-9 / 49.00元
本书首先介绍了JavaScript 语言的基础知识以及ES6 和ES7 中引入的新功能,接下来讨论了数组、栈、队列、链表、集合、字典、散列表、树、图等数据结构,之后探讨了各种排序和搜索算法,包括冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序、顺序搜索、二分搜索,然后介绍了动态规划和贪心算法等常用的高级算法以及函数式编程,最后还介绍了如何计算算法的复杂度。一起来看看 《学习JavaScript数据结构与算法(第2版)》 这本书的介绍吧!