使用 Lemon 实现 CSS 语法分析器

前段时间 CocoaSugar 项目需要一个 CSS 解析器。

我参考了一些开源实现,但都不尽人意。主要原因有:

  1. 项目太重,CocoaSugar 只要求支持 CSS 语法的一个子集;
  2. 命名空间,为了防止跟用户的依赖产生符号冲突,要做一些重命名工作。

因此,我只好自己实现一个 CSS 解析器。恰好前不久刚使用 FlexBison 实现过 SLL,自然想到用它们实现 CSS 解析器。

在好奇心的驱使下,我想看看有没有比 Flex 和 Bison 更好的替代品。搜索一阵发现了 Lemon。简单对比后,我决定用 Lemon 代替 Bison 来实现语法分析,词法分析则继续用 Flex。

坦白说,选择 Lemon 的主要原因是想尝试新的东西。不过,Lemon 的确有一些优点:首先,它生成的解析器是可重入的;而 Bison 默认生成的解析器是不可重入的,除非显式指定。另外,Lemon 还支持为 action 中的 token 指定占位符;而 Bison 只支持 $$$1 这样的位置参数,容易出错。

W3C 给出了 CSS 的语法,实现起来就非常轻松了。

代码放在了 COSStyleParser 这个仓库中。