为 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,连他亲爹微软都不要了)。


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

查看所有标签

猜你喜欢:

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

从需求到产品:0岁产品经理进阶之道

从需求到产品:0岁产品经理进阶之道

权莉 / 人民邮电出版社 / 2018-7 / 49.80元

本书主要针对刚入职的初级产品经理,从贴近工作状态的场景切入,对各阶段的知识点进行分类总结,旨在提供一套经过实践检验的产品方法论,为读者从初级产品经理成长为产品经理奠定坚实的基础。 书中提炼的方法和案例涵盖初级产品经理工作的方方面面,从基本技能到思维方式,从需求管理到产品规划定义,从框架选型到流程梳理,从工作模块拆解到案例剖析,用具体且贴合实际工作场景的内容,还原真实的产品工作方法及实践案例,既有方......一起来看看 《从需求到产品:0岁产品经理进阶之道》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

SHA 加密
SHA 加密

SHA 加密工具