在前面已经介绍了编译程序构造的二个重要阶段即词法分.pptVIP

在前面已经介绍了编译程序构造的二个重要阶段即词法分.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

G[S]:L→LSS1L→SLS→S综上所述,其产生式和语义动作为:产生式语义动作S→beginLend{S.chain:=L.chain;}L→LSS{L.chain:=S.chain;}L→S{L.chain:=S.chain;}LS→L;{backpatch(L.chain,nextstat);}4.赋值语句设有赋值语句的文法为:G[S]:S→A由于赋值语句归约成语句时,它的四元式代码已全部产生,可以不产生任何动作,但为了在控制语句和非控制语句merge函数合并时不会产生没有S.Chain属性的错误,故为此添加了相应的语义动作:产生式语义动作S→A{S.chain:=null;}D→R]ofreal{dim(R.dim);type(R.table,real);conspart(malloc(R.V*byte(real)-R.C)}R→R1,l..u{R.dim:=R1.dim+1;d:=u-l+1;R.C:=R1.C*d+l;R.V:=R1.V*d;R.table:=R1.table;fillin2(R.table,l,u);}R→L:array[l..u{R.dim:=1;R.C:=l;R.V:=u-l+1;R.table:=L.table;fillin2(R.table,l,u);}L→L1,i{L.table:=L1.table;add(L.table,i)}L→i{L.table:=build(i);}记录或结构是由一些已知类型组成的复合的数据类型。C语言中的类型文法如下:类型→struct{成员表}|char|int|real|pointer成员表→成员表;成员|成员成员→类型i|类型i[下标表]下标表→下标表,n|n其中:n为常量,fillin3(i,offset)表示将当前记录中成员标识符i的符号表,填写相对位移值为offset,属性len表示该文法符号的长度,即字节数。属性offset表示相对位置。对于第一个成员的相对位置为0。其语义处理子程序如下:类型→struct{成员表}{类型.len:=成员表.offset}类型→char{类型.len:=1}类型→int{类型.len:=2}类型→real{类型.len:=4}类型→pointer{类型.len:=4}成员表→成员表1;成员{fillin3(成员.name,成员表1.offset);成员表.offset:=成员表1.offset+成员.len;}成员表→成员{fillin3(成员.name,0);成员表.offset:=成员.len}成员→类型i{成员.name:=i;成员.len:=类型.len}成员→类型i[下标表]{成员.name:=i;成员.len:=类型.len*下标表.V}下标表→下标表1,n{下标表.V:=下标表1.V*n}下标表→n{下标表.V:=n}注意在这里没有考虑某些机器中对于起始地址必须是偶地址的问题,但对上述翻译稍作修改亦可解决。对于C中的union类型,它们将不同的数据类型分配在同一存储空间中,需用一个标记来描述当前使用的是何种类型。同样Pascal中的变体部分也需类似的方法解决。4.过程或函数的说明语句的翻译过程或函数的说明语句的翻译的处理稍为复杂,由于一些过程和函数允许递归,这样每进入一次过程或函数需分配一次内存,因此在处理过程或函数内的其它说明语句时,只要分配每个标识符的相对位置以及求出进入该过程或函数所需的空间总长度。处理过程或函数体时,首先要生成申请所需的存储空间的代码,其次生成过程或函数体的代码(包括入栈和出栈所需的指令)。另外在处理过程说明时,还要注意同名标识符在不同层次应翻译成不同的对象,即注意标识符的作用域或可视性。例如Pascal程序段:programexample(input,output);varx,y:integer;procedurechange1;vary:integer;beg

您可能关注的文档

文档评论(0)

131****3303 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档