...
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 =, +=, -=, *=, /=
.Перевод if then else в грамматику компилятора
LP = (
RP =)
и 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 grammar rule отсюда, а также от книги драконов, но не смог решить эту проблему. Целую грамматику можно найти здесь Github
Я использовал гибкий зубров несколько лет назад и вспомнить такого рода ситуации.. Я считаю, что решение заключается в использовании условий запуска в lexer для введения разных правил. Синтакс с моим старым гибким бизоном скользко отличается. Надеюсь, это поможет. –