簡體   English   中英

yacc語法中的移位/減少沖突

[英]Shift/reduce conflict in yacc grammar

我寫了一個語法,規則如下:

A : B '?'  
  | B
  | A '+' A
  ;

B : "a"
  | "c" A "t" A
  ;

這給了我一個轉變/減少沖突的機會

A : B . '?'  (96)
A : B .  (98)

我嘗試了多種方法來更改語法,但是當我嘗試更改內容時,似乎會產生更多沖突。 如何消除此沖突?

預先謝謝您,任何幫助將不勝感激。

LALR(1)解析器使用單字符提前查找來解決其沖突。 當前瞻無法區分不同的動作時,就會向用戶顯示沖突。

在以下狀態下,“?” 前瞻意味着解析器可以移動。

A : B . '?'
A : B .

但是,如果它減少A怎么辦? 可能會減少到以下狀態:

B: "c" A "t" A .

通過減少B可以直接導致:

A : B . '?'
A : B .

因此,“?” 也是減少的有效前瞻。

那么如何解決呢?

您有兩種選擇:

1)嘗試用左遞歸而不是右遞歸重寫語法。 可能會有所幫助,但是不能保證。

2)告訴YACC每當有沖突時選擇哪個(例如,使用%left或%right)。

或者,也許使用更智能的解析器。 例如elkhound或antlr。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM