编译原理——循环语句和顺序语句的语义动作
循环语句的文法:
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编译原理网课