我在野牛(再次)上遇到了一些問題。 我試圖在我的語法文件中使用$$, 傳遞一個「遞歸規則」之間的字符串值,但是當我打印傳遞的值時,輸出看起來像是一個錯誤的引用(AU ),而不是我在輸入文件中寫入的值。在遞歸野牛規則中傳遞字符串值
line: tok1 tok2
| tok1 tok2 tok3
{
int len=0;
len = strlen($1) + strlen($3) + 3;
char out[len];
strcpy(out,$1);
strcat(out," = ");
strcat(out,$3);
printf("out -> %s;\n",out);
$$ = out;
}
| line tok4
{
printf("line -> %s\n",$1);
}
這裏我已經報道了代碼的簡化部分。 在輸入令牌tok1 tok2 tok3時,它應該爲$$ out變量賦值(使用printf我可以看到在規則的第一部分out變量具有正確的值)。 順序匹配tok4我在規則的遞歸部分。但是,當我打印$ 1的值(應該等於out,因爲我已經通過$ $$),我沒有正確的輸出。
我不明白你的答案。變量out很難消失,這就是爲什麼我將它存儲到$ $$這個默認變量來存儲非終端(或遞歸)野牛規則之間的數據。通過這種方式,我可以在下一條規則中使用out值(存儲在$$中)。 –
@Simone:out實際上是一個指向堆棧中存儲的char數組的指針。因此'$$ = out'使'$$'指向堆棧上的數據。恐怕,這就是C的工作方式。 – rici
那麼爲什麼如果我將'$$ = out'換成'$$ = $ 1'(其中$ 1是一個字符串),我在輸出中在規則的遞歸部分中輸出了$ 1表示的正確字符串? –