使用ANTLR正确的CSS解析规则解析CSS 2.1

4

CSS2.1语法强烈建议不要直接解析CSS,"因为它没有表达解析约定, 只有CSS 2.1语法."

事实上,任何忽略这些解析约定的解析器(我们尝试过)在处理包含错误或未知结构的页面时会遇到问题。

因此,我们希望我们的CSS2.1 ANTLR解析器 - 目前不遵循向前兼容和错误处理解析约定 - 能够以某种方式使用基本语法生成的解析树,该解析树包含解析约定。(后者可能可以由另一个ANTLR解析器生成。)

这是一个合理的方法吗?是否有已经被广泛认可的技术可以做到这一点?

重申一下,目标是产生一个强大的CSS2.1解析器,能够优雅地处理错误和新的结构,符合CSS解析约定。

1个回答

2
我们采用了上述通用方法,认为它可能有效;结果确实如此。
简而言之,我们有两个ANTLR解析器:一个用于核心CSS语法,另一个用于CSS2.1语法。CSS2.1解析器可以独立于核心CSS解析器执行。然而,实际上并不是这样使用的。
核心CSS解析器用于构建基本的解析树。规则操作重新使用CSS 2.1语法的适当入口点对文本进行重新解析,以生成与单独执行CSS2.1语法时相同的C#对象。例如,在核心CSS解析器中,规则集操作重新使用CSS 2.1语法中的规则集入口点来重新解析匹配的文本,并将生成的对象添加到其结果中。
以下是需要花费我们很多时间才能弄清楚的几个重要点:
  1. 从外部代码调用的ANTLR解析器规则在处理EOF时与其他规则调用的入口点不同

  2. 核心CSS语法需要根据实际翻译到哪个CSS级别进行扩充,而不违反解析约定。一个例子是@media at-rule,其块包含需要尽可能使用解析约定进行解析的规则集,然后再交给CSS2.1解析器。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接