我想知道yacc / bison文件中规则部分的花括号中使用的语言是什么,如下所示,以及是否有任何关于它的好参考。
stmts : stmt { $$ = new NBlock(); $$->statements.push_back($<stmt>1); }
| stmts stmt { $1->statements.push_back($<stmt>2); }
;
并在上面的代码中,例如,为什么写$<stmt>$2
而不仅仅是$2
答案 0 :(得分:1)
它实际上是带有自定义宏预处理器的C代码。
yacc / bison用C代码替换所有出现的$$,C代码引用规则的目标组件的语义值,$ n代替规则元素#n的语义值。
代码实际上是C(扩展名为C ++),而$$和$ n被bison本身取代,C代码引用规则目标或规则元素的语义值。