编译原理——循环语句和顺序语句的语义动作

循环语句的文法:

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编译原理网课

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值