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

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

内容简介: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,连他亲爹微软都不要了)。


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

查看所有标签

猜你喜欢:

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

Web Data Mining

Web Data Mining

Bing Liu / Springer / 2011-6-26 / CAD 61.50

Web mining aims to discover useful information and knowledge from Web hyperlinks, page contents, and usage data. Although Web mining uses many conventional data mining techniques, it is not purely an ......一起来看看 《Web Data Mining》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

html转js在线工具
html转js在线工具

html转js在线工具