...
IF LP assignment-expression RP marker statement {
backpatch($3.tlist,$5.instr);
$$.nextList = mergeList($3.flist,$6.nextList);
}
|IF LP assignment-expression RP marker statement ELSE Next statement {
backpatch($3.tlist,$5.instr);
backpatch($3.flist,$8.instr);
YYSTYPE::BackpatchList *temp = mergeList($6.nextList,$8.nextList);
$$.nextList = mergeList(temp,$9.nextList);
}
...
赋值表达式是可以使用 C 运算符的任何赋值表达式=, +=, -=, *=, /=。
LP = (
RP = )
marker并且Next都是EMPTY规则
上述语法规则和实现的问题是表达式为 as 时无法生成正确的代码
bool a;
if(a){
printf("hi");
}
else{
prinf("die");
}
它期望 assignment-expression 必须包含reloporOR或ANDto generate correct code。因为在这种情况下,我们对relop相同的情况进行比较,适用于OR和AND。
但是由于上面的代码不包含任何东西,所以它无法生成正确的代码。可以使用以下规则生成正确的代码,但这会导致two reduce-reduce conflict.
...
IF LP assignment-expression {
if($3.flist == NULL && $3.tlist == NULL)
...
} RP marker statement {
...
}
|IF LP assignment-expression{
if($3.flist == NULL && $3.tlist == NULL)
...
} RP marker statement ELSE Next statement {
...
}
...
我应该在语法规则中做哪些修改才能使其按预期工作?
我从这里以及从龙书尝试了IF ELSE 语法规则,但无法解决这个问题。完整的语法可以在这里找到Github