2012-08-29 61 views
8

我正在玩parsec,並意識到我有一個模棱兩可的語法。很明顯,這是我的錯誤,但我有點習慣yacc風格的解析器生成器讓我知道我是愚蠢的。 Parsec只是按照你給它的解析器的順序吃字符(是的,我知道關於try)。有沒有辦法讓parsec報告「轉移 - 減少」衝突?

有沒有什麼辦法讓parsec告訴我什麼時候我的語法沒有被保留?爲我工作的程序非常棒。

謝謝!

(我知道移減輕了與不同種類的解析器技術做。我只是意味着描述歧義語法。)

回答

8

我不是專家秒差距,所以我很容易被糾正,但我不認爲這是可能的,原因很簡單,Parsec對你的語法一無所知。

或者換句話說,雖然你的語法可能不明確,但你的Parsec分析器不是,程序也沒有辦法確定一些其他的parsec組合器的排列方式,它們爲等效輸入產生不同的輸出,也是一種未指定語法的有效表示。

既然你確實有語法,你可能更喜歡使用happyalex,這會給你更多的lexx/yacc-like的體驗。

一個有趣的項目可能是修改BNFC來生成一個parsec組合器來表示一個語法,但我懷疑這將是一個不平凡的任務。