在野牛中执行规则的所有组件的操作

时间:2016-09-01 07:19:21

标签: c bison flex-lexer

我的野牛文件中有以下规则:

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

我希望解析器在每次完成修改时显示变量名称及其内容。为此,我使用了动作{printf("%s:%s\n",$1, $3);}。但是,由于有3种形式的矫揉造作,有没有办法将此动作应用于所有组件而无需写入:

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

1 个答案:

答案 0 :(得分:2)

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

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

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

这依赖于在$$ = $1的所有作品中复制aff_pfx的默认操作,因此它并不完全通用。此外,它完全消除了三种语法之间的区别,这似乎不太可能是正确的。

如果您只想尝试生成解析的痕迹,请查看Bison的内置调试功能。