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