网站大量收购独家精品文档,联系QQ:2885784924

ch8-3_控制结构及说明语句翻译p1-24_(张素琴).ppt

ch8-3_控制结构及说明语句翻译p1-24_(张素琴).ppt

  1. 1、本文档共55页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * * * * * * 数组中每个元素是等长度的,结构体中的分量不等长度,所以需要存储偏移量。 * * 8.7.1 简单说明语句的翻译 8.7 说明语句的翻译 说明语句的作用: 就是说明类型等属性信息,在翻译时对每个局部变量在符号表填写相应的内容,如类型、层次、相对地址、内情向量。 说明语句分多种,举两种说明语句的翻译: 变量说明语句的翻译 常量说明语句的翻译 变量说明语句的翻译 1. 变量说明语句的文法描述 2. 变量说明语句的翻译 var exam, b: integer; (1) VARDCL→var IDS |? (2) IDS→id,IDS(1) (3) IDS→id: integer (4) IDS→id: char (5) IDS→id: bool (6) IDS→id: real Name TYPE KIND VAL ADDR exam 4 integer b 1 integer 在符号表中插入两条记录: 长度 编号 产生式 语义动作 (4) IDS→id:char { fill(entry(id),char); IDS·type=char } (3) IDS→id:integer { fill(entry(id),integer); IDS·type=integer } (2) IDS→id,IDS(1) { fill(entry(id), IDS(1)·type); IDS·type=IDS(1)·type } (1) VARDCL→var IDS|? { nop } 3. 翻译的语义动作 FILL(entry(id),Type)表示将类型Type填入符号表中 entry(id) 表示变量名id在符号表中的入口 常量说明语句的翻译 1. 常量说明语句的文法描述 2. 常量说明语句的翻译 策略:和变量说明一样,先翻译后面的产生式,再翻译前面的产生式,以便在归约时,执行语义动作,将常量的值、类型、种属填入符号表。 例:const A = 123;K= ‘ABC’ (1)CONSTDCL → constCONSTDEF (2) → ? (3)CONSTDEF → CONSTDEF;id=INT (4) → CONSTDEF;id=STR (5) CONSTDEF → id=INT (6) → id=STR 产生式 语义处理 (5) CONSTDEF→id=INT { entry(id).val= entry(INT)·val; entry(id).type=integer; entry(id).kind=数值常数; } (6) CONSTDEF→id=STR { entry(id).val= entry(STR).val; entry(id).type=char; entry(id).kind=字符常数; } const A=123;K=‘abc’ 3. 翻译的语义动作 将常量INT在符号表中的入口或值直接填入符号id所指符号表的VAL栏 将常数的类型填入符号表的Type栏 3,4产生式的翻译与5,6产生式的翻译相同 1,2产生式没有语义动作 将常数的种属填入符号表的Kind栏 Name Type Kind Val Addr A 1 integer 数值常数 123 K 1 char 字符常数 abc * 同一个标识符在不同的过程中中可能表示不同的对象,具有不同的性质,要求分配不同的存储空间。 8.7.2 过程中的说明 如何组织符号表,使得同一个标识符在不同的作用域中得到正确的引用而不产生混乱。一个子程序一个符号表,一个类一个符号表。 * 处理嵌套过程中的说明语句翻译方案 P→MD {addwidth(top(tblptr),top(offset));   ① pop();pop(offset)} M→ε {t:=mktable(nil);       ② push(t,tblptr);push(0,offset)} D→D1;D2 D→proc id; N D1;S {t:=top(tblptr); addwidth(t,top(offset)); pop(tblptr);pop(offset);    ③ enterproc(top(tblptr),id.name,t)} * D→ id: T {enter(top(tblptr),id.name,T.type, top

文档评论(0)

xuefei111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档