编译原理-期末大题解析【太原理工大学】

1,2,9,10放在一道题中;6,7,8放在一道题中;3,4,5放在一道题中(应该是最大的一道题)11,12,13放在一道题中

1)给出文法、目标符号串或句型,求最右推导/规范推导

推导:可以理解为“等于”,如何变换能得到最后要求的式子

最右推导:从符号S开始出发,每次选择产生式右部最右边的非终结符进行替换,直到得到目标符号串(先推右边的树)

2)根据语法树,求短语、简单短语和句柄

简单来说:求短语就是看“每个枝干的最下方”,简单短语就是一步能推出的,句柄就是最左边的最小树,简单短语一定是短语的一部分

3)已知文法,将其改造为LL(1)文法(消除左递归)(应该会考

首先明确:一般是A→Aa | b(能循环推出自己的形式)需要消除左递归

重要公式:   A → βA'     A' → αA' | ε

消除直接左递归
对于形如 A → Aα | β 的产生式(A后箭头紧跟着A的形式)

消除直接左递归很简单:就是将 |后的大写字母提到前面,第一个改写成什么’ ,然后大写字母‘=剩下的部分 | 空

消除间接左递归(应该不考间接,了解一下)
对于间接左递归,通常先将其转化为直接左递归,然后再按照上面的方法消除。

4)求文法的Select集,并构造LL(1)分析表(应该会和3)一起出

要构造LL(1)分析表,首先需要确定每个产生式的Select集,也称作FIRST集和FOLLOW集。FIRST集包含所有可以从某个产生式右部推导出的终结符序列的第一个终结符,而FOLLOW集包含所有可能跟随某个非终结符的终结符集合,不包括空集。


简单来说:first集就是看箭头右边第一个出现的小写字母,若第一个出现的是大写字母则追溯到该大写字母的第一个小写字母(稍微有点绕,可以去B站找个视频)follow集就是从后往前看,找到大写字母,若后面没有东西了,就把箭头左边大写字母包含的follow集加入到该集合,若后面有大写字母,则将该大写字母去掉空串的first集加入到follow中。

得到first和follow集后求select集就很简单了:select相当于对推导过程进行求解,“select右边非空=右部first,右边空=左部follow”

对于first(aA)指的是aA这个整体的first集,与之前求first集同样规则,找右边的第一个小写字母,其实在此处,我个人认为先求first和follow集的意义不大,反倒容易混淆,应该在用到时再求解

对于LL(1)文法:一个上下文无关文法是LL(1)文法的充分必要条件是——对于每个非终结符的两个不同产生式,A→a,A→b,满足select(A→a)∩select(A→b)=空(即没有共同成分)


求出select后判断就很简单了,就是看有没有共同成分即可

在来说构造LL1分析表:

构造表主要注意几点:

1.对于没有出现在右侧第一个的终结符需要添加到纵轴

2.两个终结符的交汇处写空/R

3.构造表的三条规则

4.横纵轴最后都写一个#,交汇处写succ

5)对给定符号串进行语法分析(一般出在语法分析题最后一问

标准答案:横轴——步骤。分析栈。余留输入串。动作

余留输入串是所给出字符串依次递减;动作是横轴对应内容;分析栈可以理解为用上一步动作替换(底层原理其实很复杂,有时间再自己看吧)

6)构造相应文法的状态转换图

1.以每个非终结符为状态结点,开始符号对应终态;2.增设一个初态S;3.对于规则A→ Ba(先有大写字母),画出从状态B到A的弧,标为a;对于规则A→a(直接就是终态),画出以初态S到状态A的弧,标为a

7)判断状态转换图为DFA还是NFA

不严谨的讲:在本次考试中只需要看一个状态:“经历了一个小写字母后能到达几个状态”,如果只能到达一个状态说明是确定的,即DFA,如果多个状态即NFA(此方法只适用于突击考试,还有很多细节自己看书)

仍然拿上面的例子,因为∂(A,a)={A,Z},所以是NFA(这个公式表示从A出发,走a路径,可能到达A也可能到达Z)

8)NAF转换为DFA(不确定转确定有限自动机)

对于终止态的判断:经过变换后得到本身,说明过程结束,终止

最后结尾:转化后的DFA为:D={K,∑,δ,S,F} 

K={[S],[A],[Z],[A,Z]}

∑={a,d}

δ([S],a)=[A]     δ([S],d)=[Z]    δ([A],a)=[A,Z]    δ([Z],a)=[Z]    δ([A,Z],a)=[A,Z]

S=[S]

F={[Z],[A,Z]}

(K为状态集,∑为输入字母表,δ为映射,S为初态,F为终态集)

9)给出文法,判断其是否具有二义性,是否为正则文法

分别使用最左推导和最右推导,看画出来的语法树是否不同,如果不同则证明有二义性

例如本题,最左推导和最右推导语法树不同,证明有二义性

至于判断正则文法:要求必须为A→aB或A→Ba或A→a的形式,有A→aAB就不符合(不能出现通过有限次正则操作无法描述的表示)

答:不是,因为正则文法规定文法必须为A→aB或A→Ba或A→a的形式,在文法中存在S→aAB的形式,所以不是正则文法。

10)写出给定文法的生成语言

求生成语言,也就是求能够推出什么样的式子,这个式子能将该文法可能生成的所有语言全部概括。

学过软考科目的可能会对此比较熟悉,说白了就是找规律,这个没有懒人公式可套,自己做几道题感受一下就会了。

11)给出文法,构造其项目集的规范族(很多但不难,认真看

步骤:1.拓广文法加S‘  2.画图,写S0加∇   3.∇加:终结符保留即可/非终结符加其子女  4.判断是什么文法

画图时:状态从S0开始,然后依次去解后继状态;

项目集为文法加一个尖角号,之后依次将尖角号向后推移;

后继符号为尖角号后面的符号;

后继状态通过后继符号和状态确定,同一状态下若后继符号相同则为同一后继状态

12)判断文法是LR(0)还是SLR(1)文法

步骤,1.根据上一步算出的规范组寻找是否存在冲突,若存在冲突,则必定不是LR(0)文法

2.找到冲突的状态,若三角后有小写字母则求该小写字母的first集,后面为空则求箭头左边的follow集,交集为空则确定是SLR(1)文法

13)构造LR分析表(考,分值很大,跟12)一块考

此处构造LR分析表与第二问判断出是LR(0)还是SLR(1)文法有关:

SLR文法:1.构造ACTION、GOTO表,action下写小写字母加#,goto大写字母,在看由第一问的规范组表,后继符号所决定的后继状态(goto表不写S,只写数字即可)

2.遇到终结状态,如果是由开始符(S')导出的,直接在# 写acc,如果不是由开始符导出,求箭头左边大写字母的Follow集,再看是由哪条拓广文法导出,在follow集下写拓广文法的序号;

LR文法:与SLR唯一不同:在遇到非开始符导出的终态时,直接在所有ACTION下写拓广号

​​​​​​​

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值