Pegen:CPython 官方 PEG 解析器生成器

CPython 解释器使用的 PEG 解析器生成器,可从 PyPI 直接安装,当前已有 197 Star:

正文顶部截图

README区域截图

Pegen 是 CPython 官方采用的解析器生成工具,负责从形式化语法描述中生成 PEG 解析器。该工具在 PEP 617 中被引入,从 Python 3.9 开始替代了旧版的 LL(1) 解析器,成为 Python 解释器的核心组件之一。

这个仓库提供的是可在 PyPI 安装的独立发行版。与 CPython 内置版本的区别在于,该发行版仅生成 Python 代码。CPython 官方版本同时支持 Python 和 C 代码生成,但 C 代码输出涉及大量解释器内部实现细节和私有头文件,不适合通用场景。


安装方式

通过 pip 直接安装:

pip install pegen

生成解析器

准备一个符合 pegen 语法的语法文件,执行以下命令生成解析器:

python -m pegen <path-to-grammar-file> -o parser.py

生成的 parser.py 文件可用于解析符合该语法的源代码:

python parser.py <file-with-code-to-parse>

项目 data 目录下提供了一份完整的 Python 语法文件 python.gram,可作为编写自定义语法的参考。


语法规则

Pegen 语法由一系列规则组成,基本形式如下:

rule_name: expression

规则名称后可指定返回类型:

rule_name[return_type]: expression

省略返回类型时,默认返回 Any。


支持的表达式类型

  • 序列 e1 e2:依次匹配 e1 和 e2
  • 选择 e1 | e2:匹配 e1 或 e2。首选项也可另起一行,前面加 |
  • 分组 ( e ):将 e 作为整体匹配
  • 可选 [ e ]e?:可选匹配
  • 重复 e*:匹配零次或多次
  • 至少一次 e+:匹配一次或多次
  • 分隔列表 s.e+:匹配以 s 分隔的多个 e,解析树中不包含分隔符
  • 前瞻 &e:e 能匹配时成功,但不消耗输入
  • 否定 !e:e 能匹配时失败,但不消耗输入
  • 提交 ~:选定当前分支后不再回退

左递归处理

传统 PEG 解析器不支持左递归。Pegen 通过记忆化缓存解决了这一问题,支持直接左递归、间接左递归和隐藏左递归三种形式。


变量绑定与动作

子表达式可通过标识符和等号命名,在动作中引用:

rule_name[return_type]: '(' a=some_other_rule ')' { a }

Pegen 支持直接在语法规则中嵌入 Python 动作代码。动作在规则匹配成功时执行,常用于直接生成 AST 节点。每个备选分支后可跟大括号包围的代码块,指定该分支的返回值。

省略动作时,系统按以下规则生成默认行为:规则中只有一个名称则返回该名称,多个名称则返回解析结果的集合。


仓库结构

  • src 包含 pegen 源码包
  • tests 包含测试套件
  • data 包含示例语法文件,包括纯 Python 版本的 Python 语法
  • docs 包含项目文档
  • scripts 包含语法可视化、基准测试等辅助脚本
  • stories 包含 Guido van Rossum 的 PEG 解析器系列博客素材

hon 语法

  • docs 包含项目文档
  • scripts 包含语法可视化、基准测试等辅助脚本
  • stories 包含 Guido van Rossum 的 PEG 解析器系列博客素材

更多推荐