在很多的编译原理的书里面, 会使用非常大的篇幅去介绍关于lexer, parser, 然后在介绍这些东西的时候, 它们又会引入更多的不必要的概念, 比如有限自动机, 上下文无关法, BNF定义等等。
导致很多初学者连看都看不明白, 更别说使用编译原理的知识去赋能其他的领域了, 久而久之编译原理这么学科变得很神秘起来, 而我们今天介绍的pratt算法就是去帮助你破除编译原理parser的神秘。
首先我们需要明白一点的是, 我们在解析二元表达式的时候1+2+3, 的时候, 如果直接使用递归下降算法是可以得到正确的parser结果的, 但是无法保证正确的顺序, 因为你解析出来的顺序永远是1+(2+3),按照我们我们常见的手法是(1+2)+3, 所以解析的顺序是错误的。
如果你不知道什么是递归下降算法的话, 可以先去了解一下, 它其实就是简单的树构建算法,
但是使用pratt算法我们可以很轻松的搞定, 所有的二元表达式解析, 这个算法的核心就是:
- 定义表达式的优先级
- 循环, 如果优先级高继续构造, 如果优先级不高, 不构造返回
所以你可以写出下面这个伪代码:
Node left = get_left;
while</