对 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 的内置调试功能。
我的 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 的内置调试功能。