如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
第十章语义分析和代码生成••语义分析的概念语义分析的概念••栈式抽象机及其汇编指令栈式抽象机及其汇编指令••声明的处理声明的处理••表达式的处理表达式的处理••赋值语句的处理赋值语句的处理••控制语句的处理控制语句的处理••过程调用和返回过程调用和返回北京航空航天大学计算机学院11假定:•源语言:通用的过程语言•生成代码:栈式抽象机的(伪)汇编程序•翻译方法:自顶向下的属性翻译•语法成分翻译子程序参数设置:–继承属性为值形参–综合属性为变量形参•语法成分翻译动作子程序参数设置:–继承属性为值形参–综合属性不设形参,而作为动作子程序的返回值(由RETURN语句返回)北京航空航天大学计算机学院2210.1语义分析的概念1、上下文有关分析:即标识符的作用域2、类型的一致性检查3、语义处理:声明语句:其语义是声明变量的类型等,并不要求做其他的操作。编译程序的工作是填符号表,登录名字的特征信息,分配存储。执行语句:语义是要做某种操作。语义处理的任务:按某种操作的目标结构生成代码。北京航空航天大学计算机学院33用上下文无关文法只能描述语言的语法结构,而不能描述其语义。例如,对于有嵌套子程序结构的程序段:BEGIN…BEGINαINTIβIEND…I…END若存在文法规则:VAR::=I第一次I的归约正确BEGIN…<BLOCK>…I...END第二次I的归约错误BEGIN…δVAR...ENDδ∈V*且不包含变量I的声明文法规则应改为:INTIβVAR::=INTIβI北京航空航天大学计算机学院44然而上下文有关文法不仅构造困难,而且其分析器十分复杂,分析效率又低,显然是不实用的因此,通常我们把与语义相关的上下文有关信息填入符号表中,并通过查符号表中的这些信息来分析程序的语义是否正确北京航空航天大学计算机学院5510.2栈式抽象机及其汇编指令栈式抽象机:由三个存储器、一个指令寄存器和多个地址寄存器组成。存储器:数据存储器(存放AR的运行栈)操作存储器(操作数栈)指令存储器北京航空航天大学计算机学院66计算机的存储大致情况如下:栈底运行栈P-code指令BP当前模块活动SP记录(数据段)PCNP堆(堆底)程序指令存储器北京航空航天大学计算机学院77栈式抽象机指令代码如下:指令名称操作码地址指令意义加载指令LODD将D的内容→栈顶立即加载LDC常量常量→栈顶地址加载LDA(D)变量D的地址→栈顶存入存储STOD栈顶内容→变量D间接存ST@D将栈顶内容→D所指单元间接存STN将栈顶内容→次栈顶所指单元加ADD栈顶和次栈顶内容相加,结果留栈顶减SUB次栈顶内容减栈顶内容乘MUL………北京航空航天大学计算机学院88指令名称操作码地址指令意义等于比较EQL不等比较NEQ次栈顶内容与栈顶内容比较,大于比较GRT结果(1或0)留栈顶小于比较LES大于等于GTE小于等于LSE逻辑与AND逻辑或ORL逻辑非NOT转子JSRlab分配ALCM在运行栈顶分配大小为M的活动记录区北京航空航天大学计算机学院9910.3声明的处理语义的表示:给出语言结构的属性翻译文法来说明其语义及语义动作,并把这些语义动作插入属性翻译文法产生式中的适当位置。编译程序的任务:•编译程序处理声明语句要完成的主要任务为:1)分离出每一个被声明的实体,并把它们的名字填入符号表中2)把被声明实体的有关特性信息尽可能多地填入符号表中•对于已声明的实体,在处理对该实体的引用时要做的事情:1)检查对所声明的实体引用(种类,类型等)是否正确2)根据实体的特征信息,例如类型,所分配的目标代码地址(可能为数据区单元地址,或目标程序入口地址)生成相应的目标代码北京航空航天大学计算机学院1010声明有常量声明,变量(包括简单变量,数组变量和记录变量等)和过程(函数)声明等,这里主要讨论常量声明和简单变量、数组声明的处理。声明的两种方式:(1)类型说明符放在变量的前面。如:C语言:inta;在填表时已知类型和a的值(名字):直接填入符号表。(2)类型说明符放在变量的后面,如:Pascal,PL/1,Ada等,需要返填。如PL/I声明语句:DECLARE(X,Y(N),YTOTAL)FLOAT;北京航空航天大学计算机学院1111声明语句的输入文法为:<declaration>→DECLARE‘(’<entitylist>‘)’<t