2011-02-20 50 views
0

我正在研究解析器,我真的很沮喪。在語言中,我們可以有一個像表達式:快樂/ 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(這個問題已有詳細記錄),則選擇轉換。

你能幫我弄清楚出了什麼問題嗎?我真的很感謝你的幫助,我真的很傾向於試圖找出問題的風車。

回答

1

您可能會爲'['和/或']'設置優先級,類似%left '['這會導致此行爲。刪除該優先聲明,這將顯示您在此處的轉換/減少衝突。至於爲什麼它的轉換/減少衝突,你可能也有一個規則:

Expression: Expression '[' Expression ']' 

爲數組訪問。問題是,由於NewExpressionExpression,它後面可能跟着一個像這樣的索引,並且在查看'['的前視圖時,它無法分辨這是索引表達式的開始還是EmptyArray的開始 - 這將需要2令牌前瞻。

你可以嘗試這個特定情況的一件事是讓你的詞法分析器做這裏所需的額外預見並將[]識別爲一個單一的標記。

+0

是的,原來是這個問題。我昨天下午意識到我在錯誤的地方尋找問題,一旦我意識到問題所在,我實際上得出了同樣的解決方案 - 將一個空陣列作爲一個標記。謝謝!這個錯誤正在殺死我。 –