2009-11-20 67 views
0

假设我每次匹配一条规则需要运行一些初始化代码,我该如何减少冗余?是否可以堆栈Yacc语法规则代码?

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

而且是有可能做这样的事情

rule : TOKEN1 
    | TOKEN2 
    { codeForToken1OrToken2(); } 
    ; 

回答

3

您可以使用类似:

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

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

但是,这可能会引入冲突,这取决于如何“规则”被使用。

+0

这个语法不同于DevDevDev发布 – eKek0 2009-11-20 01:04:19

+0

它接受相同的语言,所以它相当于 – 2009-11-20 01:06:15

+0

你发布的原文不是同一种语言。现在,你已经纠正了错误 – eKek0 2009-11-20 01:07:40

0

因为这将真正的工作:

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

其中为gettoken();是匹配输入中下一个标记的函数的名称(我不记得函数的名称),你可以调用一些init();里面有

+0

你似乎没有回答这个问题。 – 2009-11-20 04:14:29

相关问题