2017-07-01 107 views
0

爲什麼這Yacc /野牛規則無用?

%nonassoc ELSE 
%nonassoc THEN 

我得到

$野牛-dv tiger.yy
tiger.yy:74.5-28:警告:規則解析器無用由於衝突[-Wother]
:IF THEN EXP EXP EXP ELSE
^^^^^^^^^^^^^^^^^^^^^^^^

%nonassoc THEN 
%nonassoc ELSE 

該規則起作用。

這是怎麼回事?爲什麼會這樣?

+1

這是兩個解析器之間的唯一區別嗎? – DyZ

回答

1

正如警告所說,該規則是無用的,因爲如果THEN優先於ELSE,那麼移位/減少衝突的解決方案將無法應用規則。

我猜想語法實際上包括像:

exp: IF exp THEN exp ELSE exp 
    | IF exp THEN exp 

因爲如果ELSE條款是強制性的,也不會有衝突。上面的規則有一個移位/減少衝突,因爲當ELSE處於IF exp THEN IF exp THEN exp ELSE...解析超前記號有可能要麼ELSE減少IF exp THEN expexp

爲了正確地解析表達式,有必要以有利於動作,使得ELSE將與最內可用IF相關聯。沒有優先聲明,這將是默認的解決方案,因爲yacc/bison更喜歡轉換reduce。但是,如果bison使用默認分辨率,它也會產生關於分辨率的警告。爲了避免這種警告,通過給予ELSE優先於THEN來顯式強制默認分辨率是很常見的。這是什麼

%nonassoc THEN 
%nonassoc ELSE 

呢。如果你寫的優先級聲明中的其他順序,

%nonassoc ELSE 
%nonassoc THEN 

然後你給THEN優先ELSE,這意味着你指示解析器生成寧願減少它的最後一個非終端是THEN在轉移ELSE生產。 Bison/yacc會遵守該請求,但如果這樣做,它永遠不會移動ELSE,使包含ELSE的規則無效。