题目
给定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;
}