2009-11-20 31 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

相關問題