第二章 形式文法和形式语言
2.2文法和语言的形式定义
2.2.7推导和归约
题目:判断是否是语法的句子
p19
题目考点:
--a-bc 是否 L(G) 的句子->这个式子能不能通过起始符号推导出来
题目:写出最左和最右推导
p19
直接从开始符号推导即可
题目:
2.3文法和语言的分类
Chomsky 几型文法
题目:该文法是 Chomsky 几型文法?
p22
观察给定的文法:
-
对于 Chomsky 3 型文法(正则文法)的要求
-
在一个正则文法中,所有的产生式都必须要么全部符合右线性形式(或者),要么全部符合左线性形式。
-
不能部分产生式是右线性,部分产生式是左线性。
-
这里部分是右线性,部分是左线性
2.4上下文无关文法的句型分析
2.4.2句型推导与分析树
题目:求短语,直接短语,句柄,素短语,最左素短语
p26
短语:从下向上,每一层的每个点的终结子节点的构成
直接短语:从下向上,每一层的每个点的一层终结子节点的构成(下一层就得是他的终结子节点)
句柄:最左边的直接短语/第一个直接短语
素短语:
-
是短语
-
不能包含其他短语
-
至少一个终结符
最左素短语:第一个素短语
题目:求短语,直接短语,句柄,素短语,最左素短语

基本道理同上,先推导,得到树,再去找短语那些
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)文法、
步骤:
-
拓广文法:开头加上S撇;把或的都拆开来写。p79
-
项目集规范簇:p85
-
一定不要忘记,如果点往后移,后面一位,是非终结符,要把非终结符本身和能推导出来的都放入下一块内容(就是I0到I3的内容)
-
-
构造LR(0)分析表:p85
-
就是把上面的状态填入,终结符要带s,非终结不带s
-
注意,rn,这个n不是I的顺序,而是拓广文法之后的句子顺序,所以拓广文法一开始要拆开来
-
ACC是在新产生式结束的那个状态中,这里最后出现就是在I1,所以在1的最后加一个acc
-
-
判断是不是LR(0):p86
-
看看是不是有移进项目和规约项目;或者是不是有两个规约项目
-
题目:构建SLR(1)分析表,判断是不是SLR文法
p87
步骤:
-
拓广文法
-
写DFA
-
先写不带r的分析表
-
根据DFA,我们可以发现,状态1和状态3是有冲突的,现在开始写上r
-
这里我们求出非终结符的follow,然后碰到终结语句,放入对应的非终结符的follow符号的格子里面,这里状态5是r6句子(上面拓广弄错了),我们就把r6句子的左边的T的follow对应的r6填入到状态5里面
-
判断是不是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
自己做一遍就好
构建控制流程图
要点:
-
必经结点
-
回边
第八章 目标代码运行时刻环境的组织(不知道在干嘛)
p161
p165