编译原理之推导、规约、句柄与文法的二义性

编译原理之推导、规约、句柄与文法的二义性

  这篇文章重点是说明一个句子的规范推导过程和最左规约的过程,以及这一过程是如何与短语、句柄等概念联系的,同时说明这些概念与文法二义性的联系。现有网络资料大部分不够细节而且大量重复,比如如何通过句柄判断文法的二义性,很多文章就只说一个结论,没有将句柄和规约联系起来。甚至不少文章的内容是有问题的,比如一个句子存在两种规范推导,那这一句型的句柄一定不唯一吗?针对上述问题,我专门写出这篇博文来对一些细节问题进行详细说明和记录。

推导与规约

  在编译原理的总结之中,我们知道一个句子可能存在多种推导方式,所以我们约定两种特殊的推导方式(顺序),即最左推导和最右推导。句子的推导是我们从开始符号,推出我们想要的句子的过程。与之相反,拿到一个句子,我们反推回开始符号,这个过程是句子的规约。因此,最左推导和最右推导分别对应最右规约和最左规约。上述概念的形式化定义如下:
  最右推导(规范推导): 对于直接推导xUy⇒ xuy,如果y只包含终结符号或者为空符号串(相当于右边已经没有可以被拆分的非终结符了),那么,就把这种直接推导称为规范推导。
  最左推导: 与最右推导相反。
  最左规约: 为最右推导的逆过程,对于一个句子,每次都从最左端,可规约的符号或符号串(句柄)来规约。

短语、简单短语与句柄

  对于所有合法的推导过程,都能通过语法树的形式进行表示(多对一)。例如给定文法,E::=E+E|EE|(E)|i。对于句子i+ii可以构建如下两种语法树:
语法树示意
  从推导与规约中我们可知,存在规范推导与最左规约。假如拿到上述文法,以及句子i+i*i,我们应该从哪里开始(最左)规约呢?这时候需要短语和句柄的概念。短语、简单短语、句柄的形式化定义十分晦涩(见教材)。我这里说两种非形式的理解。

短语、简单短语与句柄的最简理解

  给定一个句子S(如i+i ∗ * i),我们怎么最简单的找到它的短语、简单短语与句柄,就是画出它的语法树。其中短语是语法树子树的所有叶节点组成的符号串,也就是说有多少个子树,就有多少个短语。简单短语是语法树简单子树(高度为2)的所有叶节点组成的符号串。句柄是最左简单子树(高度为2)的所有叶节点组成的符号串。
  我们不妨看上图左边的语法树。对于句子i+i ∗ * i,短语有i+i ∗ * i,i,i ∗ * i。简单短语有i(三个),句柄为最左边的i。

短语、简单短语与句柄的深入理解

  短语有什么用: 如果学语言学的课程,短语会是一个十分熟悉的词,比如名词短语(NP),动词短语(VP)等。无论是语言学中的短语,还是编译原理中的短语,都是指语句的组成部分(或者是说能聚在一起,表达语义的成分)。对于语言学,假设给出句子“I saw a cat on the tree." 我们可以先推导为NP+VP,其中VP可分为动词短语(saw a cat)+ 状语(on the tree),也可分为动词短语(saw)+ 名词短语(a cat on the tree)。第一种解法中saw a cat是短语,而在第二种解法中不是;第二种解法中a cat on the tree是短语而在第一种解法中不是。说明短语不同,句子的语义成分就不同。对于编译原理同理,例如上图的两种语法树,前者i*i是短语,后者i+i是短语。假设加法和乘法的优先度相同,那么上面两个语法树就代表两个表达式的计算顺序,语义也不相同。
  最简短语有什么用: 方便找句柄。
  句柄有什么用: 给定一个句子S(如i+i ∗ * i),句柄告诉我们应该规约哪一个符号。例如上文i+i ∗ * i先将i规约于E。

文法二义性的三种证明方式

  1. 相同句子存在不同语法树
  2. 相同句子存在不同规范推导
  3. 相同句子存在不同最左规约

如何消除文法二义性

  • 11
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值