您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 人事档案/员工关系 > 第八章 符号表与错误处理
第八章符号表与错误处理第八章符号表与错误处理8.1完成下列选择题:(1)编译程序使用区别标识符的作用域。a.说明标识符的过程或函数名b.说明标识符的过程或函数的静态层次c.说明标识符的过程或函数的动态层次d.标识符的行号第八章符号表与错误处理(2)在目标代码生成阶段,符号表用于。a.目标代码生成b.语义检查c.语法检查d.地址分配(3)错误的局部化是指。a.把错误理解成局部的错误b.对错误在局部范围内进行纠正c.当发现错误时,跳过错误所在的语法单位继续分析下去d.当发现错误时立即停止编译,待用户改正错误后再继续编译【解答】(1)b(2)d(3)c第八章符号表与错误处理8.2在编译过程中为什么要建立符号表?【解答】在编译过程中始终要涉及到对一些语法符号的处理,这就需要用到语法符号的相关属性。为了在需要时能找到这些语法成分及其相关属性,就必须使用一些表格来保存这些语法成分及其属性,这些表格就是符号表。8.3对出现在各个分程序中的标识符,扫描时是如何处理的?第八章符号表与错误处理【解答】对扫描到各分程序中的标识符的处理方法如下:(1)当在一个分程序首部某说明中扫描到一个标识符时,就以此标识符查找相应于本层分程序的符号表。如果符号表中已有此名字的登记项,则表明此标识符已被重复说明(定义),应按语法错误进行处理;否则,在符号表中新登记一项并将此标识符及有关信息(种属、类型、所分配的内存单元地址等)填入。第八章符号表与错误处理(2)当在一分程序的语句中扫描到一个标识符时,首先在该层分程序的符号表中查找此标识符;若查不到,则继续在其外层分程序的符号表中查找。如此下去,一旦在某一外层分程序的符号表中找到标识符,则从表中取出有关的信息并作相应的处理;如果查遍所有外层分程序的符号表都无法找到此标识符,则表明程序中使用了一个未经说明(定义)的标识符,此时可按语法错误予以处理。第八章符号表与错误处理8.4对下列程序,当编译程序编译到箭头所指位置时,画出其层次表(分程序索引表)和符号表:programstack(output);varm,n:integer;r:real;proceduresetup(ns:integer,check:real);vark,l:integer;functiontotal(varat:integer,nt:integer):integer;vari,sum:integer;第八章符号表与错误处理beginfori:=1tontdosum:=sum+at[i];total:=sum;end;beginl:=27+total(a,ns);-----------------end;beginn:=4;setup(n,5.75)end.第八章符号表与错误处理【解答】编译程序编译到箭头所指位置时,其层次表(分程序索引表)和符号表如图8-1所示。第八章符号表与错误处理ntattotallkchecknssetuprnm变量名属性1110987654321符号表1510分程序索引表图8-1分程序索引表和符号表示意图第八章符号表与错误处理8.5已知文法G[S]:S→while(e)SS→{L}S→a/*a代表赋值句*/L→S;LL→S构造该文法的LR型的错误校正分析程序。第八章符号表与错误处理【解答】首先将文法G[S]拓广为G[S′]:(0)S′→S(1)S→whileedoS(2)S→beginLend(3)S→a(4)L→S(5)L→S;L第八章符号表与错误处理则文法G[S′]的LR(0)项目集示范族为I0:S′→·SI4:S→a·I10:L→S;·LS→·whileedoSI5:S→whilee·dosL→·SS→·beginLendI6:S→beginL·endL→·S;LS→·aI7:L→S·S→·whileedoSI1:S′→S·L→S·;LS→·beginLendI2:S→while·edosI8:S→whileedo·SS→·a第八章符号表与错误处理I3:S→begin·LendS→·whileedosI11:S→whileedoS·L→·SS→·beginLendI12:L→S;L·L→·S;LS→·aS→·whileedosI9:S→beginLend·S→·beginLendS→·a将这些项目集的转换函数GO表示为如图8-2所示的DFA。第八章符号表与错误处理awhileLas;beginendLSawhilebeginabeginbeginSdoewhileSwhileI1I0I2I5I8I11I3I6I9I4I7I10I12图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)分析表ACTIONGOTO状态whilebegindoenda;e#SL0s2s3e0e0s4e0e0e711e0e0e0e0e0e0e0acc2e0e1e3e0e1e0s5e13s2s3e0e2s4e2e0e2764e4e4e0r3e4r3e0r35e5e5s8e0e5e0e0e16e6e6e0s9e6e6e0e67e4e4e0r4e4s10e0e48s2s3e0e2s4e2e0e2119e4e4e0r2e4r2e0r210s2s3e0e2s4e0e0e271211e4e4e0r1e4r1e0r112e6e6e0r5e6e6e0e6第八章符号表与错误处理由表中可以看出,在状态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:将符号“end”与状态9压栈,显示出错信息“缺少end”。(8)缺少语句错误处理e7:将假想符号a插入未扫描的输入串首,显示出错信息“缺少语句”。
本文标题:第八章 符号表与错误处理
链接地址:https://www.777doc.com/doc-3155978 .html