使用 Pest 和 PEG 构建 Rust 解析器【译】

本文原为为 https://blog.logrocket.com/building-rust-parser-pest-peg/,使用Google翻译进行机翻,部分内容做了细微润色。 编写一个高效的词法分析器对来解析复杂的结构可能具有挑战性。如果格式或结构是固定的,并且您必须以易于理解、维护和扩展以适应未来更改的方式编写解析器,那么这会变得更加复杂。 在这些情况下,我们可以使用解析器生成器,而不是手写解析器或手动解析我们的项目。在本文中,我们将回顾什么是解析器生成器,并探索一个名为 Pest 的 Rust 解析工具。我们将涵盖: [TOC] 请注意,您应该能够轻松地阅读和编写基本的 Rust 代码,例如函数、结构和循环。 什么是解析器生成器? 解析器生成器是一些程序,它接受解析器需要考虑的规则,然后以编程方式为您生成一个解析器,该解析器将根据这些规则解析输入。 大多数时候,规则以简化语言(例如正则表达式)提供给解析器生成器。因此,当您想要通过更改规则或添加新规则来更新解析器时,您只需更新或添加规则的正则表达式即可。然后,当您运行解析器生成器时,它将重写解析器以适应这些规则。 可以想象使用这样的解析工具可以节省多少时间。许多解析器生成器还会生成词法分析器,因此您不必自己编写词法分析器。如果生成的词法分析器不适合您,您可以选择使用您自己的词法分析器运行解析器(如果需要)。 目前,Rust 生态系统中有多个解析器生成器可供您使用。其中最受欢迎的三个是 LalrPop、Nom 和 Pest。 LalrPop 与 Yacc 非常相似,它让您定义规则和相应的操作。我个人用它来为我的 8086 模拟器项目编写规则。 Nom 是一个解析器组合器库,您可以在其中将规则编写为函数组合。这更面向解析二进制输入,但也可用于解析字符串。 最后,Pest 使用 Parsing Expression Grammar 来定义解析规则。我们将在这篇文章中详细探讨 Rust 与 Pest 的解析。 Pest 中的解析表达式语法是什么? 解析表达式语法(PEG)是用 Pest 定义 Rust 解析“规则”的方法之一。 Pest 接受具有此类规则定义的文件的输入,并生成遵循它们的 Rust 解析器。 在编写规则时,您应该考虑 Pest 和 PEG 的三个定义特征。 第一个特点是贪婪匹配。 Pest 将始终尝试将输入的最大值与规则相匹配。例如,假设我们编写了如下规则: match one or more alphabets 在这种情况下,Pest 将消耗输入中的所有内容,直到达到数字、空格或符号。在此之前它不会停止。 要考虑的第二个特征是交替匹配是有序的。为了理解这意味着什么,假设我们给出了多个匹配来满足一条规则,如下所示: rule1 | rule2 | rule3 Pest 将首先尝试匹配 rule1 。当且仅当 rule1 失败时,Pest才会尝试匹配 rule2 ,依此类推。如果第一条规则匹配,Pest 将不会尝试匹配任何其他规则来找到最佳匹配。...

April 19, 2024 · 10 min · czyt

Golang Expr不完全指南

安装 库的说明 Expr package provides an engine that can compile and evaluate expressions. An expression is a one-liner that returns a value (mostly, but not limited to, booleans). It is designed for simplicity, speed and safety. The purpose of the package is to allow users to use expressions inside configuration for more complex logic. It is a perfect candidate for the foundation of a business rule engine. 安装 go get -u github....

July 13, 2022 · 9 min · czyt

Golang DSL参考

ANTLR 4 图书 The definitive ANTLR 4 reference (2014) 英文版下载 中文版下载 文章 使用ANTLR和Go实现DSL入门 手把手教你使用ANTLR和Go实现一门DSL语言part1 part2part3part4part5 Parsing with ANTLR 4 and Go 实例代码 bilibili gengine link go-zero link grule-rule-engine https://github.com/kulics-works/feel-go monkey.go windows 环境配置 配置好Java环境,然后将下面的批处理加入系统环境变量: antlr.cmd @echo off java -classpath %~dp0antlr-4.12.0-complete.jar org.antlr.v4.Tool %* grun.cmd @echo off java -classpath %~dp0antlr-4.12.0-complete.jar org.antlr.v4.gui.TestRig %* Others 图书 Writing A Compiler In Go Writing an Interpreter in Go µGo语言实现——从头开发一个迷你Go语言编译器 文章 Build your own DSL with Go & HCL...

July 11, 2022 · 1 min · czyt