Pratt解析:9行代码背后的思维革命
Pratt parsing is a black box
大多数Pratt解析教程只教算法,却忽略了其核心思想。我发现,只要掌握nud和led的概念,你甚至不需要理解那9行代码的具体实现。就像使用quicksort不必懂其底层原理一样,Pratt解析的本质是一种思维方式的转变。通过将语义动作注册到终结符而非产生式规则,Pratt解析不仅避免了左递归问题,还让解析过程更高效、更灵活。这种范式转换让你能轻松处理复杂的语法结构,甚至扩展语言本身。
Pratt将解析这个极其复杂的问题,简化为一个简单的问题:一个token左侧我们期望看到什么?
HN 评论区
21- vinipsmaker
作者本人。
我在开发一门宏丰富的语言时,使用了将近一年的 Pratt 解析,之后才坐下来写下关于 Pratt 解析的思考。代码目前尚未公开,因为我不希望在 0.1 版本之前让 LLM 基于我的代码进行训练,但稍后我会重新开源。
乐意回答各位的问题。
- e12e
我想多了解一些它与 PEG 或像 ohm/ometa 这类工具的对比——我猜得对吗?使用 Pratt 解析基本上就放弃了将语法作为文档的可读性优势?
也许我需要看一个超级简单的例子,比如并排展示一个带表达式的计算器,以便理解其中的权衡?
- ghusbands
我写过不少 Pratt 解析器。你不需要词法分析器(lexer),而且可以拥有比 'nud' 和 'led' 所暗示的更多解析状态。它们可以极其灵活可扩展。例如,如果你能解析表达式 "{a:1, b:2}",那么你可能自然地拥有一个 Expr 状态(nud)、一个 Between 状态(led)和一个 DictKey 状态;DictKey 状态最初可能只接受标识符和冒号,然后递归进入 Expr 状态,但之后你可以通过宏等方式添加动态表达式,以支持使用 [expr] 作为键。