语义分析和中间代码生成.ppt
什么是语法制导翻译法在语法分析过程中,随着分析的逐步进展,根据相应文法的每一规则所对应的语义子程序进行翻译的方法(即随语法分析的进展,识别出一个语法结构,就对它的语义进行分析和翻译)。第61页,共84页,2024年2月25日,星期天语法制导翻译技术分为自底向上语法制导翻译和自顶向下语法制导翻译。第62页,共84页,2024年2月25日,星期天自底向上语法制导翻译自底向上语法制导翻译方法是在自下而上的语法分析过程中逐步实现语义规则的方法。自底向上语法制导翻译的特点:(1)当栈顶形成句柄执行归约时,调用相应的语义动作。(2)语法分析栈和语义分析栈同步操作。第63页,共84页,2024年2月25日,星期天以LR语法制导翻译为例,说明如何实现语法制导翻译:1、为文法G的每一个规则设计相应的语义子程序。2、构造文法G的LR分析表。3、将原LR语法分析栈扩充,以便存放文法符号对应的语义值。4、在用某一规则进行归约的同时,调用相应的语义子程序,完成所用规则式相应的语义动作。第64页,共84页,2024年2月25日,星期天中间语言为了使编译程序在逻辑上更为简单明确,特别是为了使目标代码的优化比较容易实现,许多编译程序都采用了某种复杂性介于源程序语言和机器语言之间的中间语言,并且首先把源程序翻译成这种中间语言程序(中间代码)。第65页,共84页,2024年2月25日,星期天常见的中间语言形式逆波兰式三元式四元式第66页,共84页,2024年2月25日,星期天四元式是一种比较普遍采用的中间代码形式。四元式的四个成分是:算符OP、第一运算量ARG1、第二运算量ARG2以及运算结果RESULT。其中,运算量和运算结果有时指用户自定义的变量,有时指编译程序引进的临时变量。第67页,共84页,2024年2月25日,星期天赋值语句A:=-B*(C+D)的四元式序列:序号OPARG1ARG2RESULT注释(1)?B_T1T1为临时变量(2)+CDT2T2为临时变量(3)*T1T2T3T3为临时变量(4):=T3_A赋值运算表中:“?”是为了区别“-”而表示的求负运算符。凡只需一个运算量的算符,使用ARG1。第68页,共84页,2024年2月25日,星期天6.4表达式及赋值语句的翻译6.4.1简单算术表达式和赋值语句的翻译简单算术表达式是一种仅含简单变量的算术表达式;简单变量是指普通变量和常数,但不含数组元素及结构引用等复合型数据结构。简单算术表达式的计值顺序与四元式出现的顺序相同,因此很容易将其翻译成四元式形式。第69页,共84页,2024年2月25日,星期天实现简单算术表达式和赋值语句到四元式的翻译一般采取下列步骤:(1)分析文法的特点。(2)设置一系列语义变量,定义语义过程、语义函数。(3)修改文法,写出每一条规则的语义子程序。(4)扩充LR分析栈,构造LR分析表。第70页,共84页,2024年2月25日,星期天考虑以下文法G[A]:A→i=E?E→E+E∣E*E∣?E∣(E)∣i为了实现由表达式到四元式的翻译,需要给文法加上语义子程序,以便在进行归约的同时执行对应的语义子程序。第71页,共84页,2024年2月25日,星期天语义子程序所涉及的语义变量、语义过程及函数说明如下:(1)对非终结符E定义语义变量E.place,即用E.place表示存放E值的变量名在符号表中的入口