使用pratt算法完美解决左递归问题

编译原理中的解析问题常因复杂概念而变得难以理解。Pratt算法提供了一种简单的方法来解析二元表达式,如1+2+3,避免递归下降算法可能导致的顺序错误。算法核心在于定义表达式优先级并据此构造树。通过示例解释了如何使用Pratt算法处理二元表达式。
摘要由CSDN通过智能技术生成

在很多的编译原理的书里面, 会使用非常大的篇幅去介绍关于lexer, parser, 然后在介绍这些东西的时候, 它们又会引入更多的不必要的概念, 比如有限自动机, 上下文无关法, BNF定义等等。

导致很多初学者连看都看不明白, 更别说使用编译原理的知识去赋能其他的领域了, 久而久之编译原理这么学科变得很神秘起来, 而我们今天介绍的pratt算法就是去帮助你破除编译原理parser的神秘。

首先我们需要明白一点的是, 我们在解析二元表达式的时候1+2+3, 的时候, 如果直接使用递归下降算法是可以得到正确的parser结果的, 但是无法保证正确的顺序, 因为你解析出来的顺序永远是1+(2+3),按照我们我们常见的手法是(1+2)+3, 所以解析的顺序是错误的。

如果你不知道什么是递归下降算法的话, 可以先去了解一下, 它其实就是简单的树构建算法,

但是使用pratt算法我们可以很轻松的搞定, 所有的二元表达式解析, 这个算法的核心就是:

  1. 定义表达式的优先级
  2. 循环, 如果优先级高继续构造, 如果优先级不高, 不构造返回

所以你可以写出下面这个伪代码:

Node left  = get_left;

while</
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值