bison / yacc文件中使用的语言

时间:2017-01-10 01:43:42

标签: c++ llvm flex-lexer yacc ml-yacc

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

代码实际上是C(扩展名为C ++),而$$和$ n被bison本身取代,C代码引用规则目标或规则元素的语义值。

See this chapter of bison's documentation了解更多信息。