2015-09-20 39 views
0

舉個簡單的語言定義圖表,我有以下衝突的規則的衝突:如何避免換擋/減少與生產幾操作數

rm_arcs: RM ARC VARNAME VARNAME ref_exp ref_exp 
    { 
     $$ = new RmArcNodes($3, $4, $5, $6); 
    } 
    | RM ARC VARNAME ref_exp ref_exp 
    { 
     $$ = new RmArcNodes($3, $4, $5); 
    } 

其中野牛說,這導致3移位/減少衝突。

ref_exp規則定義如下:

ref_exp : STRCONST 
      { 
      auto symbol = string_table($1); 
      $$ = new StringExp(symbol); 
      } 
     | INTCONST 
      { 
      auto symbol = id_table($1); 
      $$ = new IntExp(symbol); 
      } 
     | VARNAME 
      { 
      auto varname = var_tbl($1); 
      if (varname == nullptr) 
       { 
       stringstream s; 
       s << "var name " << $1 << " not found"; 
       $$ = new ErrorExp(s.str()); 
       } 
      else 
       $$ = varname; 
      } 
; 

是否有爲了消除這些矛盾,而無需修改語言改寫語法什麼簡單的辦法?

Regards

+0

我假設'ref_exp'可以包含'VARNAME'? – Puppy

+0

@Puppy是的,這是正確的 – lrleon

+0

其實我只是誤讀了語法。我認爲你可以分析這一點,但不記得如何正手。 – Puppy

回答

4

你應該可以通過簡單地向Bison解釋你想要的東西來做到這一點。添加一個ref_exp_without_varname生產(執行顯而易見)。

然後改變

rm_arcs: RM ARC VARNAME VARNAME ref_exp ref_exp 
    | RM ARC VARNAME ref_exp ref_exp 

rm_arcs: RM ARC VARNAME ref_exp_without_varname ref_exp 
     | RM ARC VARNAME VARNAME ref_exp 
     | RM ARC VARNAME VARNAME ref_exp ref_exp 

我相信這應該是相同的,但沒有衝突,我明確地消除歧義,第4項。

+0

我的瀏覽器中沒有顯示您的答案,直到我添加了我的答案之後,這個答案在確實出現時讓我感到驚訝。 SO緩存/刷新/檢測答案/評論有一些有趣的事情發生。幹得不錯;它的伎倆。 –

+0

小狗只是一個說明,告訴你,我只是解決了這個問題。我用你的想法。謝謝(還有@Jonathan) – lrleon

2

的問題是,語法已經閱讀RM ARC VARNAME並收到另一個VARNAME之後,它不知道哪個規則的工作,從而導致移位減少衝突。

之一來解決它的方法是:

%token RM ARC VARNAME STRCONST INTCONST 

%% 

rm_arcs: 
     RM ARC VARNAME ref_exp_list 
    ; 

ref_exp_list: 
     VARNAME 
    | ref_exp_list ref_exp 
    ; 

ref_exp: 
     STRCONST 
    | INTCONST 
    | VARNAME 
    ; 

這使得第一VARNAME後ref_exp值任意數量,但第一的價值觀必須是VARNAME。您將採取語義措施來限制列表的長度(因此RM ARC VARNAME VARNAME INT_CONST INT_CONST INT_CONST將被拒絕)。

+0

更好的是'rm_arcs:RM ARC ref_exp_list'和'ref_exp_list:ref_exp | ref_exp_list ref_exp',並對列表的正確性進行語義檢查,因爲這通常會導致更好的錯誤消息(而不僅僅是「語法錯誤」) –

+0

@ChrisDodd:有一個很好的理由,它是我的答案中的限定詞,甚至在我看到其他答案之前 - 你的建議也有其優點,並且是另一種方法。 –