------感谢某学长的辛勤劳动,我整理一下并附上答案发到博客上
一、选择
1. 文法G:S->xSx | y所识别的语言:
a. xyx b. (xyx)* c. x^nyx^n(n>=0) d.x*yx*
2. 由文法的开始符经0步或者多步推到产生的文法符号序列是:
a. 短语 b.句柄 c. 句型 d. 句子
3. 规范规约指:
a. 最左推导的逆过程 b. 最右推导的逆过程
c.规范推导 d. 最左归约的逆过程
4. 词法分析器的输出结果是:
a.单词的种别编码 b. 单词在符号表的位置
c. 单词的种别编码和自身值 d. 单词自身值
5. 正规式M1和M2等价是指:
a. M1和M2的状态数相等 b. M1和M2的有向弧数相等
c. M1和M2所识别的语言集相等 d. M1和M2状态数和有向弧相等
二、填空
1. 编译过程的5个阶段分别是:词法分析,语法分析,语义分析与中间代码生产,代码优化,目标代码生成。
2. 文法中的终结符和非终结符的交集是 空集 。词法分析交给语法分析器的文法符号是 终结符 ,它一定出现在产生式的 右部 。
3. 采用 自顶向下 语法分析时,必须消除文法的左递归。
4. 自下而上分析法采用 移入 、规约、错误处理、 接收 等四种操作。
5. Chomsky把文法分为 4 种类型,编译器构造中采用 2型 文法和 3型 文法,它们分别产生上下文无关 语言和 正则 语言,并分别用 不确定的下推 自动机和 有穷 自动机识别所产生的语言。
6. 常用的两种动态存储分配办法是 栈式 动态分配和 堆式 动态分配。
三、简答:
1. 什么是L-属性定义?
答: 一个语法制导定义SDD是L-属性定义,如果∀A→X1X2…Xn∈P,其每一个语义规则中的每一个属性要么是一个综合属性,要么是Xj(1≤j ≤ n)的一个继承属性,这个继承属性仅依赖于下列属性:
- 产生式中Xj的左边符号X1,X2,…Xj-1的属性;
- A的继承属性。
2. 什么是活动?什么事活动记录?活动记录主要由哪些构成?
答: 过程体的每次执行称为该过程的一个活动
过程每执行一次,就为它分配一块连续存储区,用来管理过程一次执行所需的信息,这块连续存储区称为活动记录(Activation record)
这些活动记录在函数调用过程中生成
活动记录由:实参,临时数据,返回值,控制链,访问链,保存的机器状态,局部数据组成。
下面的题难度不大,很常规,而且不方便写,我就不写答案了~
四:给定文法G[s]:S->(L)|aS|a,
L->L,S|S
将G[s]改造成LL(1)文法,并给出LL(1)分析表。
(1) 消除左递归和回溯。
(2) 计算各非终结符的First集和Follow集以及候选式的Select集
(3) 构造预测分析表
五:给定文法G[s]:S->Aa|dAb|Bb|dBa
A->c
B->c
(1) 构造识别文法G[s]活前缀的LK(1)项目的DFA
(2) 构造LR(1)分析表
六、翻译成中间代码:
while a>b do if a>0 thena:=a-1 else a:=a+1
七、B:=3
D:=A+C
E:=A*C
F:=E+D
G:=B*F
H:=A+C
I:=A*C
J:=H+1
K:=B*5
L:=K+J
M:=L
构造DAG,根据DAG重建优化后的四元式序列(假设变量G、L、M在基本块出口之后活跃)
本文深入探讨了编程语言的基础概念,包括文法、编译过程、词法分析、语法分析、语义分析以及LL(1)和LR(1)文法分析,同时涵盖了中间代码生成、动态存储分配等关键内容。文章还详细介绍了如何将给定文法转换为LL(1)和LR(1)形式,并构建分析表。最后,通过实际代码示例展示了中间代码的翻译和优化过程。
7087

被折叠的 条评论
为什么被折叠?



