编译原理 |
您所在的位置:网站首页 › while语句语法制导翻译 › 编译原理 |
循环语句的文法:
S -> IF B THEN S1 | IF B THEN S1 ELSE S2 | WHILE B DO S1 1.S -> IF B THEN S1:代码结构图如下: SDT如下: S -> IF{B.TRUE = NEWLABEL();B,FALSE = S.NEXT;} B THEN {LABEL(B.TRUE ) S1.NEXT = S.NEXT;} S1 NEWLABEL()表示生成一个存放标号的临时变量并返回其地址 LABEL(B.TRUE)表示将S1.CODE的入口地址赋给B.TRUE地址所指向的临时标号 也就是B.TRUE的话就会直接执行S1.CODE中的内容 其语义动作如下: S -> IF B THEN M S1 { BACKPATH(B.TRUELIST,M.QUAD); S,NEXTLIST = MERGE(B.FALSELIST,S1.NEXTLIST); } 2.IF B THEN S1 ELSE S2:
S -> IF B THEN M1 S1 N ELSE M2 S2 { BACKPATH(B.TURELIST,M1.QUAD); BACKPATH(B.FALSELIST,M2.QUAD); S.NEXTLIST = MERGE(MERGE(S1.NEXTLIST,N.NEXTLIST),S2.NEXTLIST); } 其中,BACKPATH表示回填,M1.QUAD 和 M2.QUAD分别表示 S1.CODE 和 S2.CODE 的入口地址 MERGE()表示合并 3.WHILE B DO S1:S -> WHILE M1 B DO M2 S1 { BACKPATH(S1.NEXTLIST ,M1.QUAD); BACKPATH(B.TRUELIST,M2.QUAD); B.FALSELIST = S.NEXTLIST; } 4.S -> S1S2:S -> S1 S2 { BACKPATH(S1.NEXTLIST,M.QUAD); S2.NEXTLIST = S.NEXTLIST; } 参考视频:哈工大MOOC编译原理网课 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |