用C ++编程语言
int a=2;
a++=5;
++a=6;
从上面的表达式只有第二个表达式有效。编译器如何翻译这些表达式,以便它能够找到error: lvalue required as left operand of assignment
。
我尝试过对这些表达式进行翻译,但这是错误的。
...
unary-expression:
postfix-expression{
$<info.place>$ = $<info.place>1;
}
|PLUSPLUS unary-expression{
$<info.place>$ = $<info.place>2;
char *temp =newTemp();
genCode(temp,$<info.place>2,"+","1");
genCode($<info.place>2,temp);
}
...
postfix-expression:
primary-expression{
$<info.place>$ = $<info.place>1;
}
|postfix-expression PLUSPLUS{
$<info.place>$ = newTemp(); //Generate temporary var
genCode($<info.place>$,$<info.place>1); //Assign temp with a
genCode($<info.place>1,$<info.place>$,"+","1");//Increment a by 1
}
...
当我使用a++=5
时,它会生成
0000 : T0 = a
0001 : a = T0 + 1
0002 : T1 = 5
0003 : T0 = T1
必须在行动中进行哪些更改才能使其像C ++一样工作。
答案 0 :(得分:1)
编译器如何翻译这些表达式,以便它能够找到错误:左值作为赋值的左操作数。
没有翻译第一个表达式。它会产生语义错误。向我们展示您生成的代码以及您如何执行此代码是徒劳的。没有任何正确生成的代码。
事实上,这些作品本身是无关紧要的。您需要在赋值生成中添加语义检查以确保LHS是左值,如果不是,则打印错误。