作业帮 > 综合 > 作业

编译原理,G:S->Pa|Pb|cP->Pd|Se|f是哪一类文法?A 左线性文法 B 右线性文法 C LL(1)文法

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/07/17 07:05:16
编译原理,
G:S->Pa|Pb|c
P->Pd|Se|f
是哪一类文法?
A 左线性文法 B 右线性文法 C LL(1)文法 D都不是
该文法为上下文无关文法,并且可以通过LL分析方法进行分析,答案为C.
再问: LL(1)文法不是要求没有左递归吗?消除左递归后还能说是这个文法吗?
再答: 1、正则文法与上下文无关文法的差别在于是否存在复杂递归,显然这个文法中存在复杂递归:S->Pa|Pb,P->Se。 2、如果一个文法中存在复杂递归你无论如何是无法消去的,所能做的无非从左递归到右递归,或者从右递归到左递归的改变。 3、选项中的左线性或右线性一般是指正规文法范畴的简单自递归文法,比如右线性A->aA|ε,或左线性A->Aa|ε。 4、LL(1)文法是上下文无关文法的子集,这个文法恰好属于这个子集范围内,所以属于LL(1)文法。
再问: 怎么判断出来的是LL(1)呢?我按照书上的定义怎么推了半天推不出来。。。
再答: 这个文法从表面上看无法进行LL分析,因为S和P的Frist存在交集,但是对这个文法稍微变换一下就可以进行LL(1)分析的。 是不是我说的错了 答案是那个 我参考答案再想想
再问: 没找到答案,o(╯□╰)o。存在交集,我就不会分析S和P的first集合了,本来想着画个LL1分析表也没画出来
再答: 你去书上找看看左线性文法的明确定义,如果左线性文法的定义是指包含左递归的一切文法,那么这个选择就是它。其实答案是那个不重要,道理弄清楚就好。学习编译原理重在悟出较高层的思想,单纯的术语、概念、公式、算法等等都不是死的,有些东西要果断的有权变的去吸收,这才是大学的教育。