...
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
orOR
またはAND
toが含まれている必要があります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 {
...
}
...
文法規則が期待どおりに機能するようにするには、文法規則でどのような変更を行う必要がありますか?
here と Dragon book のIF ELSE 文法規則を試しましたが、これを解決できませんでした。文法全体はGithubで見つけることができます