我的野牛文件中有以下规则:
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);}
;
答案 0 :(得分:2)
基本上,答案是否定的。在大多数用例中,三个产品将具有不同的语义,因此尽管它们可能共享代码,但它们是三个不同的动作是正常的。 (与往常一样,重构共享代码可以减少重复的需要。)
如果这三个规则在语义上完全相同,则可以将不同的运算符收集到前缀规则中:
aff_pfx: VAR '=' | VAR PLUSEQ | VAR MINUSEQ
affectation: aff_pfx expr ';' { handle($1, $2); }
这依赖于在$$ = $1
的所有作品中复制aff_pfx
的默认操作,因此它并不完全通用。此外,它完全消除了三种语法之间的区别,这似乎不太可能是正确的。
如果您只想尝试生成解析的痕迹,请查看Bison的内置调试功能。