【编译原理】第三、四、五章(语法/语义分析,中间代码生成/优化)

编译原理期末复习题(第二部分)

1.期末试卷题型

全部为解答题,共11道!
无选择、判断、填空题

2.考点集锦

第三章 语法分析

1.语法分析的任务、方法、分析依据
2.形式语言分类
3.文法、语言、句型、句子
4.短语、直接短语、素短语、句柄,语法树
5.规范推导、规范规约
6.项目和项目集规范族
7.文法二义性的判定
8. 消除文法的左递归和回溯
9. 构造文法的递归下降分析程序
10. LL(1)分析法(构造FIRST集和FOLLOW 集、构造分析表、LL(1)文法的判定、分析过程)
11. LR分析法(LR(0),SLR(1)分析表的构造, SLR(1)文法的判定、分析过程)

第四章 语义分析与中间代码生成

1.语义分析的任务、方法、分析依据
2.语法制导翻译,语义规则,带注释的语法分析树
3.文法符号的属性分类、四元式
4.算数表达式、布尔表达式的翻译
5.控制语句的翻译(if-else、while、for,依据代码结构图给出四元式序列)

第五章 代码优化

1.代码优化的含义、目的、种类
2.基本块的定义、划分方法(入口、出口)
3.基本块的DAG优化方法

3.各章例题集锦

第三章
——> 题型一:计算First/Follow集

1.计算下列文法的FIRST和FOLLOW集合
G[S]: S→S ( S ) S | ε

答:修改文法为:
G’[S]: S→S’
S’→ ( S ) SS’ | ε
First(S)= {ε,(}
First(S’)= {ε,(}
Follow(S)= {#,(,)}
Follow(S’)= {#,(,)}

——> 题型二:LL(1)——自顶向下分析法

2.为下面的文法设计一个预测分析器,给出预测分析表。
bexpr → bexpr or bterm | bterm
bterm → bterm and bfactor | bfactor
bfactor → not bfactor | (bexpr) | true | false
答:
修改文法为:
bexpr → bterm A
A → or bterm A | ε
bterm → bfactor B
B → and bfactor B | ε
bfactor → not bfactor | (bexpr) | true | false
则文法的FIRST和FOLLOW集合如下:
First(bexpr)= { not,) ,true,false }
First(A)= { ε,or  }
First(bterm)= { not,) ,true,false }
First(B)= { ε,and }
First(bfactor)= { not,) ,true,false }
Follow(bexpr)= { #,) }
Follow(A)= { #,) }
Follow(bterm)= { #,or,) }
Follow(B)= { #,or ,) }
Follow(bfactor)= { #,or,) ,and }
则文法的预测分析表(LL(1))如下:

项目andornottruefalse
bexpr→ bterm A→ bterm A→ bterm A→ bterm A
→ or bterm A→ ε→ ε
bterm→ bfactor B→ bfactor B→ bfactor B→ bfactor B
→ and bfactor B→ ε→ ε→ ε
bfactor→ not bfactor→ (bexpr)→ true→ false

——> 题型三:规范推导,语法树,二义性等

3.考虑上下文无关文法:
S→S S+|S S |a
以及串 aa+a

1)给出这个串的规范推导。
2)给出这个串的语法分析树。
3)这个文法是否为二义性的?证明你的回答。
4)描述这个文法生成的语言。
答:
1)
最左推导:
S→ SS*
→ SS+S*
→ aS+S*
→ aa+S*
→ aa+a* 
最右推导:
S→ SS*
→ Sa* 
→ SS+a*
→ Sa+a*
→ aa+a*

2)给出这个串的一棵语法分析树。
图1

3)这个文法是否为二义性的?证明。
没有二义性 。因为最左推导和最右推导只能画出一颗语法分析树。

4)描述这个文法生成的语言。
只含+或*,操作数均为a,的表达式的后序遍历。
{a,aa+,aa*,aaa+,aaa*,aa+aa*+,aaaa+,...}

——> 题型四:规范推导,语法树,二义性等

4.已知文法G(S):
S—>a|(T)
T—>T,S|S
①给出句子(a,(a,a))的最左推导并画出语法树;
②给出句型(T,a,(T))所有的短语、直接短语、素短语、最左素短语、句柄和活前缀。
答:
(1)最左推导:
S→(T)
→(T,S)
→(S,S)
→(a,S)
→(a,(T))
→(a,(T,S))
→(a,(S,S))
→(a,(a, S))
→(a,(a,a))
语法树如下:
在这里插入图片描述
(2)句型(T, a, (T))的短语、直接短语、素短语、最左素短语、句柄、活前缀。
短语:a || T , a || (T) || T  ,  a  ,  (T) || (T  ,  a  ,  (T))
直接短语:a || (T)
素短语:a || (T)
最左素短语:a
句柄:a
活前缀: || ( || (T || (T  ,  || (T  ,  a
语法树如下:
在这里插入图片描述

——> 题型五:SLR(0)——自低向上分析法

1.以下文法是SLR文法吗?若是给出分析表,若不是说明理由。
S→ SS+ | SS* | a
答:
文法扩展为:
S→ S’
S’→ SS+
S’→ SS*
S’→ a

写出项目集规范簇,然后画出DFA(略),这是一个SLR文法。
最后写出SLR(0)分析表,如下:

状态S
S2
S2acc
r3r3r3r3
S4S5
r1r1r1r1
r2r2r2r2

2.构造该文法的SLR(1) 分析表:
G[S]:S→bAS | bA
A→aSc
答:
拓广文法为:
G’[S’]:(0) S’→S
(1) S→bAS
(2) S→bA
(3) A→aSc

FOLLOW(S’) ={#};
FOLLOW(A) ={b};
FOLLOW(S) ={c};
FOLLOW(S) ={c, #};
FOLLOW(A) ={b, c, #}。

项目集规范簇构成的DFA如下:
在这里插入图片描述

SLR(0)分析表如下:
在这里插入图片描述
第四章
——> 题型一:根据语法制导翻译,写出带注释的语法分析树

1.对于下图的语法制导定义,给出对应的带注释语法分析树。
在这里插入图片描述
(1) int a,b,c
(2) float w, x, y, z

答:带注释的语法分析树如下:
(1) int a,b,c在这里插入图片描述
(2)float w, x, y, z
在这里插入图片描述
2.输入串 3*5+4# 的带注释语法树,语法制导如下图

在这里插入图片描述
答:
带注释的语法分析树如下:
在这里插入图片描述

——> 题型二:高级语言翻译为四元式

1.将下面的语句翻译成四元式:if(x>y) if(a∧b) m=m+1; else m=m-1; else x=y;
答:
代码结构图如下:
在这里插入图片描述
四元式如下:
在这里插入图片描述
2.将下面的语句翻译成四元式:
在这里插入图片描述
答:
代码结构图如下:
在这里插入图片描述
四元式如下:
在这里插入图片描述

3.将下面的语句翻译成四元式。要求:给出语句的代码结构图及四元式序列,假设该四元式序列从100开始编号。
n=1;
s=1;
for ( i=2; i<=64; i++)
{
n=n*2;
if(a∧b∨c>d))
s=s+n+1;
}
答:
代码结构图如下:
在这里插入图片描述
四元式如下:
在这里插入图片描述

第五章
——> 题型一:划分基本块,构造流程图

1.将下面程序划分为基本块并作出其程序流图。
read(A,B)
F=1
C=A * A
D=B * B
if C<D goto L1
E=A * A
F=F+1
E=E+F
write(E)
halt
L1: E=B * B
F=F+2
E=E+F
write(E)
if E >100 goto L2
halt
L2: F=F-1
goto L1
答:
划分的基本块如下:
read(A,B)
F=1
C=A * A
D=B * B
if C<D goto L1
——————
E=A * A
F=F+1
E=E+F
write(E)
halt
——————
L1: E=B * B
F=F+2
E=E+F
write(E)
if E >100 goto L2
——————
halt
——————
L2: F=F-1
goto L1
流程图如下:
在这里插入图片描述

——> 题型二:利用DAG图优化代码段

2.试构造以下基本块的DAG:
  (1)  T0=3.14
  (2)  T1=2* T0
  (3)  T2=R+r
  (4)  A=T1* T2
  (5)  B=A
  (6)  T3=2* T0
  (7)  T4=R+r
  (8)  T5=T3* T4
  (9)  T6=R−r
  (10)  B= T5* T6
答:按照算法顺序处理每一四元式后构造出的DAG如图所示,其中每一子图(1)、(2)、…、(10)分别对应四元式(1)~(10)的DAG构造。
在这里插入图片描述
假设图中T0、T1、T2、T3、T4、T5和T6在基本块后都不会被引用,则图中的DAG就可重写为如下的四元式序列:
  (1)  S1=R+r    / * S1、S2为存放中间结果的临时变量 * /
  (2)  A=6.28* S1
  (3)  S2=R−r
  (4)  B=A* S2
  
2.设有基本块如下:
T1:=S+R
T2:= 3
T3:= 12/T2
T4:=S/R
A:=T1-T4
T5:=S+R
B:=T5
T6:=T5* T3
B:=T6
(1)画出DAG图;
(2)设A,B是出基本块后的活跃变量,请给出优化后的四元式序列。
答:
在这里插入图片描述

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
词法分析、语法分析、语义分析中间代码生成编译原理中的重要概念。 词法分析是编译过程的第一步,它将输入的源代码分割成一系列的单词(也称为词法单元),并生成对应的词法单元流。词法分析器根据预先定义的词法规则来识别各个单词,并将其转化为相应的词法单元。这一过程中,识别出的单词可能会被舍弃,而只保留有意义的词法单元。 语法分析是编译过程的第二步,它将词法单元流转化为语法分析树或语法分析图。语法分析器使用一种称为文法的形式化规则来描述源代码的结构,然后根据这些规则来确定源代码是否符合定义的文法规则。如果源代码符合文法规则,则进行语法分析;否则,报告语法错误。 语义分析是编译过程的第三步,它通过对语法树或语法图进行分析,确定源代码中的语义结构是否合法。语义分析器会检查语法分析结果中的各种语义规则,如变量的声明和使用规则、函数调用规则等。如果发现违反语义规则的情况,报告语义错误。 中间代码生成是编译过程的第步,它将经过语义分析的源代码转化为一种中间表示形式,通常是一种与源代码和目标代码无关的高级语言形式。中间代码生成器根据语法树或语法图,将源代码转化为中间代码。这些中间代码可以方便后续阶段进行代码优化和目标代码生成。 总之,词法分析、语法分析、语义分析中间代码生成是编译器的核心组成部分。词法分析将源代码转化为词法单元流,语法分析确定源代码的语法结构,语义分析检查源代码的语义结构是否合法,中间代码生成将经过语义分析的源代码转化为中间表示形式。这些步骤协同工作,最终将源代码转化为可执行的目标代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KirinLee_01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值