...
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
правилом
Проблема с приведенным выше правилом грамматики и его реализацией заключается в том, что оно не может сгенерировать правильный код, если выражение равно
bool a;
if(a){
printf("hi");
}
else{
prinf("die");
}
Ожидается, что выражение-присваивание должно содержать relop
или OR
или AND
до 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