我正在尝试使用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有太多不明确的标记无法可靠地分成不同的标记,因此我现在使用的方法基本上是对特殊字符(如“#”、“。”、“:”和大括号)进行标记化,并在消费者代码中进行后处理。效果要好得多,而且容易处理边缘情况。