短语、直接短语、句柄的概念(关系:短语 > 直接短语 > 句柄)
设文法 G=(VN,VT,P,S) ,且 U∈VN,x,y,u ∈V*
短语
若有 S⇒*xUy⇒+xuy,则u称为句型xuy相对于U的短语
注意:一个短语,一定要讨论句型,并且一定要讨论是相对于哪一个部分。观察定义可以看到,U和u的上下文,也就是x和y是一样的,U通过多步推导的到u(x和y没有进行推导)。通过这样严格的定义,短语u才可以规约为U
举个例子:
G(expr):
expr → expr + term | expr - term | term
term → term * factor | term / factor | factor
factor → digit | (expr)
digit → 0 | 1 | 2 … | 9
推导:
expr ⇒ expr + term
⇒ expr + factor
⇒ expr + digit
解释:上面的例子中,digit是句型expr + digit相对于factor的一个短语;同样,digit是句型expr +digit相对于term的一个短语。
digit可以规约为factor ;同样digit可以规约为term
当然,还有一个没有说,factor是句型expr + factor相对于term的短语。
直接短语
若有 S⇒ * xUy⇒xuy,则u称为句型xuy相对于U的 直接短语 (或简单短语)
与短语的区别 :xUy⇒xuy仅需要一步推导
仍然使用上面的例子
expr ⇒ expr + term
⇒ expr + factor
⇒ expr + digit
digit是句型expr + digit相对于factor的直接短语;factor是句型expr + factor相对于term的直接短语。
句柄
一个句型的最左直接短语
称为该句型的句柄。
最左直接短语 :若一个句型只有一个直接短语,则这个直接短语就是句柄;若存在多个直接短语,则把位于最左边的直接短语称为最左直接短语。
上面的直接短语的两个例子中,两个直接短语分别为各自句型的句柄,因为每个句型仅有一个直接短语。
对于一些复杂的句型来说,可以通过语法树快速准确的确定句柄。
求【短语、直接短语、句柄】做题步骤
首先来看一棵树 :
1. 判断短语
1)从深度为1开始,找出父节点,该图为S,它的短语为所有其子节点(无法继续产生叶子节点的节点)的集合,此处即为 a1b1b2a2a3 ;
2)从最上层刚才找过的S往下找下一个父节点,即深度为2的,有A,B,S,依照1)中的做法,它们的短语分别为: a1 ,b1b2,a2a3;
3)往下到深度为3,包含叶子节点的有S,B,B,A,它们的短语分别为(空代表没有): b1 ,b2,a2
4)继续往下(深度为4)由于已经都是叶子节点,没有子节点,到此为止。
综上,短语有 a1b1b2a2a3 ,a1,b1b2,a2a3,b1,b2,a2
2.判断直接短语 (简单短语)
简单短语为一次性能推导出来的,即一次性推出叶子节点,如图,A->a1,B->b1,B->b2,A->a2均为直接推出叶子节点,故直接短语有 a1,b1,b2,a2
需要注意的是,最右边的a3也是叶子节点,也能直接由其父节点直接推导,但由于兄弟节点还有子节点,因而不算。
3.判断句柄
句柄即最左直接短语,由图可看出为a1