CSS2.1语法强烈建议不要直接解析CSS,"因为它没有表达解析约定, 只有CSS 2.1语法." 事实上,任何忽略这些解析约定的解析器(我们尝试过)在处理包含错误或未知结构的页面时会遇到问题。 因此,我们希望我们的CSS2.1 ANTLR解析器 - 目前不遵循向前兼容和错误处理解析约定 - 能够以某种方式使用基本语法生成的解析树,该解析树包含解析约定。(后者可能可以由另一个ANTLR解析器生成。) 这是一个合理的方法吗?是否有已经被广泛认可的技术可以做到这一点? 重申一下,目标是产生一个强大的CSS2.1解析器,能够优雅地处理错误和新的结构,符合CSS解析约定。
我们采用了上述通用方法,认为它可能有效;结果确实如此。简而言之,我们有两个ANTLR解析器:一个用于核心CSS语法,另一个用于CSS2.1语法。CSS2.1解析器可以独立于核心CSS解析器执行。然而,实际上并不是这样使用的。核心CSS解析器用于构建基本的解析树。规则操作重新使用CSS 2.1语法的适当入口点对文本进行重新解析,以生成与单独执行CSS2.1语法时相同的C#对象。例如,在核心CSS解析器中,规则集操作重新使用CSS 2.1语法中的规则集入口点来重新解析匹配的文本,并将生成的对象添加到其结果中。以下是需要花费我们很多时间才能弄清楚的几个重要点: 从外部代码调用的ANTLR解析器规则在处理EOF时与其他规则调用的入口点不同。 核心CSS语法需要根据实际翻译到哪个CSS级别进行扩充,而不违反解析约定。一个例子是@media at-rule,其块包含需要尽可能使用解析约定进行解析的规则集,然后再交给CSS2.1解析器。 希望对其他想要做同样事情的人有所帮助。