我正在研究解析器,我真的很沮喪。在語言中,我們可以有一個像表達式:快樂/ YACC減少時它應該轉移
new int[3][][]
或
new int[3]
它的大部分解析正確的,除了在端部的空陣列。 在我的解析器,我有:
Expression : int
char
null
(...many others...)
new NewExpression
然後NewExpression是:
NewExpression : NonArrayType '[' Expression ']' EmptyArrays
| NonArrayType '[' Expression ']'
然後EmptyArrays是一個或多個空括號 - 如果EmptyArrays導出空字符串,它增加了20移進/歸約衝突:
EmptyArrays : EmptyArrays EmptyArray
| EmptyArray
EmptyArray : '[' ']'
然而,當我看在.info
文件解析器,我得到這個:
State 214¬
¬
▸ NewExpression -> NonArrayType lbrace Expression rbrace . EmptyArrays (rule 80)¬
▸ NewExpression -> NonArrayType lbrace Expression rbrace . (rule 81)¬
¬
▸ dot reduce using rule 81¬
▸ ';' reduce using rule 81¬
▸ ',' reduce using rule 81¬
▸ '+' reduce using rule 81¬
▸ '-' reduce using rule 81¬
▸ '*' reduce using rule 81¬
▸ '/' reduce using rule 81¬
▸ '<' reduce using rule 81¬
▸ '>' reduce using rule 81¬
▸ '<=' reduce using rule 81¬
▸ '>=' reduce using rule 81¬
▸ '==' reduce using rule 81¬
▸ '!=' reduce using rule 81¬
▸ ')' reduce using rule 81¬
▸ '[' reduce using rule 81 --I expect this should shift
▸ ']' reduce using rule 81¬
▸ '?' reduce using rule 81¬
▸ ':' reduce using rule 81¬
▸ '&&' reduce using rule 81¬
▸ '||' reduce using rule 81
雖然我期望如果我們處於狀態214並且看到一個左括號,我們應該將它移到堆棧上並繼續解析EmptyArrays。
我不完全確定發生了什麼,因爲當我通過開始解析NewExpression
來解除所有多餘的行李(例如)時,附加括號正確解析。表達式或語句或語法中的任何非終端都不可能以左大括號開頭。特別是因爲我對if/else語句有類似的規則,這會產生shift/reduce衝突,但如果下一個token是else(這個問題已有詳細記錄),則選擇轉換。
你能幫我弄清楚出了什麼問題嗎?我真的很感謝你的幫助,我真的很傾向於試圖找出問題的風車。
是的,原來是這個問題。我昨天下午意識到我在錯誤的地方尋找問題,一旦我意識到問題所在,我實際上得出了同樣的解決方案 - 將一個空陣列作爲一個標記。謝謝!這個錯誤正在殺死我。 –