为 Python 3.9 版本添加中文关键字 — 写在草蟒 39x 发布之前

栏目: 软件资讯 · 发布时间: 3年前

内容简介: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。

  1.  从 Python 官方网站下载 3.9.0 版本源代码。
  2. 打开 Windows Terminal,在 PowerShell 中 cd 到 PCbuild 目录。按照 ./PCbuild/readme.txt 中的说明,首先运行 build.bat。正式 build 之前会下载所需的外部依赖,源代码目录会多出一个文件夹 externals. 结果是成功 build 出一个 32 位 python.exe。
  3. 打开 /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 {

     

  4. 从 Windows Terminal 打开 WSL,cd 到源代码目录,运行 ./configure。
  5. 按照 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)。
  6. 加上参数后运行上述 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。
  7. 在 VS 2019 中打开 pcbuild.sln。根据之前的汉化经验,现在包含汉字的 parser.c 这个文件的编译命令须加上 /utf-8。设置好编译目标后,点击 pythoncore 这个项目,重新生成,成功得到 python39.dll。
  8. 双击打开 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},
    

     

  9. 为了查清问题所在,老吴想到先不忙着添加中文关键字,而是添加英文关键字,比如给 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},

     

  10. 比较上述两段代码,细心的读者应该已经知道答案啦。这里先卖个关子,答案过几天在评论里揭晓   (>‿◠)

保留字的完整汉化还涉及到 ast、tokenizer 等的修改。老吴瞄了一眼,这部分的修改应该与草蟒 380 的汉化大致相同。草蟒 39x 已排上日程。

老吴尚未在 WSL 中编译添加了中文保留字的 python,但相信没问题。

草蟒(Python 汉化版)中文编程语言旨在给编程“去魅”,让普通人也能亲近编程、喜欢编程,借助编程这个强大的 工具 给自己的工作和生活带来便利,例如随心所欲地操纵 excel 表格和数据,再也不用去记忆和编写极不人道的 excel 函数(更不用说 VBA,连他亲爹微软都不要了)。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

学习JavaScript数据结构与算法(第2版)

学习JavaScript数据结构与算法(第2版)

[巴西] Loiane Groner / 邓 钢、孙晓博、吴 双、陈 迪、袁 源 / 人民邮电出版社 / 2017-9 / 49.00元

本书首先介绍了JavaScript 语言的基础知识以及ES6 和ES7 中引入的新功能,接下来讨论了数组、栈、队列、链表、集合、字典、散列表、树、图等数据结构,之后探讨了各种排序和搜索算法,包括冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序、顺序搜索、二分搜索,然后介绍了动态规划和贪心算法等常用的高级算法以及函数式编程,最后还介绍了如何计算算法的复杂度。一起来看看 《学习JavaScript数据结构与算法(第2版)》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具