-1

我想知道 yacc/bison 文件中规则部分的大括号中使用的语言是什么,如下所示,是否有任何好的参考。

stmts : stmt { $$ = new NBlock(); $$->statements.push_back($<stmt>1); }
  | stmts stmt { $1->statements.push_back($<stmt>2); }
  ;

并在上面的代码中,例如,为什么它$<stmt>$2不仅仅是写$2

4

1 回答 1

1

它实际上是带有自定义宏预处理器的 C 代码。

yacc/bison 将所有出现的$$ 替换为引用规则目标组件语义值的C 代码,并将$n 替换为规则元素#n 的语义值。

代码实际上是 C(以及扩展为 C++),并且 $$ 和 $n 被 bison 本身替换,C 代码引用规则目标或规则元素的语义值。

有关更多信息,请参阅 bison 文档的这一章。

于 2017-01-10T02:07:09.463 回答