我正在嘗試使用LALR(1)解析器生成器(Bison,但該問題不是特定於該工具)解析簡單語法,而且正在打擊轉變 - 減少衝突。我發現有關解決這些文檔和其他來源往往說一個或多個以下:如何在清晰的語法中解決shift-reduce衝突
- 如果語法是不明確的(如IF-THEN-ELSE歧義),改變語言來解決歧義。
- 如果是運算符優先級問題,請明確指定優先級。
- 接受默認分辨率,並告訴生成器不要抱怨它。
然而,所有的這些似乎適用於我的情況:語法是明確的,只要我可以告訴(當然這是不明確的,只有一個字先行的),它只有一個運營商,以及默認分辨率導致在正確形成的輸入上解析錯誤。是否有任何技術可以重新定義語法以消除不屬於上述桶的轉換 - 減少衝突?
爲了具體,這裏所討論的語法:
%token LETTER
%%
%start input;
input: /* empty */ | input input_elt;
input_elt: rule | statement;
statement: successor ';';
rule: LETTER "->" successor ';';
successor: /* empty */ | successor LETTER;
%%
意圖是解析形式的分號分隔的線 「[A-ZA-Z] +」 或「[A-ZA-Z ] - > [A-Za-z] +「。
Bah,我用編輯理論有些生疏...... 你知道你的語法裏衝突在哪裏嗎? – 2009-06-06 03:23:08
Bison表示「POSIX表示%開始規則必須出現在%%行之前」。 – 2009-06-06 04:41:56