我正在尝试使用 ANTLR 解析 CSS,或者至少是基础知识。不过,我的词法分析器规则遇到了一些问题。问题在于 ID 选择器和十六进制颜色值之间的歧义。为了清楚起见,使用简化的语法,考虑以下输入:
#bbb {
color: #fff;
}
以及以下解析器规则:
ruleset : selector '{' property* '}';
selector: '#' ALPHANUM;
property: ALPHANUM ':' value ';' ;
value: COLOR;
和这些词法分析器标记:
ALPHANUM : ('a'..'z' | '0'..'9')+;
COLOR : '#' ('0'..'9' | 'a'..'f')+;
这不起作用,因为#bbb 被标记为颜色标记,即使它应该是一个选择器。如果我将选择器更改为不以十六进制字符开头,它可以正常工作。我不知道如何解决这个问题。有没有办法告诉 ANTLR 仅将特定标记视为颜色标记(如果它位于某个位置)?比如说,如果它在属性规则中,我可以安全地假设它是一个颜色标记。如果不是,则将其视为选择器。
任何帮助,将不胜感激!
解决方案:原来我试图在语法中做太多事情,我可能应该在使用 AST 的代码中处理。CSS 有太多模棱两可的标记,无法可靠地拆分成不同的标记,所以我现在使用的方法基本上是标记特殊字符,如'#'、'.'、':' 和花括号,并在消费者代码。效果更好,并且更容易处理边缘情况。