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),仅供参考

相关新闻

最新新闻

10分钟用麻将AI打完第一局:Akagi在雀魂的安装与实时分析教程

10分钟用麻将AI打完第一局:Akagi在雀魂的安装与实时分析教程

10分钟用麻将AI打完第一局:Akagi在雀魂的安装与实时分析教程 【免费下载链接】Akagi 支持雀魂、天鳳、麻雀一番街、天月麻將,能夠使用自定義的AI模型實時分析對局並給出建議,內建Mortal AI作為示例。 Supports Majsoul, Tenhou, Riichi City,…

2026/8/24 18:23:22
SPA首屏加载优化:从代码分割到SSR的完整性能提升方案

SPA首屏加载优化:从代码分割到SSR的完整性能提升方案

大家好,我是专注于前端性能优化的技术博主。在开发单页应用(SPA)时,你是否也遇到过这样的场景:项目功能越来越复杂,打包后的文件体积巨大,导致用户首次打开页面时,需要等待漫长的白屏…

2026/8/24 18:23:22
窗口拖不动?WindowResizer 3分钟强制改尺寸

窗口拖不动?WindowResizer 3分钟强制改尺寸

窗口拖不动?WindowResizer 3分钟强制改尺寸 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 深夜玩个只支持全屏的游戏,想留个攻略窗口在旁边,怎…

2026/8/24 18:23:22
Java技术面试的艺术:幽默与专业的平衡术

Java技术面试的艺术:幽默与专业的平衡术

1. 面试场景还原:当技术严谨遇上幽默破冰 去年冬天的一次技术面试让我至今记忆犹新。那天我作为面试官面对一位自称"谢飞机"的候选人,他简历上Java基础扎实,项目经验丰富,却在自我介绍环节突然来了段单口相声&#xff1…

2026/8/24 18:23:22
音视频技术面试全解析:Java开发者的架构实践

音视频技术面试全解析:Java开发者的架构实践

1. 音视频技术面试全解析:从基础到架构作为一名经历过多次音视频技术面试的Java开发者,我深知这个领域的面试难度。音视频技术作为互联网大厂的热门方向,对开发者的要求不仅限于Java基础,更需要掌握音视频处理、分布式架构等综合能…

2026/8/24 18:23:22
新手避坑指南,安装 npx skills 前必须知道的五个关键细节

新手避坑指南,安装 npx skills 前必须知道的五个关键细节

环境准备:别在起跑线上就卡住 很多新手在安装 npx skills 时遇到的第一个报错,往往不是因为工具本身有问题,而是忽略了最基础的前置环境。Skills 本质上是一个基于 Node.js 运行的 CLI 工具,它依赖 Git 来拉取远程的技能仓库。如…

2026/8/24 18:18:21