2011-03-25 93 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解析器之前,需要使用解析约定尽可能地进行解析。

希望这对希望做同样事情的其他人有帮助。