- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)