2009-07-06 70 views
9

我在寫解析器來解析CSS。如何測試CSS解析器?

我通過修改CSS reference grammar開始,使用我正在使用的3rd-party parser generator tool支持的任何語法和詞法分析器語法。

我認爲我已經完成了語法的編碼:解析器生成器現在能夠爲我的語法生成狀態轉換表。

結果(解析器 - 生成器的輸出)大約爲116個「規則」,這對應於switch語句中的116個個案。這些規則/ switch語句的實例是:

  1. 樣式表開始於指定字符集
  2. 樣式開始,而不指定字符集:
  3. 樣式表是空的
  4. 樣式表以空格開頭
  5. ... etc ...

解析器生成器已經爲我做了所有的事情,現在我開始寫(用手)各種switch語句的例子,這將構建我認爲人們稱之爲「抽象語法樹」的東西。

我的問題是關於如何測試這個。我認爲我想要的是一組運行各種組合和可能性的CSS文件:例如一個指定字符集的CSS文件;另一個不指定字符集的文件;等

  • 一般的方式自動生成該組輸入數據,對於任意語法或一組規則?

  • 或者,是否有一組專用 CSS文件,其目的是覆蓋標準CSS語法所允許的組合和可能性?

如果我對這一切都錯了,隨意評論。

目前我不需要:

  • 文件來測試非法輸入的處理(即不符合語法的文件)

  • 如何測試各種瀏覽器基於他們解析CSS渲染的

回答

2

上下文無關文法隱含提出了一組無限的(解析)樹。每個提議的樹都有一組葉子,這些葉子以語法接受的語言形成具體的句子。通過探索提出的樹集(例如,根據可能的替代方案擴展每個非終結符),可以生成該語言的任意實例。您可以通過走樹建議和隨機選擇來生成一組測試。更有重點的方法是使用迭代加深搜索來生成按大小排序的句子。用任何有趣的語法,你可能會得到大量的實例,但嘿,這就是自動化測試的目的。

我不會做的就是從你的生產語法中生成這樣的句子,因爲你生成的句子按照定義將是它接受的句子: - {你應該做的是用參考來構造你的句子生成器語法,利用您接受的內容以及您實施的內容可能會有所不同。

+0

用我的語法,我有大約55個非終端。如果我將它評估爲自頂向下的解析器,那麼與頂級非終端關聯的方法將調用與較低級別非終端關聯的方法,以此類推。每個非終端方法調用大約1到3個低級方法(通過方法內的`switch`語句),並由1個或有時2個不同的高級方法調用。這將是什麼,甚至只是得到完整的代碼覆蓋率:確保每一種可能性都經過至少一次測試(不希望每種可能性的每種組合),... – ChrisW 2009-07-11 21:20:45