FEATURED · 精选文章

PEG 实战:5 分钟生成你的第一个 Go 解析器

发布时间 / 2026/8/24 16:38:15
来源 / 创域科博编辑部
栏目 / 资讯中心
PEG 实战:5 分钟生成你的第一个 Go 解析器 PEG 实战5 分钟生成你的第一个 Go 解析器【免费下载链接】pegPeg, Parsing Expression Grammar, is an implementation of a Packrat parser generator.项目地址: https://gitcode.com/gh_mirrors/pe/pegPEG 是用 Go 编写的 Packrat 解析器生成器你写语法规则它生成可直接使用的 Go 解析代码。相比正则表达式它支持回溯与负向前瞻更适合描述复杂语法并嵌入代码逻辑。 它到底能帮你干什么写小语言解释器仓库里的计算器示例用 30 行语法规则解析算术表达式生成的代码算完直接出结果解析配置与自定义文件格式格式规则显式声明出错位置比手写切分逻辑清晰也不用维护一堆正则搭编译器前端项目自带 Java 1.7、C 语言的完整语法文件改改就能当模板用场景清楚了先把环境装上生成你的第一个解析器。 环境准备与安装环境要求Go 1.25版本见 go.mod源码构建另需 Bash 3.2.x。一行安装把 peg 装成 Go 工具依赖go get -tool github.com/pointlander/pegmain源码构建参与贡献时需要这一档git clone https://gitcode.com/gh_mirrors/pe/peg cd peg go generate go build装完后运行go tool peg -version能打印版本号就说明安装成功。 核心工作流从语法文件到可运行解析器Step 1写最简语法文件在项目目录创建nums.peg内容如下package nums type Nums Peg { } sum - n !. n - [0-9]sum是入口规则结尾的!.要求输入全部被消费。n匹配一串数字表示一次或多次。type Nums Peg {}声明解析器类型花括号里加的字段可在嵌入代码中以p.字段名读写。Step 2生成解析器用生成命令从语法文件产出同目录的nums.peg.gogo tool peg -switch nums.peg-switch把 if-else 链换成 switch 分支提升性能-inline会内联只被引用一次的规则。Step 3用 Go 代码调用构造解析器实例、传入文本按 Init、Parse、Execute 的顺序调用n : nums.Nums[uint32]{Buffer: 12345} if err : n.Init(); err ! nil { panic(err) } if err : n.Parse(); err ! nil { panic(err) } n.Execute() fmt.Println(parsed OK)走到 parsed OK第一个 Go 解析器就跑起来了。 语法文件怎么读怎么写常用符号记住这几个任何 .peg 文件都能读符号含义示例-规则定义第一条规则即入口n - [0-9].匹配任意单个字符x - . !.*?零次或多次 / 一次或多次 / 可选[0-9]*/有序选择按顺序取第一个成功的分支a / b!负向前瞻 / 正向前瞻不消耗输入n n捕获匹配区间存入 buffer[0-9]{ }嵌入 Go 代码可用 buffer 等变量{ fmt.Println(text) }两个容易踩的坑入口规则最好以!.收尾或定义END - !.后引用它否则末尾内容会被静默忽略双引号字符串是大小写不敏感匹配abc也能匹配Abc单引号才是精确匹配完整规范见 docs/peg-file-syntax.md。 从示例中偷师三个由浅入深的实战calculatorast零嵌入代码的语法grammars/calculatorast/calculator.peg 纯结构化地描述算术表达式语法最适合先看懂规则怎么组织。跑go test ./grammars/calculatorast/验证。calculator嵌入代码求值grammars/calculator/calculator.peg 在{ }里把表达式编译成字节码解析完直接算出结果。跑go test ./grammars/calculator/。java完整语言语法grammars/java/java_1_7.peg 是一份 872 行的 Java 1.7 语法做编译器工作时可当模板。跑go test ./grammars/java/用例就是同目录的 example-1.java、example-2.java。批量验证全部示例go test -short ./grammars/...️ 源码地图值得翻的 5 个文件peg.peg — 编译器自身的语法项目自我托管读它等于读规范peg.peg.go — 上一文件生成的产物对照着看生成器输出了什么main.go —-inline、-switch、-strict等全部命令行开关在这里定义tree/ — 语法树的数据结构与 Go 代码生成逻辑bootstrap.bash — 六步自举用旧解析器一步步编出新编译器 上手后的下一步日常速查go tool peg -h— 查看全部选项go tool peg -inline -switch 你的文件.peg— 带性能优化地生成go generate— 重新生成仓库里所有示例的解析器go test -short ./...— 跑全部测试golangci-lint run— 代码检查想贡献时环境需要 Go 1.25、golangci-lint v2、Bash 3.2.x。第一步永远是先go generate自举 生成示例再go build、go test -short ./...。⚖️ 选型速答 延伸阅读和正则表达式的区别正则缺少回溯与负向前瞻匹配结果可能含糊PEG 的有序选择是确定性的适合描述结构化文本。两者互补不是替代。性能扛得住生产吗生成的是普通 Go 代码加-inline -switch后足够应对常规配置、协议解析超大文件建议先跑go test -bench .确认。PEG 和 ANTLR 怎么选语法规模不大、又想嵌入 Go 逻辑就选 PEG语法很大、要多语言输出、要庞大生态就选 ANTLR。能直接解析 C/Java 吗仓库自带grammars/c/c.peg、grammars/java/java_1_7.peg现成示例可直接当模板。延伸阅读docs/peg-file-syntax.md — 语法文件完整规范grammars/ — 示例语法集合peg_test.go — 测试用例与性能基准打开编辑器写下第一条规则。【免费下载链接】pegPeg, Parsing Expression Grammar, is an implementation of a Packrat parser generator.项目地址: https://gitcode.com/gh_mirrors/pe/peg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻