编译器如何翻译后缀/前缀运算符?

时间:2015-03-27 05:26:07

标签: c++ code-generation yacc

用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 ++一样工作。

1 个答案:

答案 0 :(得分:1)

  

编译器如何翻译这些表达式,以便它能够找到错误:左值作为赋值的左操作数。

没有翻译第一个表达式。它会产生语义错误。向我们展示您生成的代码以及您如何执行此代码是徒劳的。没有任何正确生成的代码。

事实上,这些作品本身是无关紧要的。您需要在赋值生成中添加语义检查以确保LHS是左值,如果不是,则打印错误。