编译原理部分题型总结
2 形式语言和自动机
转化为等价的无二义性文法


优先级越高的越在后边
根据描述写非二义性文法



注意左结合是先归约在移进,右结合是先移进再归约
根据描述画DFA

注意这种一般是将第一个0独立出去
根据描述写正规式


3 词法分析


4 语法分析——自上而下分析
消除左递归


改写并判断是否为LL(1)文法

首先要不含左递归不含左公因子
对A的操作是消除公共因子,对B是消除左递归

不要忘记follow含#的情况
只需要对有多个产生式的求FIRST集



不能用普通方法改写为LL(1)文法
尝试作DFA转为正规式


若不能作正规式


说明是否为LL(1)文法
设有下列文法_G_(A)
A→BCc|eDB
B→\(\varepsilon\)|bCD
C→DaB|ca
D→\(\varepsilon\)|dD
(1)计算每个侯选式的FIRST集合,若侯选式的FIRST集合包含\(\varepsilon\),计算左侧非终结符号的FOLLOW集合。
(2)根据(1)中的计算结果,构造该文法的LL(1)分析表,说明该文法是否为LL(1)文法。
解:
(1)对A:\(FIRST(BCc) = \{a,b,c,d\} \qquad FIRST(eDB) = \{e\} \qquad\)
对B:\(FIRST(\varepsilon ) = \{\varepsilon \} \qquad FIRST(bCD) = \{b\} \qquad FOLLOW(B) = \{\#,a,c,d\}\)
对C:\(FIRST(DaB) = \{a,d\} \qquad FIRST(ca) = \{c\}\)
对D:\(FIRST(\varepsilon ) = \{\varepsilon \} \qquad FIRST(dD) = \{d\} \qquad FOLLOW(D)=\{\#,a,b,c,d\}\)
(2)
LL(1)分析表为:
| a | b | c | d | e | |
|---|---|---|---|---|---|
| A | A→BCc | A→BCc | A→BCc | A→BCc | A→eDB |
| B | B→ε | B→bCD | B→ε | B→ε | |
| C | C→DaB | C→ca | C→DaB | ||
| D | D→ε | D→ε | D→ε | D→ε,D→dB | D→ε |
因为M[D,d] 有多重定义入口,所以该文法不是LL(1)文法。
LL(1)分析分析过程
有文法
_E_→-_E_|(_E_)|_VT_
_T_→-_E_|_ε_
_V_→_iF_
_F_→(_E_)| _ε_
问题:
1. 给出上述文法的LL(1)分析表;

2. 给出句子_i_- - i(i)利用LL(1)分析法的如下图所示的分析过程。
| 步骤 | 分析栈 | 余留输入串 | 所用产生式 |
|---|---|---|---|



5 语法分析——自下而上分析

一个短语必须是和其所有的兄弟节点组成的

如果有两个长的一样的短语但是在不同位置那他们是不同的短语
判定文法具有二义性


SLR(1)解决移进归约冲突



构建SLR(1)分析表


SLR(1)分析+左结合+分析过程
设有下列文法G[S]:

(2)假设加法“+”为左结合,试构造该文法的SLR(1)分析表;
(3)给出句子a+++a++的SLR(1)分析过程。

最后少一步

判断是LR(0)还是SLR(1)



优先级+左结合

LR(1)构建



LALR(1)构建



6 语义分析与中间代码生成
在编译程序中与生成中间代码的目的无关的是D
A.便于目标代码优化
B.便于存储空间的组织
C.便于目标代码的移植
D.便于编译程序的移植
逆波兰表达式、三元式、树以及四元式

- BZ 即如果栈顶元素为零,则进行分支跳转。它通常用于条件判断,当栈顶元素为零时,根据指定的跳转地址进行无条件跳转。
- BR 即无条件分支跳转。它用于无条件地将程序控制流程跳转到指定的地址。


拉链返填(for while if型)
有下列C语言语句
for(i=0; i<n; i++;)
whlile(a>b)do
if(c>d)m=n+1;
s=m;
问题:
1.给出该语句的语义处理(没有优化处理)后的四元式形式的目标代码;

2.设编译器是单遍扫描的编译器,给出中间代码生成后循环处理产生的如下所示的标号表的内容(标号按出现的先后顺序命名为Li,其中i=1,2,…,n;**)。
| 标号名 | 定义否(1/0) | 返填顺序 | 地址 |
|---|---|---|---|
| Li | 1 | ⑤→②→① | |
| … |

注意:
A)无条件转移操作符用“j”表示,条件成立转移的操作符用“jT”表示,条件不成立转移的操作符用“jF”表示;
B)语句标号的定义性出现用Li(i=1,2,…,n)表示,语句标号的地址使用四元式序列的序号表示,序号用①,②,…表示。
拉链返填(for if else if else型)




源程序生成中间代码的目标结构



逆波兰式表示+四元式表示+拉链返填



if-else if-else型


根据文法给出语法分析树
设有文法的语法制导定义如下。

(1) 根据文法给出句子 ((i),((i),(i))) 的语法分析树
(2) 根据语法分析树及语法制导定义,给出句子 ((i),((i),(i))) 的计算过程以及输出结果。

5
8 代码优化
DAG图优化






例题(循环优化)


根据四元式划分基本块


求控制流图和必经结点集

求回边和循环+代码外提

强度削弱+删除归纳变量(循环控制变量)

删除无用转移语句!


例题(基本块优化)


删除无用赋值



常量合并与传播

另一道题


公共子表达式删除





循环展开

(3)



例题

求到达-定值集IN和OUT

生成GEN集和KILL集
![%1D8GYI%3]K`9D{HXD$$B5.jpg
在基本块中如果有两个相同的变量被赋值,GEN集中记录的是最后一个被赋值的变量的定义。

初始化IN和OUT
out都是gen

迭代
注意-和U的优先级相同


求各基本块中变量引用点的ud链



求各基本块的活跃变量集IN和OUT集

生成DEF集和USE集


初始化IN和OUT
迭代


求各基本块中变量定值点的du链



浙公网安备 33010602011771号