




如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
语义分析的任务:例如:目前多数编译程序进行语义分析的方法是采用语法制导翻译法。它不是一种形式系统,但它比较接近形式化。(1)属性继承属性其计算规则按“自上而下”方式进行,即规则右部符号的某些属性根据其左部符号的属性和(或)右部其他符号的某些属性计算而得。(2)属性文法这些语义规则附在文法的每个产生式上,在语法分析过程中,执行语义规则描述的动作,从而实现语义处理。也就是说,附在文法的每个产生式上语义规则描述了语义处理的加工动作。G:E→E+T|TT→T*F|FF→(E)|i G:D→TLT→integer|realL→L,id|id5.3语法制导翻译概述S→……(2)语法制导翻译法为文法每一产生式设计相应的求值的语义描述(语义动作):1.E→E(1)+E(2) 5.4编译中常用的中间代码:逆波兰式逆波兰式表示法同中缀表示法相比其优点是:一般表达式计值时,要处理两类符号,一类是运算对象,另一类是运算符,通常用两个工作栈分别处理。但处理用逆波兰式表示的表达式却只用一个工作栈。当计算机自左到右顺序扫描逆兰波式时,若当前符号是运算对象则进栈,若当前符号是运算符,设为K元运算符,则将栈顶的K个元素依次取出,同时进行K元运算,并将运算结果置于栈顶,表达式处理完毕时,其计算结果自然呈现在栈顶。逆波兰式ab+c*的处理过程如下图:逆波兰形式可以推广到其他语法结构:三元式和树形表示例如a+b*c的三元式序列:1.三元式出现的顺序和语法成份的 计值顺序相一致。间接三元式例如语句树形表示四元式主要由四部分组成:四元式的第四个分量result是编译程序为存放中间运算结果而临时引进的变量,常称为临时变量,如Ti,也可以是用户自定义变量,如X。2.四元式之间的联系是通过临时变量实 现的,这样易于调整和变动四元式。编译系统中,有时将四元式表示成另一种更直观,更易理解的形式——三地址代码或三地址语句。例如X=a*b+c/d的四元式序列:例1.–a+b*(–c+d)的逆波兰式t1=@ai↑(i/(i–i))的逆波兰式语义函数emit(T=arg1OParg2)(2)不进符号表,临时变量单词值部 分用整数码表示。语义过程Lookup(i.name)1.E→E(1)+E(2)4.E→i5.5.2布尔表达式到四元式的翻译布尔表达式到四元式的翻译布尔表达式到四元式的翻译布尔表达式到四元式的翻译布尔表达式到四元式的翻译3.E→(E(1))布尔表达式到四元式的翻译布尔表达式到四元式的翻译布尔表达式到四元式的翻译(1)真出口和假出口:(2)作为条件转移的E,把E翻译成的代码 是一串条件转或无条件转的四元式布尔表达式到四元式的翻译布尔表达式到四元式的翻译布尔表达式到四元式的翻译布尔表达式到四元式的翻译布尔表达式到四元式的翻译布尔表达式语义动作的设计布尔表达式语义动作的设计布尔表达式到四元式的翻译布尔表达式到四元式的翻译5.5.3控制语句的翻译 C→ifEthenS→CS(1) 2、双分支if语句: C→ifEthenTP→CS(1)elseS→TPS(2) C→ifEthen{backpatch(E.true,nextq); C.chain=E.false} TP→CS(1)else{q=nextq;emit(goto0);① TP.chain=merge(S(1).chain,q); Backpatch(C.chain,nextq)②} S→TPS(2){S.chain=merge(TP.chain, S(2).chain)} 例:ifx>ythenx=x+1elsey=y+1 ifAvB<Cthenx=x+Belsex=x+C 3、条件循环语句: w→whilewd→wEdoS→wdS(1) w→while{w.bcode=nextq} wd→wEdo{backpatch(E.true,nextq); wd.chain=E.false; wd.bcode=w.bcode} S→wdS(1){emit(gotowd.bcode); Backpatch(S(1).chain,wd.bcode); S.chain=wd.chain} 例:whilex+y>3doa=a+3*b whileA∨B<Ddoif(x>6)thenx=x-1elsey=x+1 4、语句组: L→LsSLs→L;L→S L→S{L.chain=S.chain} Ls→L;{backpatch(L.chain,nextq)} L→LsS{L.chain=S.chain}

王子****青蛙
实名认证
内容提供者


最近下载