西电编译原理_复习与试题讲解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
T F a T + F F b c
三、计算题(3.2)
E E * T F ( E ) T T + F
F d
T F id
(T+F)*id 的分析树
a*b+c*d的分析树
15
三、计算题(3.2) (d) E→E*T|T,T→T+F|F,F→id的识别活前缀的DFA:
E’→.E I0 E E’→E. I1 * E→E.*T E→.E*T E→.T T→.T+F T E→T. I2 T→.F T→T.+F F→.id F F T→F. I3 id id F→id. I4 id
以阶段划分编译器
源程序 词法分析 语法分析 出 语义分析 中间代码生成 代码优化 目标代码生成 目标代码
1
符 号 表 管 理
错 处 理
基本情况
题型: • 简答题(30分) • 填空题(20分) • 计算题(50分) 内容分布: • 概述与词法分析(约30分) • 语法分析(约40分) • 语法制导翻译生成中间代码(约30分)
(也可以先给出语句的分析树,然后剪句柄生成中间代码)
8
二、填空题 2.1 从程序运行的角度看,编译程序和解释程序的主要区别 是: 。 2.2 编译程序的基本组成有:词法分析、 、 、中间代码 生成、 、 、 和 。 2.3 正规式r和s等价说明 相同。 2.4 不含子串baa的所有a、b符号串的正规式是 。 2.5 规范规约(最左归约)和 是互逆的两个过程。 2.1 运行目标程序时控制权在解释程序而不在目标程序,或者 是否生成目标代码,或者是否与机器相关。 2.2 语法分析、语义分析、代码优化、目标代码生成、 符号表管理和出错处理 2.3 r和s表示的正规集 2.4 a*(b|ba)* 2.5 规范推导(或最右推导)
(a) 求句型(T+F)*id 的短语、直接短语以及句柄; (b) 根据语法制导翻译写出句子a*b+c*d的中间代码; (c) 若a=3,b=5,c=7,d=8,请给出中间代码计算结果; (d) 将文法G简化为:E→E*T|T,T→T+F|F,F→id。给出它的识 别活前缀的DFA(算法3.9)。
14
12
三、计算题 3.1 有文法G:V→id|id(E), E→E+V|V (a) 说明G不是LL(1)文法; (b) 将G改写为LL(1)文法。 解:(解题思路:LL(1)文法不能有左递归和左因子) (a) 因为FIRST(id)∩FIRST(id(E))={id},即非终结符L产生 式的两个候选项有公共左因子,所以G不是LL(1)文法。(或 答文法中有左递归) (b)消除左递归和提取左因子之后,得到G1'如下,它是LL(1) 文法。 V → id B B → ε|(E) E → V E' E' → + V E' |ε
E→E*.T T E→E*T.I7 T→T.+F T→.T+F T→.F I5 F→.id + +
T→T+.F F T→T+F. I8 F→.id I6
16
三、计算题(3.3) 3.5 设有文法G:S→aBc|bAB, A→aAb|b, B→b|ε。 <1> 计算非终结符S、A、B的FIRST和FOLLOW集合(算法 3.5,算法3.6); <2> 构造G的LL(1)分析表(算法3.7); <3> 分析输入序列baabbb(以格局的形式写出具体的分 析步骤)。 解: <1> FIRST(B) = {b,ε} FOLLOW(B) = {c,#} FIRST(A) = {a,b} FOLLOW(A) = {b,#} FIRST(S) = {a,b} FOLLOW(S) = {#} a S A b c # aBc bAB aAb b b ε ε
10
二、填空题(续2) 2.9 已知文法G定义如下: S→eT|RT T→DR|ε R→dR|ε D→a|bd 则FIRST(S)= ,FIRST(D)= ,FIRST(T)= ,FIRST(R)= 。 2.10 文法G:S→AB, A→aA|ε, B→bBc|bc,该文法描述 的语言L(G)= 。 2.11 参数传递中,值调用传递的是实参的 ,引用调用传 递的是实参的 。
9
二、填空题(续1)
2.6 文法的终结符集和 的交集一定为 。词法分析器交 给语法分析器的文法符号一定是 ,它只能出现在产生式的 部。 2.7 主流程序设计语言均采用静态作用域和 原则,为此类语 言的编译器设计的符号表应具有 的性质。 2.8 LR(1)分析法中,L的含义是 ,R的含义是 ,1的含义 是 。 2.6 非终结符集、空、终结符、右 2.7 最近嵌套、后进先出 2.8 自左向右扫描输入、最右推导的逆、确定下一个动作向前 看1个终结符
解:(无论是求短语还是计算值,首先 应该给出它们的分析树,因为分析树是 分析过程和句子结构的最直观表示) (a) 短语:T+F,(T+F),id,(T+F)*id 直短:T+F,id,句柄 :T+F (b)句子a*b+c*d的四元式组: (1) (+, b, c, t1) E t3 (2) (*, a, t1, t2) (3) (*, t2, d, t3) E t2 * T (c) 将a=3,b=5,c=7,d=8 代入四元式组, E * T t1 得计算结果:288
13
三、计算题(3.2) 3.2 有文法G如下(注:G中终结符id仅由单个英文字母组成,如 a, b等):E→E*T|T T→T+F|F F→(E)|id 和G的语法制导翻译如下:
E→E1*T | T T→T1+F | F F→(E) | id {E.place=newtemp; emit(*,E1.place,T.place,E.place;} {E.place=T.place;} {T.place=newtemp; emit(+,T1.place,F.place,T.place;} {T.place=F.place;} {F.place=E.place;} {F.place=id.name;}
6
一、简答题(续1)
1.4 试证明正规式(ab)*a与a(ba)*是等价的。 1.5 什么是规范句型的活前缀?活前缀一定是句柄吗? 1.4 证明: 考虑L((ab)*a)中的任意一个串ababab...aba, 由串连接的结合性可得:a(ba)(ba)(b...a)(ba),它恰 好属于L(a(ba)*), 即L((ab)*a)= L(a(ba)*)。 也可以用归纳法证明(提示:以ab重复0次、1次作为归 纳基础,假设ab重复n次成立,证明ab重复n+1次也成立)。 1.5 解:不包含句柄之后任意符号的前缀,不一定是。
17
B
3.6 已知一个NFA如图。 (a) 用自然语言简要叙述该自动机所识别的语言 a,b a,b 的特点,列举两个它可识别的串。 b b (b) 写出与该自动机等价的正规式r。 0 1 2 (c) 用子集法构造识别r的最小DFA。 解: (a) 语言特点是包含子串“bb”的ab符号串。如abba、abbbab。 (b) r =(a|b)*bb(a|b)* (c) 关键步骤:确定化、最小化 a b 1.确定化:子集法构造DFA(用状态矩阵表示)
试 题 讲 解
5
一、简答题 1.1 有哪些方法可以去除文法的二义性。 1.2 写出 -((a+b)*c)+d 的后缀式。 1.3 给出布尔表达式A or B、A and B和not B短路计算的控制 逻辑。
1.1 (1)改写文法 (2)规定文法符号的优先级和结合性 1.2 ab+c*@d+(或ab+c*-d+) 1.3 A or B: if A then true else B A and B: if A then B else false not A: if B then false else true
2.9 FIRST(S)= {e,d,ε,a,b} ,FIRST(D)= {a,b} FIRST(T)= {ε,a,b} ,FIRST(R)= {d,ε} 。 2.10 {ambncn|m≥0, n≥1}。 2.11 右值(或值)、左值(或地址)。
,
11
二、填空题(续3) 2.12 为数组声明a:array[1..4, 2..3]中a分配的存储空间的首 地址为base_a,且每个数组元素占据一个存储单元。若以行为 主存放,数组元素a[3, 3]在存储空间中相对base_a的偏移量 是 ;若以列为主存放,数组元素a[3, 3]在存储空间中相对 base_a的偏移量是 。 2.12 以行为主存放,数组元素a[3, 3]在存储空间中相对base_a 的偏移量是 5 ; 以列为主存放,数组元素a[3, 3]在存储空间中相对base_a 的偏移量是 6 。
a
{0} A {0,1} B {0,1,2} C {0,2} D {0} A {0} A {0,2} D {0,2} D
三、计算题(3.4)
b {0,1} B {0,1,2} C {0,1,2} C
Βιβλιοθήκη Baidu{0,1,2} C
A B C D
A A D D
B C C C
得到DFA如右(其中,C和D中含NFA的终态,故C和D是DFA的终态) 18
三、计算题(3.4) 2.最小化DFA:(利用可区分概念) 原始划分(两个组):1={A,B} 2={C,D} 考察所有状态转移: move(A,a) = A, move(B,a) = B move(A,b) = B, move(B,b) = C move(C,a) = D, move(D,a) = C move(C,b) = D, move(D,b) = C 根据可区分概念将1分割成两个组1和3,得到: 1={A} 2={C,D} 3={B} 由于状态 C 和D 不可区分,因此可将 C、D 合并为 一个状态且选C作代表,得到最小DFA如右。 对应的图形表示如下。
复习什么?
1. 2. 3. 4. 概述 词法分析 语法分析 语法制导翻译生成中间代码 语法与语义、属性 语义规则的两种表现形式:语法制导定义、翻译方案 中间代码:特点,为什么需要中间代码,常见中间代码 形式(后缀式、树、三地址码) 符号表:作用 声明语句的翻译:查填符号表 变量声明 过程声明(左值、右值、作用域、参数传递) 可执行语句的翻译:生成中间代码 算术表达式与赋值语句; 数组元素的引用:地址计算(不变部分、可变部分) 布尔表达式的短路计算翻译; 拉链与回填; 4 控制语句的翻译
a<b N 结束
b, -, d, -, z, -, -,
103) 108) 105) 101) t1) x) 101)
N
Y c<d Y x:=y+z
或:
101 102 103 104 105 106 107 108 if a<b goto 103 goto 108 if c<d goto 105 goto 101 t1 := y+z x := t1 goto 101 ...
7
一、简答题(续2) 1.6 给出语句while (a<b) do if (c<d) then x:= y+z的中间 开始 代码序列。 解:程序流程图: 中间代码: 101 (j<, a, 102 (j, -, 103 (j<, c, 104 (j, -, 105 (+, y, 106 (:=, t1, 107 (j, -, 108 ...
2
复习什么?
1. 概述:编译器、解释器,汇编,反编译,反汇编,交叉汇 编,编译阶段,编译前端(分析)、后端(综合) 2. 词法分析 • 基本概念:正规式、正规集、有限自动机,词法分析器 的构造 • 常见计算题类型:已知集合求正规式、DFA;已知正规 式求DFA、集合;已知NFA(DFA)求正规式、集合;NFA 的确定化、最小化。 3. 语法分析 • 基本概念:上下文无关文法(CFG)、语言,句子、句 型,最左推导、最右推导,句柄,下推自动机(PDA), 自上而下分析(递归下降法、预测分析法)与自下而上 分析(移进-归约分析); • 一些必要的定义和算法的核心思想等; • 常见的计算题类型:计算FIRST、FOLLOW集合,构造句 子的分析树(语法树),构造预测分析表,构造识别文 法活前缀的DFA。 3
三、计算题(3.2)
E E * T F ( E ) T T + F
F d
T F id
(T+F)*id 的分析树
a*b+c*d的分析树
15
三、计算题(3.2) (d) E→E*T|T,T→T+F|F,F→id的识别活前缀的DFA:
E’→.E I0 E E’→E. I1 * E→E.*T E→.E*T E→.T T→.T+F T E→T. I2 T→.F T→T.+F F→.id F F T→F. I3 id id F→id. I4 id
以阶段划分编译器
源程序 词法分析 语法分析 出 语义分析 中间代码生成 代码优化 目标代码生成 目标代码
1
符 号 表 管 理
错 处 理
基本情况
题型: • 简答题(30分) • 填空题(20分) • 计算题(50分) 内容分布: • 概述与词法分析(约30分) • 语法分析(约40分) • 语法制导翻译生成中间代码(约30分)
(也可以先给出语句的分析树,然后剪句柄生成中间代码)
8
二、填空题 2.1 从程序运行的角度看,编译程序和解释程序的主要区别 是: 。 2.2 编译程序的基本组成有:词法分析、 、 、中间代码 生成、 、 、 和 。 2.3 正规式r和s等价说明 相同。 2.4 不含子串baa的所有a、b符号串的正规式是 。 2.5 规范规约(最左归约)和 是互逆的两个过程。 2.1 运行目标程序时控制权在解释程序而不在目标程序,或者 是否生成目标代码,或者是否与机器相关。 2.2 语法分析、语义分析、代码优化、目标代码生成、 符号表管理和出错处理 2.3 r和s表示的正规集 2.4 a*(b|ba)* 2.5 规范推导(或最右推导)
(a) 求句型(T+F)*id 的短语、直接短语以及句柄; (b) 根据语法制导翻译写出句子a*b+c*d的中间代码; (c) 若a=3,b=5,c=7,d=8,请给出中间代码计算结果; (d) 将文法G简化为:E→E*T|T,T→T+F|F,F→id。给出它的识 别活前缀的DFA(算法3.9)。
14
12
三、计算题 3.1 有文法G:V→id|id(E), E→E+V|V (a) 说明G不是LL(1)文法; (b) 将G改写为LL(1)文法。 解:(解题思路:LL(1)文法不能有左递归和左因子) (a) 因为FIRST(id)∩FIRST(id(E))={id},即非终结符L产生 式的两个候选项有公共左因子,所以G不是LL(1)文法。(或 答文法中有左递归) (b)消除左递归和提取左因子之后,得到G1'如下,它是LL(1) 文法。 V → id B B → ε|(E) E → V E' E' → + V E' |ε
E→E*.T T E→E*T.I7 T→T.+F T→.T+F T→.F I5 F→.id + +
T→T+.F F T→T+F. I8 F→.id I6
16
三、计算题(3.3) 3.5 设有文法G:S→aBc|bAB, A→aAb|b, B→b|ε。 <1> 计算非终结符S、A、B的FIRST和FOLLOW集合(算法 3.5,算法3.6); <2> 构造G的LL(1)分析表(算法3.7); <3> 分析输入序列baabbb(以格局的形式写出具体的分 析步骤)。 解: <1> FIRST(B) = {b,ε} FOLLOW(B) = {c,#} FIRST(A) = {a,b} FOLLOW(A) = {b,#} FIRST(S) = {a,b} FOLLOW(S) = {#} a S A b c # aBc bAB aAb b b ε ε
10
二、填空题(续2) 2.9 已知文法G定义如下: S→eT|RT T→DR|ε R→dR|ε D→a|bd 则FIRST(S)= ,FIRST(D)= ,FIRST(T)= ,FIRST(R)= 。 2.10 文法G:S→AB, A→aA|ε, B→bBc|bc,该文法描述 的语言L(G)= 。 2.11 参数传递中,值调用传递的是实参的 ,引用调用传 递的是实参的 。
9
二、填空题(续1)
2.6 文法的终结符集和 的交集一定为 。词法分析器交 给语法分析器的文法符号一定是 ,它只能出现在产生式的 部。 2.7 主流程序设计语言均采用静态作用域和 原则,为此类语 言的编译器设计的符号表应具有 的性质。 2.8 LR(1)分析法中,L的含义是 ,R的含义是 ,1的含义 是 。 2.6 非终结符集、空、终结符、右 2.7 最近嵌套、后进先出 2.8 自左向右扫描输入、最右推导的逆、确定下一个动作向前 看1个终结符
解:(无论是求短语还是计算值,首先 应该给出它们的分析树,因为分析树是 分析过程和句子结构的最直观表示) (a) 短语:T+F,(T+F),id,(T+F)*id 直短:T+F,id,句柄 :T+F (b)句子a*b+c*d的四元式组: (1) (+, b, c, t1) E t3 (2) (*, a, t1, t2) (3) (*, t2, d, t3) E t2 * T (c) 将a=3,b=5,c=7,d=8 代入四元式组, E * T t1 得计算结果:288
13
三、计算题(3.2) 3.2 有文法G如下(注:G中终结符id仅由单个英文字母组成,如 a, b等):E→E*T|T T→T+F|F F→(E)|id 和G的语法制导翻译如下:
E→E1*T | T T→T1+F | F F→(E) | id {E.place=newtemp; emit(*,E1.place,T.place,E.place;} {E.place=T.place;} {T.place=newtemp; emit(+,T1.place,F.place,T.place;} {T.place=F.place;} {F.place=E.place;} {F.place=id.name;}
6
一、简答题(续1)
1.4 试证明正规式(ab)*a与a(ba)*是等价的。 1.5 什么是规范句型的活前缀?活前缀一定是句柄吗? 1.4 证明: 考虑L((ab)*a)中的任意一个串ababab...aba, 由串连接的结合性可得:a(ba)(ba)(b...a)(ba),它恰 好属于L(a(ba)*), 即L((ab)*a)= L(a(ba)*)。 也可以用归纳法证明(提示:以ab重复0次、1次作为归 纳基础,假设ab重复n次成立,证明ab重复n+1次也成立)。 1.5 解:不包含句柄之后任意符号的前缀,不一定是。
17
B
3.6 已知一个NFA如图。 (a) 用自然语言简要叙述该自动机所识别的语言 a,b a,b 的特点,列举两个它可识别的串。 b b (b) 写出与该自动机等价的正规式r。 0 1 2 (c) 用子集法构造识别r的最小DFA。 解: (a) 语言特点是包含子串“bb”的ab符号串。如abba、abbbab。 (b) r =(a|b)*bb(a|b)* (c) 关键步骤:确定化、最小化 a b 1.确定化:子集法构造DFA(用状态矩阵表示)
试 题 讲 解
5
一、简答题 1.1 有哪些方法可以去除文法的二义性。 1.2 写出 -((a+b)*c)+d 的后缀式。 1.3 给出布尔表达式A or B、A and B和not B短路计算的控制 逻辑。
1.1 (1)改写文法 (2)规定文法符号的优先级和结合性 1.2 ab+c*@d+(或ab+c*-d+) 1.3 A or B: if A then true else B A and B: if A then B else false not A: if B then false else true
2.9 FIRST(S)= {e,d,ε,a,b} ,FIRST(D)= {a,b} FIRST(T)= {ε,a,b} ,FIRST(R)= {d,ε} 。 2.10 {ambncn|m≥0, n≥1}。 2.11 右值(或值)、左值(或地址)。
,
11
二、填空题(续3) 2.12 为数组声明a:array[1..4, 2..3]中a分配的存储空间的首 地址为base_a,且每个数组元素占据一个存储单元。若以行为 主存放,数组元素a[3, 3]在存储空间中相对base_a的偏移量 是 ;若以列为主存放,数组元素a[3, 3]在存储空间中相对 base_a的偏移量是 。 2.12 以行为主存放,数组元素a[3, 3]在存储空间中相对base_a 的偏移量是 5 ; 以列为主存放,数组元素a[3, 3]在存储空间中相对base_a 的偏移量是 6 。
a
{0} A {0,1} B {0,1,2} C {0,2} D {0} A {0} A {0,2} D {0,2} D
三、计算题(3.4)
b {0,1} B {0,1,2} C {0,1,2} C
Βιβλιοθήκη Baidu{0,1,2} C
A B C D
A A D D
B C C C
得到DFA如右(其中,C和D中含NFA的终态,故C和D是DFA的终态) 18
三、计算题(3.4) 2.最小化DFA:(利用可区分概念) 原始划分(两个组):1={A,B} 2={C,D} 考察所有状态转移: move(A,a) = A, move(B,a) = B move(A,b) = B, move(B,b) = C move(C,a) = D, move(D,a) = C move(C,b) = D, move(D,b) = C 根据可区分概念将1分割成两个组1和3,得到: 1={A} 2={C,D} 3={B} 由于状态 C 和D 不可区分,因此可将 C、D 合并为 一个状态且选C作代表,得到最小DFA如右。 对应的图形表示如下。
复习什么?
1. 2. 3. 4. 概述 词法分析 语法分析 语法制导翻译生成中间代码 语法与语义、属性 语义规则的两种表现形式:语法制导定义、翻译方案 中间代码:特点,为什么需要中间代码,常见中间代码 形式(后缀式、树、三地址码) 符号表:作用 声明语句的翻译:查填符号表 变量声明 过程声明(左值、右值、作用域、参数传递) 可执行语句的翻译:生成中间代码 算术表达式与赋值语句; 数组元素的引用:地址计算(不变部分、可变部分) 布尔表达式的短路计算翻译; 拉链与回填; 4 控制语句的翻译
a<b N 结束
b, -, d, -, z, -, -,
103) 108) 105) 101) t1) x) 101)
N
Y c<d Y x:=y+z
或:
101 102 103 104 105 106 107 108 if a<b goto 103 goto 108 if c<d goto 105 goto 101 t1 := y+z x := t1 goto 101 ...
7
一、简答题(续2) 1.6 给出语句while (a<b) do if (c<d) then x:= y+z的中间 开始 代码序列。 解:程序流程图: 中间代码: 101 (j<, a, 102 (j, -, 103 (j<, c, 104 (j, -, 105 (+, y, 106 (:=, t1, 107 (j, -, 108 ...
2
复习什么?
1. 概述:编译器、解释器,汇编,反编译,反汇编,交叉汇 编,编译阶段,编译前端(分析)、后端(综合) 2. 词法分析 • 基本概念:正规式、正规集、有限自动机,词法分析器 的构造 • 常见计算题类型:已知集合求正规式、DFA;已知正规 式求DFA、集合;已知NFA(DFA)求正规式、集合;NFA 的确定化、最小化。 3. 语法分析 • 基本概念:上下文无关文法(CFG)、语言,句子、句 型,最左推导、最右推导,句柄,下推自动机(PDA), 自上而下分析(递归下降法、预测分析法)与自下而上 分析(移进-归约分析); • 一些必要的定义和算法的核心思想等; • 常见的计算题类型:计算FIRST、FOLLOW集合,构造句 子的分析树(语法树),构造预测分析表,构造识别文 法活前缀的DFA。 3