编译原理之推导、规约、句柄与文法的二义性
这篇文章重点是说明一个句子的规范推导过程和最左规约的过程,以及这一过程是如何与短语、句柄等概念联系的,同时说明这些概念与文法二义性的联系。现有网络资料大部分不够细节而且大量重复,比如如何通过句柄判断文法的二义性,很多文章就只说一个结论,没有将句柄和规约联系起来。甚至不少文章的内容是有问题的,比如一个句子存在两种规范推导,那这一句型的句柄一定不唯一吗?针对上述问题,我专门写出这篇博文来对一些细节问题进行详细说明和记录。
推导与规约
在编译原理的总结之中,我们知道一个句子可能存在多种推导方式,所以我们约定两种特殊的推导方式(顺序),即最左推导和最右推导。句子的推导是我们从开始符号,推出我们想要的句子的过程。与之相反,拿到一个句子,我们反推回开始符号,这个过程是句子的规约。因此,最左推导和最右推导分别对应最右规约和最左规约。上述概念的形式化定义如下:
最右推导(规范推导): 对于直接推导xUy⇒ xuy,如果y只包含终结符号或者为空符号串(相当于右边已经没有可以被拆分的非终结符了),那么,就把这种直接推导称为规范推导。
最左推导: 与最右推导相反。
最左规约: 为最右推导的逆过程,对于一个句子,每次都从最左端,可规约的符号或符号串(句柄