各种语言成分的语法及其翻译方案(示例).doc

各种语言成分的语法及其翻译方案(示例).doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
各种语言成分的语法及其翻译方案(示例).doc

各种语言成分的语法及其翻译方案(示例) 1. 普通声明语句的 P → prog id (input, output) D ; S D →D ; D | List : T | proc id D ; S List →List1, id | id T → integer | real | array C of T1 | (T1 | record D C → [num] C | ε 声明语句的翻译模式: P→prog id (input, output){offset := 0}D ; S D→D ; D D→id: T{enter (id.name, T.type, offset); offset:= offset + T.width} T→integer{T.type := integer; T.width := 4} T→real{T.type :=real; T.width :=8} T→array [num] of T1{T.type := array(num.val, T1.type);T.width := num.val×T1.width} T→↑T1{T.type := pointer(T1.type); T.width := 4} 2. 嵌套过程中声明语句的翻译 嵌套过程声明语句的产生式。 P→prog id (input, output) D ; S D→D ; D | id : T | proc id ; D ; S (7.1) 嵌套过程声明语句的翻译模式: P→prog id (input, output) MD;S{addwidth(top(tblptr),top(offset)); pop(tblptr);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(offset)); top(offset) := top(offset) + T.width} N →ε{t:= mktable(top(tblptr)); push(t, tblptr); push(0, offset)} 3. 记录的翻译 下面是生成记录类型的产生式: T→record D end 生成记录类型的翻译模式: T → record L D end {T.type := record(top(tblptr)); T.width := top(offset); pop(tblptr); pop(offset)} L →ε{t:= mktable(nil); push(t, tblptr); push(0, offset)} 4. 赋值语句的翻译 S →Left := E E →E1 + E2 | E1 * E2 | - E1 | (E1 ) | Left Left →Elist ] | id Elist →Elist, E | id [E (7.2) 赋值语句的翻译模式: ⑴ S→Left:=E{if Left.offset=null then /*Left是简单id*/ gencode(Left.addr := E.addr); else gencode(Left.addr [ Left.offset ] := E.addr)} /*Left是*/ ⑵ E→E1+E2{E.addr:=newtemp;gencode(E.addr :=E1.addr+E2.addr)} ⑶ E→(E1){E.addr:= E1.addr} ⑷ E→Left{if Left.offset=null then /*Left是简单id*/ E.addr:= Left.addr else begin /*Left是*/ E.addr:=newtemp; gencode(E.addr := Left.addr [ Left.offset ]) end} ⑸ Left→Elist]{ Left.addr:=newtemp; /*Left是*/ Left.offset:=newtemp; ge

文档评论(0)

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

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

1亿VIP精品文档

相关文档