编译原理中的短语,直接短语,句柄的定义与区分

短语

书上的定义如下: 
这里写图片描述

书上写的比较抽象,我这里简单解释一下,有两个文法,分别是:

S=*=>aAp (由于部分字符难以输入,在此用a,b,p代替)
A=+=>b

我们由此可以画出他的抽象语法树,如下:

编译原理中的短语,直接短语,句柄的定义与区分_第1张图片

那么,abp为此句型的短语 
总结来说:一个句型的语法树中任一子树叶结点所组成的符号串都是该句型的短语,由这概念,那么我们自然可以想到,b也应该是该句型的一个短语。

直接短语

书中的定义:

编译原理中的短语,直接短语,句柄的定义与区分_第2张图片

书中的意思总结来说,指的是如果子树中不再包含其他的子树,即A只能推导出b,而b不能再推出其他的式子,则b为此句型的直接短语

句柄

先来看一下书中的定义:

编译原理中的短语,直接短语,句柄的定义与区分_第3张图片

书中的意思就是:直接短语中的最左直接短语为该句型的句柄

小练习

编译原理中的短语,直接短语,句柄的定义与区分_第4张图片

如何证明E+T*F是句型呢?最简单的方法就是画抽象语法树,如果能画出对应的抽象语法树,则就表明此表达式是文法的一个句型。

抽象语法树如下:

编译原理中的短语,直接短语,句柄的定义与区分_第5张图片

按如上的语法树可知,E+T*F为此文法的一个句型:

  • 短语: T*F, E+T*F

  • 直接短语:T*F

  • 句柄:T*F

短语,直接短语,句柄的前提是句型,T*F是句型相对于T-->T*F的直接短语,并且它也为最左直接短语(这里只有一个直接短语,显然的事情,下面的是有多个直接短语的题目)

E+T*F是句型相对于非终结符E的短语,因为其还包括T-->T*F,所以E+T*F不是直接短语

这个比较简单,我们来个比较复杂的题目:

S -> a|b|(T) 
T -> TdS|S
证明(Sd(T)db)是S的一个句型,并求出短语,直接短语,句柄

此文法的抽象语法树为:

编译原理中的短语,直接短语,句柄的定义与区分_第6张图片

由此可得S=(Sd(T)db)为此文法的一个句型:

  • 短语:S,(T),b,Sd(T),Sd(T)db,(Sd(T)db)

  • 直接短语:S,(T),b

  • 句柄:S

  • 此时的最左直接短语是S所有句柄为S

你可能感兴趣的:(编译原理)