2013-04-08 22 views
0

我爲LALR解析器編寫了語法,而且我被困在可選的非終端中。例如,考慮C++解引用時,你可以寫:如何用可選的非終端修復語法?

******expression; 

當然,你可以寫:

expression; 

這裏是我的問題,取消引用非終端是可選真的,這對語法等的影響,現在解析器認爲它適用於任何地方(幾乎),因爲它可能是空的。

是否有一個共同的模式我該如何重寫語法來修復它?

我也很樂意指出一些書或其他資源,它們處理「編寫語法時常見的問題&模式」。

回答

1

首先,您遇到的問題不是您聲稱擁有的問題。有一個可爲空(可能爲空)的非終結符並不意味着解析器會試圖將它粘到任何地方。 (我在這裏使用術語「可空」來避免混淆,因爲「可選」可能指可選的非終結符,如x?,其中x是非終結符名稱)。它只是意味着只要在語法中使用非終結符,解析器可能會跳過它或匹配空白詞(細節取決於特定解析算法的規則,在您的情況下爲LALR)。

其次,問題最可能的是由此產生的語法不明確。我的猜測是,您使用了右遞歸的組合方式來定義非終結符和星號,並使用星號作爲二進制乘法運算符。 (隨意用語法片段更新問題,那麼我可能會提供更詳細的幫助)。

第三,主要關注你對語法中一般問題和模式的追求:通常人們不會將星星放在一個非終結符中,而將表達式放在另一個非終結符中,因爲最終你會想要將你的解析樹轉換成抽象語法樹您可能打算進行一些計算,在這種情況下,您希望有一個構造,說明「取消對錶達」而非「三星後接表達式」「的取消引用的取消引用。如果你提供了更多的細節,答案也不會太模糊。

+0

我幾乎沒有經驗,因爲你的方法很好地解決了這個問題(謝謝),沒有什麼可以添加的;-)。但是,當我獲得更多的經驗,我會再次看到這種模式,我不能用這個解決方案來解決它,我會再次發佈。但現在它工作。 – greenoldman