- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
语言的语法及其翻译方案
各种语言成分的语法及其翻译方案(示例)
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;
您可能关注的文档
最近下载
- 2025至2030全球及中国荧光微球行业调研及市场前景预测评估报告.docx VIP
- NB_T 10091-2018高压开关设备温度在线监测装置技术规范.pdf
- 单缸液压圆锥破操作保养规程.docx VIP
- 六年级(上)语文1-28课核心考点汇总.pdf VIP
- 夏商周考古思考题.pdf VIP
- 2025年铁路局招聘考试题库《铁路基础知识》及答案.docx VIP
- 武汉大学泛函分析讲义.3.1共轭空间与共轭算子.pdf VIP
- 浅析全自动钠离子交换器.doc VIP
- 山东省聊城市东昌府区文轩湖西校区2024-2025学年八年级上学期期中地理试题.docx VIP
- GB_T 3246.1-2024 变形铝及铝合金制品组织检验方法 第1部分:显微组织检验方法.pdf VIP
原创力文档


文档评论(0)