簡體   English   中英

Bison / Yacc減少特定語法示例的減少沖突

[英]Bison/Yacc reduce reduce conflict for a specific grammar example

我的編譯器類有一個解析器項目。 我無法解決其中一項規則的減少/減少沖突。

該語法規則的圖形表示可從以下鏈接獲得(對不起,由於stackoverflow策略,我無法在此處發布圖像):

“類型”語法規則的圖形表示

所有的橢圓都是終端符號。

由於該規則看起來有些復雜,因此我嘗試將其分解為較小的部分。 這是我構造語法的嘗試:

type    :   id_or_int   brackets_or_end
        ;
id_or_int   :   IDnum
        |   INTnum
        ;
brackets_or_end :   brackets    remainingpartboe
        |
        ;
brackets    :   LBRACnum    RBRACnum    brackets
        |
        ;
remainingpartboe:   DOTnum      type
        |
        ;   

請注意,terminal是以后綴num結尾的單詞,例如DOTnum。 其余為非終結符。

野牛正在報告以下沖突

mj-parser.y: conflicts: 1 reduce/reduce
mj-parser.y:122.18: warning: rule useless in parser due to conflicts: 
brackets_or_end: /* empty */

請注意,上面的野牛錯誤是指brackets_or_end規則的第二種替代產生。

請通過建議另一種編寫語法的方法來幫助解決此沖突。 順便說一下,我已經看過Bison的詳細輸出,但是並沒有太大幫助。

謝謝-sas

(在評論中回答的問題。轉換為社區Wiki答案。請參閱無答案的問題,但問題已在評論中解決(或在聊天中擴展)

@BobDalgleish寫道:

請注意,您有兩個非終結符,它們在同一生產樹中可以為空。 因此,空字符串可以減少為方括號或方括號或括號。 這行不通。

OP寫道:

你是絕對正確的鮑勃。 感謝您的提示:方括號不應該減少ε。 這將消除減少-減少沖突。

暫無
暫無

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

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