我一直在使用PLY爲我的語言構建解析器,但是我遇到了移位/減少衝突,這給我造成了一些麻煩。我的語言具有語法ala C++模板的泛型類型。所以現在我有這樣的規則:解決LALR解析器中的移位/減少衝突
expression : expression LESS expression %prec COMPARISON
expression : template
template : NAME
| NAME LESS templates GREATER
templates : template
| templates COMMA template
然而,我發現,這是無法解析:
a < 2
(這是顯而易見的原因有問題)。以下是調試輸出:
PLY: PARSE DEBUG START
State : 0
Stack : . <Token: 'NAME' 'a'>
Action : Shift and goto state 42
State : 42
Stack : NAME . <Token: 'LESS' '<'>
Action : Shift and goto state 81
State : 81
Stack : NAME LESS . <Token: 'NUMBER' '2'>
ERROR: Error : NAME LESS . <Token: 'NUMBER' '2'>
如果我需要更多的解析器,我可以提供它。謝謝。
編輯:向我提出的一種解決方案是讓類型自己的令牌。這需要一點工作,因爲我的語言不使用像C/C++這樣的預處理器包含系統,但是我認爲它仍然是可能的,但是我更喜歡一個限於語法的解決方案。
不幸的是,如果沒有使用特定的模板規則,語法就會更加模糊,並且會導致更瑣碎的情況失敗。我認爲你是對的,我需要添加上下文,這對於簡單情況(內建類型或在該文件中定義的類型)很容易,但對於使用我的導入系統的事物很困難。好吧 :) – 2009-11-27 18:35:32