编译原理学习笔记

第二章 形式文法和形式语言

2.2文法和语言的形式定义

2.2.7推导和归约


题目:判断是否是语法的句子

p19

题目考点:

--a-bc 是否 L(G) 的句子->这个式子能不能通过起始符号推导出来


题目:写出最左和最右推导

p19

直接从开始符号推导即可

题目:

2.3文法和语言的分类

Chomsky 几型文法


题目:该文法是 Chomsky 几型文法?

p22

观察给定的文法:

  1. 对于 Chomsky 3 型文法(正则文法)的要求

    • 在一个正则文法中,所有的产生式都必须要么全部符合右线性形式(或者),要么全部符合左线性形式。

    • 不能部分产生式是右线性,部分产生式是左线性。

这里部分是右线性,部分是左线性

2.4上下文无关文法的句型分析

2.4.2句型推导与分析树


题目:求短语,直接短语,句柄,素短语,最左素短语

p26

短语:从下向上,每一层的每个点的终结子节点的构成

直接短语:从下向上,每一层的每个点的一层终结子节点的构成(下一层就得是他的终结子节点)

句柄:最左边的直接短语/第一个直接短语

素短语:

  1. 是短语

  2. 不能包含其他短语

  3. 至少一个终结符

最左素短语:第一个素短语

题目:求短语,直接短语,句柄,素短语,最左素短语

基本道理同上,先推导,得到树,再去找短语那些

2.4.3句子,文法和语言的二义性


题目:证明是二义方法

p27

通过证明句型 f b f b f 存在两棵分析树

只要走文法的不同路径即可

第三章 词法分析

3.3 单词的识别——有限自动机

3.3.2 NFA到DFA的转换;3.3.3 DFA的最小化

题目:NFA到DFA的转换,再化简为最小DFA

p39

NFA到DFA的转换

输入a/b之后根据原始状态,如果能通过空符号或者a/b到达的点就是得到的新状态,不会再包含原来的点,d[4]在经过b后就失去了d,e,因为他们要a才能到

表格里面要加上大括号,为空的时候也要写上去

p42

最小DFA

1.接受或者非接受状态要一致

2.输入字符结果都要一致

题目:利用子集构造法把以下NFA转换成DFA

p41

注意,每个点只能接受输入走一步输入符号,可以有多种方向,但空符号是可以走很多次,走了一步输入之后都继续走的,一般也不会有多个连续的空符号,没有意义的

x走0只能走到z,不能再走回来

3.4正规表达式与有限自动机的等价性

正规表达式转为NFA

题目:生成以下正规式的NFA

(a|b)* (aa|bb) (a|b) *、

p47,48

熟练之后,就知道,*就是点的一个自返回,但是,一定要在前后加上空符号

或就可以不那么严格,不一定要加上空符号

从构建正规表达式到DFA

题目:设计一个DFA ,它能接受以0开始,以1结尾的所有序列。

p47

第四章 语法分析

4.2自项向下语法分析方法

题目:提取公共左因子

p63

方法:就是如果有左边一样的,就把他提取出来,让新的非终结符号去做一个或的事情,让我原来的符号不用做有公共左因子的或

题目:消除左递归

p64

详情可看书本

方法:

解题步骤:

间接左递归就是把式子代入,去找到直接左递归

例4-14 p65
题目:求非终结符号的FIRST集和FOLLOW集

p59

求FIRST集

这里面提到的,当M选择空,然后s就可以去看M后面的H,就是书本p59中间说的如果X1是空就可以去看X2

p60

求FOLLOW集

方法图片:

在这里要注意,H和K可能是空,所以当他们出现在尾部,要考虑两种情况;同时,LSo,后面的First(So)加入非空符号,因为S不会是空,所以其实就是First(S)

题目:是不是LL(1)文法

p60

先求select集

select就是根据产生式,从左往右看右边,如果不能推出空符号,就添加对应的first;如果能推出空符号,就添加对应的非空first,然后去看后面的字符;如果看完了,就加上左边的FOLLOW

up主认为:first就是空符号之前的产物,follow就是空符号之后的产物

LL(1)文法:同一个非终结符的所有select的交集为空(这样子一个非终结符产生字符后,就能明确是哪一条产生式)

题目:构建预测分析+输入串分析

构建预测分析表

就是把select集的式子放入select里面的符号中

输入串分析:

p71

看书本,就是把输入符号一步步匹配,中间可以逐个符号匹配,匹配后就可以删除

只需要,栈,输入串,输出就行,输出中可以不写输出两个字

题目:改写文法+first+follow+select+预测分析表+输入串分析

4.3自底向上语法分析

构造LR(0)分析表,判断是否是LR(0)文法、

步骤:

  1. 拓广文法:开头加上S撇;把或的都拆开来写。p79

  2. 项目集规范簇:p85

    1. 一定不要忘记,如果点往后移,后面一位,是非终结符,要把非终结符本身和能推导出来的都放入下一块内容(就是I0到I3的内容)

  3. 构造LR(0)分析表:p85

    • 就是把上面的状态填入,终结符要带s,非终结不带s

    • 注意,rn,这个n不是I的顺序,而是拓广文法之后的句子顺序,所以拓广文法一开始要拆开来

    • ACC是在新产生式结束的那个状态中,这里最后出现就是在I1,所以在1的最后加一个acc

  4. 判断是不是LR(0):p86

    1. 看看是不是有移进项目和规约项目;或者是不是有两个规约项目

题目:构建SLR(1)分析表,判断是不是SLR文法

p87

步骤:

  1. 拓广文法

  2. 写DFA

  3. 先写不带r的分析表

  4. 根据DFA,我们可以发现,状态1和状态3是有冲突的,现在开始写上r

    1. 这里我们求出非终结符的follow,然后碰到终结语句,放入对应的非终结符的follow符号的格子里面,这里状态5是r6句子(上面拓广弄错了),我们就把r6句子的左边的T的follow对应的r6填入到状态5里面

    2. 判断是不是slr,就是看移进的终结符和规约的follow有无重合,没有就是SLR

题目:SLR(1)输入串分析

答案:

action是状态栈最右和输入串最左

如果是移进,符号进符号栈,新状态进状态栈,输入串减少

如果是归约,符号串从左边开始,要消失产生式中对应的符号个数,这里r3就消失3个状态,然后再goto去寻找下一个状态

例:act[s3,’,’],如图为r2,找到产生式r2,然后发现消失一个s,所以去掉一个s3,同时goto(s2,s)。这里的s2是去掉s3后的第一个,s是产生式r2的左边

act【s9,#】,如图为r3,要消失3个字符,去掉s9,8,6;然后goto(s4,r),得到s5

最后s1对应#是acc就成功了,SLR1同理。

第五章 语法制导翻译技术

5.2 语法制导定义

综合属性和继承属性判断

属性
  • 属性是附加在产生式中节点的语义定义。这个定义有点抽象,结合下面这个产生式,会有更好的理解:

    E->E1+T           E.val:=E1.val+T.val

    第一列是产生式,第二列是具体的语义定义。

    这个产生式语义定义表示的是算法加法。(关于上面的语义定义我的理解:比如说 '+' 这个符号,可理解成字符串连接,也可以,理解成是算法加法,具体如何定义,就看语义规则是如何定义的。)

    E1.val,val就是E1的属性值

    T.val ,val就是T.val的属性值

    E.val ,val就是E.val的属性值

综合属性

  • 自下而上传递信息

  • 语法规则:产生式右部确定左部

  • 语法树:子节点确定父节点

这里的val就是e的综合属性

继承属性

  • 自上而下传递信息

  • 语法规则:产生式左部确定右部

  • 语法树:(父节点 + 兄弟节点)确定(子节点

注意:

非终结符既可有综合属性,也可有继承属性,但文法开始符号没有继承属性;终结符只有综合属性,它们由词法程序提供。

题目:判断综合属性,继承属性

综合属性:T.p,R.s,E.p(他们都是产生式左边的,然后由右边属性决定)

继承属性:R.i(R1.i就是R.i,1就是表示顺序的,所以这个R1是产生式右边的R,后面没序号的R是左边的第一个R)

题目:判断综合属性,继承属性(2)

综合属性:L.val,B.val

语法分析树

向上综合,向下继承

向上综合

先画出语法树,从最底下d开始传入数据

向上综合+向下继承

也是先画出语法树

先从下往上传递综合属性,然后从上往下传递继承属性

这里的继承属性就是R.in

先把val传上去,再把in传下来

依赖图

依赖图:虚线分析树+实线依赖图

虚属性也要画出来,只不过只需要一个点而已

print就是一个虚属性!!!

翻译模式

把这个大括号里面的看成一个整体的点

如果是继承属性,就放在对应字母前面,如果是综合属性,放在整个最后面。

然后把语义结点,按照位置放入

题目:根据翻译模式,构建分析树,打印结果

第六章 语义分析和中间代码生成

题目:翻译赋值,控制流,布尔语句(还没搞懂)

第一步:先画带语义结点的分析树
第二步:输出中间结果(就是把用到的语义规则都写一下)
第三步:输出结果

就是把里面有输出功能的都输出,例如emit和gen!

第七章 代码优化

基本块划分

先划分基本快,然后优化

p144

自己做一遍即可

创建DAG

然后根据DAG优化自己的代码

p148

自己做一遍就好

构建控制流程图

要点:

  1. 必经结点

  2. 回边

第八章 目标代码运行时刻环境的组织(不知道在干嘛)

p161

p165

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值