- 1、本文档共84页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
3)间接三元式在三元式代码表的基础上另设一张表,该表按运算的次序列出相应三元式在三元式表中的位置,这张表称为间接码表。三元式表只记录不同的三元式语句,而间接码表则表示由这些语句组成的运算次序。例如对于表达式:A+B*(C-D)+E/(C-D)^N的三元式与间接码表为:每生成一条指令,先检查已生成的间接三元式序列,若已有,不再生成,只把序号列入间接码表中。第55页,共84页,星期日,2025年,2月5日在三元式表示中,每个语句的位置同时有两个作用:一是可作为该三元式的结果被其它三元式引用;二是三元式位置顺序即为运算顺序。在代码优化阶段,需要调整三元式的运算顺序时会遇到困难,这是因为三元式中的arg1、arg2也可以是指向某些三元式位置的指针,当这些三元式的位置顺序发生变化时,含有指向这些三元式位置指针的相关三元式也需随之改变指针值。因此,变动一张三元式表是很困难的。第56页,共84页,星期日,2025年,2月5日对四元式来说,引用另一语句的结果可以通过引用该语句的result(通常是一个临时变量)来实现,而间接三元式则通过间接码表来描述语句的运算次序。这两种方法都不存在语句位置同时具有两种功能的现象,代码调整时要做的改动只是局部的,因此,当需要对中间代码表进行优化处理时,四元式与间接三元式都比三元式方便得多。第57页,共84页,星期日,2025年,2月5日写中间语言:练习写出表达式:A+B*(C-D)-E/F↑G的逆波兰表示、三元式表示、四元式表示。解:四元式表示:①(-,C,D,T1)②(*,B,T1,T2)③(+,A,T2,T3)④(↑,F,G,T4)⑤(/,E,T4,T5)⑥(-,T3,T5,T6)解:三元式表示:①(-,C,D)②(*,B,①)③(+,A,②)④(↑,F,G)⑤(/,E,④)⑥(-,③,⑤)解:逆波兰表示:ABCD-*+EFG↑/-第58页,共84页,星期日,2025年,2月5日语法制导翻译翻译的任务:首先是语义分析和正确性检查,若正确,则翻译成中间代码或目标代码。第59页,共84页,星期日,2025年,2月5日例如,简单算术表达式求值的属性文法如下:规则 语义规则(1)?S→E print(E.val)(2)?E→E(1)+T E.val=E(1).val+T.val(3)?E→T E.val=T.val(4)?T→T(1)*FT.val=T(1).val*F.val(5)?T→T(1) T.val=T(1).val(6)?F→(E) F.val=E.val(7)?F→i F.val=i.lexval第23页,共84页,星期日,2025年,2月5日上面的一组规则中,每一个非终结符都有一个属性val来表示整型值,如E.val表示E的整型值,而i.lexval则表示i的整型内部值。与规则关联的每一个语义规则的左部符号E、T、F等的属性值的计算由其各自相应的右部符号决定,这种属性也称为综合属性。与规则S→E关联的语义规则是一个函数print(E.val),其功能是打印E规则的值。S’在语义规则中没有出现,可以理解为其属性是一个虚属性。第24页,共84页,星期日,2025年,2月5日简单变量类型说明的文法G[D]如下:G[D]:D→intL∣floatLL→L,id∣id其对应的属性文法为:规则语义规则(1)?D→TL L.in=T.type(2)?T→int T.type=int(3)?T→float T.type=float(4)?L→L(1),idL(1).in=L.in;addtype(id.entry,L.in)(5)?L→id addtype(id.entry,L.in)注意到与文法G[
文档评论(0)