2012-06-12 47 views
7

我想編寫一套Parsec解析器的測試。這裏有一個解析器的一個簡單的例子,我想快速檢查測試:通過使用QuickCheck生成輸入來測試Parsec解析器

identifier = do 
    c <- letter 
    cs <- many (alphaNum <|> oneOf identSymbols) 
    skipSpaces 
    return $ Ident $ c:cs 

所以,理想情況下,我想快速檢查,以產生有效的標識符,並確保我得到正確的結果反饋,以及產生無效的標識符並確保他們返回ParseError。是否有任何公用事業可以使這種事情更容易?有沒有一種方法可以「反向運行我的解析器」,可以這麼說,生成這樣的輸入?

一般來說,這個解析器的QuickCheck測試的好套件是什麼樣的?在某種程度上,我似乎基本上必須在QuickCheck中複製解析器的邏輯以實現徹底的測試。這真的是一個好主意,或者這可能是一種更傳統的工具,比如HUnit比QuickCheck更合適?

回答

13

一般來說,解析器的反轉是一個漂亮的打印機,隨機輸入到解析器的反面是隨機打印一個AST。

因此,請按照usual approach的規定爲AST定義一個任意實例,它驅動隨機格式良好的語法片段。將一些錯誤的字符作爲包裝來測試錯誤處理。

參見:

+0

我喜歡使用的特定屬性是parse = parse。漂亮 。解析。這是一個體面的方式來模擬解析器對信息的商定,從理論的角度來看,它有一個很好的推動力,它捕捉到一個很好的事實。解析是冪等的,如果不是身份函數。 (通常解析丟棄一些信息) –

+2

最後兩個鏈接都死了 –