2011-03-25 87 views
4

CSS2.1 grammar正確的CSS解析約定包括強大的諮詢到解析CSS直接就這樣,「因爲它不表達parsing conventions,只有CSS 2.1語法。」解析CSS 2.1,在ANTLR

確實,任何忽略這些解析約定的解析器(正如我們試圖做的那樣)在處理包含錯誤或未知構造的頁面時會遇到問題。

因此,我們希望我們的CSS2.1 ANTLR解析器 - 目前不遵循正向兼容和錯誤處理解析約定 - 以某種方式使用由基本語法生成的解析樹,該語法結合瞭解析約定。 (後者可能可能由另一個ANTLR解析器生成。)

這是一個合理的方法嗎?有很好的理解技術嗎?

重申一下,我們的目標是生成一個強大的CSS2.1解析器,該解析器可以按照CSS解析約定,優雅地處理錯誤和新的構造。

回答

2

我們採用了上面我們認爲可能工作的一般方法;它做了。

簡而言之,我們有兩個ANTLR解析器:一個用於核心CSS語法,另一個用於CSS2.1語法。 CSS2.1解析器可以獨立於核心CSS解析器執行。但是,這不是實際使用的方式。

核心CSS解析器用於構造基本解析樹。規則操作使用CSS 2.1語法的相應入口點重新解析文本,以生成CSS2.1語法在單獨執行時產生的相同C#對象。例如,核心CSS解析器中的規則集操作使用CSS 2.1語法中的規則集入口點重新解析匹配的文本,並將生成的對象添加到其結果中。

是我們花了大量的時間幾個重要的點要弄清楚:

  1. 被從外部代碼調用ANTLR解析器規則different在他們處理EOF的方式,相對於入口點被其他規則調用。

  2. 核心CSS語法需要進行擴充,具體取決於在不違反解析約定的情況下實際將哪個級別的CSS轉換爲。一個例子是@media at-rule,它的塊包含規則集,在切換到CSS2.1解析器之前,需要使用解析約定儘可能地進行解析。

希望這對希望做同樣事情的其他人有幫助。