编译原理递归向下翻译

题目

给定LL(1)文法G[S]:

S—>AbB

A—>aA|ε

B—>aB|bB|ε

如下是以G[S]作为基础文法设计的翻译模式:

S—> Ab {B.in_num := A.num} B {if B.num = 0 then print("Accepted!") else print("Refused!")}

A—>aA1 {A.num := A1.num + 1}

A —>ε {A.num := 0}

B—>a {B1.in_num := B.in_num} B1 {B.num := B1.num - 1}

B —> b {B1.num := B.in_num} B1 {B.num := B1.num}

B—> ε {B.num := B.in_num}

试针对该翻译模式构建相应的递归下降翻译程序。

void ParseS( ) // 主函数
{
A_num := ParseA(); //变量 A_num对应属性A.num
MatchToken(b');
B_in_num := A_num; //变量 B_in_num 对应属性B.in_num
B_num := ParseB(B_in_num); //变量 B_num对应属性B.num
if B_num =0 then print(“Accepted!”)
else print(“Refused!” );
}
int ParseA( )
{
switch (lookahead) { // lookahead为下一个输入符号
case 'a' :
MatchToken('a');
A1_num := ParseA();
A_num := A1_num+1;
break;
case 'b':
A_num := 0;
break;
default:
printf("syntax error \n")
exit(0);
}
return A_num;
}
int ParseB( int in_num )
{
switch (lookahead) {
case 'a' :
MatchToken('a');
B1_in_num := in_num; //变量 B1_in_num 对应属性B1.in_num
B1_num := ParseB(B1_in_num);
B_num := B1_num-1;
break;
case 'b' :
MatchToken('b');
B1_in_num := in_num;
B1_num := ParseB(B1_in_num);
B_num := B1_num;
break;
case '#' :B_num := in_num;
break;
default:
printf("syntax error \n")
exit(0);
}
return B_num;
}

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值