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


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 解析器系列博客素材
更多推荐


所有评论(0)