关于编译原理的一道题目,求助!
题目如下:
假设某程序语言的文法如下:
s—a|b|(T) T—Tds|S (此处“—”代表为箭头符号)
其中:VT={a,b,d,(,)};VN={S,T};S是开始符号。
考察该文法,句型(Sd(T)db)是S的一个 A 。
A:1、最左推导 2、最右推导 3、规范推导 4、推导
此题应选答案4
答案分析如下:
S—>(T) 最右推导 或 S—>(T) 最左推导
—>(TdS)最右推导 —>(TdS)最左推导
—>(Tdb)最右推导 —>(TdSdS)最左推导
—>(TdSdb)最右推导 —>(SdSdS)最左推导
—>(Td(T)db)最右推导 —>(Sd(T)dS)最右推导
—>(Sd(T)db)最左推导 —>(Sd(T)db)最右推导
以上分析的“最右推导”和“最左推导”是根据什么得出的,我结合书上最右推导和最左推导的定义无法判断出,拜托各位老大帮忙解释一下!多谢多谢!
我的QQ是77512015,E:YY3344520@163.com
如果在推导的任何一步a->b(a,b是句型),都是对a中的最左(最右)非终结符进行替换,则这种推导为最左(最右)推导。最右推导常称为规范推导。
【注】:若只有一个非终结符,则既可说是最左,也可说是最右推导。
因此,在S->(Sd(T)db)的推导过程中,每一步都必须是最左(最右)推导才可称(Sd(T)db)是S的最左(最右)推导,而这样是无法推出(Sd(T)db)的,因此它既不是最左推导,也不是最右推导,更不是规范推导,只是一个推导。选4。
在你左边分析的最后一步并不是S的最左推导,因为其前面为最右推导。同理,右边的分析,从倒数第二步开始也不是最右推导了。
做这种题目其实很简单,其中最右推导又称规范推导,所以2和3必错.
其次,题目没有给出一步步的推导过程,所以只要在推导过程中可以找到一步不是最左推导的而最后可以推出题目所给的句型则1必错,剩下只有推导4
首先,对于最左(右)推导必须是一直是最左(右)推导!任何由这两种推导出来为一般推导。
其次,最左推导是对于每一步推导是从左到右,找第一个非终结符,然后利用产生式,依次类推。最右推导则是对于每一步是从右到左,找第一个非终结符,然后利用产生式,依次类推。
最后,如果能用最左推导全部推得,那称为最左推导;如果能用最右推导全部推得,那称为最右推导。