胡元义版编译原理课后习题答案
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图8-1 分程序索引表和符号表示意图
第八章 符号表与错误处理 8.5 已知文法G[S]: S→while (e) S S→{L}
S→a
L→S;L L→S
/*a代表赋值句*/
构造该文法的LR型的错误校正分析程序。
第八章 符号表与错误处理 【解答】 首先将文法G[S]拓广为G[S′]:(0) S′→S (1) S→while e do S
第八章 符号表与错误处理 I3 : S→begin· end L I11:S→while e do S· L→· S I12:L→S;L· L→· S;L S→· a S→· begin L end S→· while e do s
S→· while e do s
S→· begin L end S→· a
第八章 符号表与错误处理
第八章 符号表与错误处理
8.1 完成下列选择题: (1) 编译程序使用 区别标识符的作用域。
a. 说明标识符的过程或函数名
b. 说明标识符的过程或函数的静态层次
c. 说明标识符的过程或函数的动态层次 d. 标识符的行号
第八章 符号表与错误处理 (2) 在目标代码生成阶段,符号表用于 a. 目标代码生成 c. 语法检查 b. 语义检查 d. 地址分配 。 。
procedure setup(ns:integer, check:real);
var k, l:integer; function nt:integer):integer; total(var at:integer,
var i, sum:integer;
第八章 符号表与错误处理 begin for i:=1 to nt do sum:=sum+at[i]; total:=sum; end; begin
(3) 错误的局部化是指 a. 把错误理解成局部的错误
b. 对错误在局部范围内进行纠正
c. 当发现错误时,跳过错误所在的语法单位继续分析 下去
d. 当发现错误时立即停止编译,待用户改正错误后再 继续编译
【解答】 (1) b (2) d (3) c
第八章 符号表与错误处理 8.2 在编译过程中为什么要建立符号表? 【解答】 在编译过程中始终要涉及到对一些语法符
I9:S→begin L end·
将这些项目集的转换函数GO表示为如图8-2所示的 DFA。
第八章 符号表与错误处理
S I0 a begin I3 a S ; I4 I7 a s I10 while I2 I1 e while I5 do begin I8 S I11
begin while L
符号“end”与状态9压栈,显示出错信息“缺少end”。
(8) 缺少语句错误处理e7 :将假想符号a插入未扫 描的输入串首,显示出错信息“缺少语句”。
源自文库
号的处理,这就需要用到语法符号的相关属性。为了在需
要时能找到这些语法成分及其相关属性,就必须使用一些 表格来保存这些语法成分及其属性,这些表格就是符号表。
8.3
处理的?
对出现在各个分程序中的标识符,扫描时是如何
第八章 符号表与错误处理 【解答】 法如下: 对扫描到各分程序中的标识符的处理方
所有外层分程序的符号表都无法找到此标识符,则表
明程序中使用了一个未经说明(定义)的标识符,此时 可按语法错误予以处理。
第八章 符号表与错误处理 8.4 对下列程序,当编译程序编译到箭头所指位 置时,画出其层次表(分程序索引表)和符号表: program stack(output); var m, n:integer; r:real;
l:=27+total(a,ns);
end; begin n:=4; setup(n,5.75)
<-----------------
end.
第八章 符号表与错误处理 【解答】 编译程序编译到箭头所指位置时,其层
次表(分程序索引表)和符号表如图8-1所示。
第八章 符号表与错误处理
11 10 9 8 7 6 5 4 3 2 1 nt at total l k check ns setup r n m 变量名 符号表 属性 10 5 1 分程序索引表
I6
end
I9 while L I12 a
begin
图8-2 习题8.5中文法G[S′]的DFA
第八章 符号表与错误处理 在 LR(0) 项 目 集 规 范 族 中 , 只 有 I7 含 有 “ 移 进”/“归约”冲突,且该冲突可用SLR(1)方法解决。
为此计算文法G[S′]中每个非终结符的FOLLOW集如下:
FOLLOW(S′)={#} FOLLOW(S)={end,;,#} FOLLOW(L)={end} 由此构造出包括错误校正处理子程序的SLR(1)分
析表如表8-1所示。
第八章 符号表与错误处理 表8-1 习题8.5的SLR(1)分析表
状态 while 0 1 2 3 4 5 6 7 8 9 10 11 12 s2 e0 e0 s2 e4 e5 e6 e4 s2 e4 s2 e4 e6 begin s3 e0 e1 s3 e4 e5 e6 e4 s3 e4 s3 e4 e6 do e0 e0 e3 e0 e0 s8 e0 e0 e0 e0 e0 e0 e0 ACTION end e0 e0 e0 e2 r3 e0 s9 r4 e2 r2 e2 r1 r5 a s4 e0 e1 s4 e4 e5 e6 e4 s4 e4 s4 e4 e6 ; e0 e0 e0 e2 r3 e0 e6 s10 e2 r2 e0 r1 e6 e e0 e0 s5 e0 e0 e0 e0 e0 e0 e0 e0 e0 e0 # e7 acc e1 e2 r3 e1 e6 e4 e2 r2 e2 r1 e6 7 12 11 7 6 S 1 GOTO L
S→· begin L end L→· S;L S→· a S→· while e do S
I6 : S→begin L· end I7:L→S·
I1:S′→S·L→S·;L S→· begin L end
I2 : S→while· do s e S→· a I8 : S→while e do· S
(2) S→begin L end
(3) S→a (4) L→S (5) L→S;L
第八章 符号表与错误处理 则文法G[S′]的LR(0)项目集示范族为 I0:S′→· S I4:S→a· do S I10:L→S;· L I5 : S→while e· do s S→· while e L→· S
第八章 符号表与错误处理 由表中可以看出,在状态7面对输入符号为“;” 时 移 进 , 而 面 对 输 入 符 号 为 “ end” 时 为 归 约 。 表 中 ei(i=1~7)代表不同的错误处理子程序,其含义和功能 分别如下: (1) 输出符号错处理程序e0:删除当前输入符号,
显示出错信息“输入符号错”。
(2) 输入不匹配错误处理程序e1:去除栈顶状态和 栈顶符号,显示出错信息“输入不匹配”。 (3) 缺语句错误处理程序e2:将假想符号a与状态4 压栈,显示出错信息“缺少语句”。 (4) while语句缺少布尔量处理程序e3:将假想符号 e与状态5压栈,显示出错信息“缺布尔量”。
第八章 符号表与错误处理 (5) 缺少分号错误处理程序e4:将分号“;”插入 未扫描的输入串首,显示出错信息“缺少分号”。 (6) while语句缺少do处理程序e5:将符号“do”与 状态8压栈,显示出错信息“缺少do”。 (7) begin与end不配对,缺少end处理程序e6 :将
(1) 当在一个分程序首部某说明中扫描到一个标
识符时,就以此标识符查找相应于本层分程序的符号 表。如果符号表中已有此名字的登记项,则表明此标
识符已被重复说明(定义),应按语法错误进行处理;
否则,在符号表中新登记一项并将此标识符及有关信 息(种属、类型、所分配的内存单元地址等)填入。
第八章 符号表与错误处理 (2) 当在一分程序的语句中扫描到一个标识符时, 首先在该层分程序的符号表中查找此标识符;若查不 到,则继续在其外层分程序的符号表中查找。如此下 去,一旦在某一外层分程序的符号表中找到标识符, 则从表中取出有关的信息并作相应的处理;如果查遍