我在野牛(再次)上遇到了一些问题。 我试图在我的语法文件中使用$$, 传递一个“递归规则”之间的字符串值,但是当我打印传递的值时,输出看起来像是一个错误的引用(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表示的正确字符串? –