对 bison 中规则的所有组件执行操作

Execute an action for all component of a rule in bison

我的 bison 文件中有以下规则:

affectation: VAR '=' expr ';'
    | VAR PLUSEQ expr ';'
    | VAR MINUSEQ expr ';'
    ;

我希望解析器在每次做作时都显示变量名及其内容。为此,我使用动作 {printf("%s:%s\n",, );}。但是,由于有 3 种形式的矫揉造作,有没有一种方法可以将此操作应用于所有组件而无需编写:

affectation: VAR '=' expr ';'
      {printf("%s:%s\n",, );} 
    | VAR PLUSEQ expr ';'
      {printf("%s:%s\n",, );}
    | VAR MINUSEQ expr ';'
      {printf("%s:%s\n",, );}
    ;

基本上,答案是否定的。在大多数用例中,这三个产生式会有不同的语义,因此它们是三个不同的动作是正常的,尽管它们可能共享代码。 (一如既往,重构共享代码可以减少重复的需要。)

如果这三个规则在语义上确实相同,您可以将不同的运算符收集到一个前缀规则中:

aff_pfx: VAR '=' | VAR PLUSEQ | VAR MINUSEQ
affectation: aff_pfx expr ';' { handle(, ); }

这依赖于aff_pfx的所有产品中的默认动作复制$$ = ,所以它不是完全通用的。此外,它完全消除了三种语法之间的任何区别,这似乎不太正确。

如果您只是想生成解析的踪​​迹,请查看 bison 的内置调试功能。