%nonassoc ELSE
%nonassoc THEN
我得到
$野牛-dv tiger.yy
tiger.yy:74.5-28:警告:規則解析器無用由於衝突[-Wother]
:IF THEN EXP EXP EXP ELSE
^^^^^^^^^^^^^^^^^^^^^^^^
但
%nonassoc THEN
%nonassoc ELSE
該規則起作用。
這是怎麼回事?爲什麼會這樣?
%nonassoc ELSE
%nonassoc THEN
我得到
$野牛-dv tiger.yy
tiger.yy:74.5-28:警告:規則解析器無用由於衝突[-Wother]
:IF THEN EXP EXP EXP ELSE
^^^^^^^^^^^^^^^^^^^^^^^^
但
%nonassoc THEN
%nonassoc ELSE
該規則起作用。
這是怎麼回事?爲什麼會這樣?
正如警告所說,該規則是無用的,因爲如果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 exp
到exp
。
爲了正確地解析表達式,有必要以有利於移動作,使得ELSE
將與最內可用IF
相關聯。沒有優先聲明,這將是默認的解決方案,因爲yacc/bison更喜歡轉換reduce。但是,如果bison使用默認分辨率,它也會產生關於分辨率的警告。爲了避免這種警告,通過給予ELSE
優先於THEN
來顯式強制默認分辨率是很常見的。這是什麼
%nonassoc THEN
%nonassoc ELSE
呢。如果你寫的優先級聲明中的其他順序,
%nonassoc ELSE
%nonassoc THEN
然後你給THEN
優先ELSE
,這意味着你指示解析器生成寧願減少它的最後一個非終端是THEN
在轉移ELSE
生產。 Bison/yacc會遵守該請求,但如果這樣做,它永遠不會移動ELSE
,使包含ELSE
的規則無效。
這是兩個解析器之間的唯一區別嗎? – DyZ