是否可以堆叠Yacc语法规则代码?

时间:2009-11-20 00:55:51

标签: c++ c parsing yacc bison

假设我每次匹配规则时都需要运行一些初始化代码,如何减少冗余?

rule : TOKEN1 { init(); token1Code(); }
     | TOKEN2 { init(); token2Code(); }
     ;

也可以做类似

的事情
rule : TOKEN1
     | TOKEN2
     { codeForToken1OrToken2(); }
     ;

2 个答案:

答案 0 :(得分:3)

您可以使用以下内容:

rule : { init(); } real_rule { codeForToken1or2(); } ;

real_rule : TOKEN1 { token1Code(); }
          | TOKEN2 { token2Code(); }
          ;

但这可能会引入冲突,具体取决于“规则”的使用方式。

答案 1 :(得分:0)

因为这确实有效:

rule : TOKEN1 { getToken(); init(); token1Code(); }
     | TOKEN2 { getToken(); init(); token2Code(); }
     ;

其中 getToken(); 是与输入中的下一个标记匹配的函数的名称(我不记得函数的名称),你可以调用一些<在其中强> init(); 。