Antlr 如何为css短颜色表示法制定lexer规则?

Antlr 如何为css短颜色表示法制定lexer规则?,antlr,antlr4,Antlr,Antlr4,对于一个学校项目,我正在构建一个CSS编译器,将我的CSS版本编译成常规的CSS 我想允许用户编写一个包含三个字符的CSS六码,而这个六码只是同一个字符 #ffffff可以写成:#fff 等效正则表达式为: #([0-9a-f])\1\1 我知道还有一些短颜色代码与此不匹配,例如石灰的#0f0。ANTLR不支持反向引用。指定所有数字必须相同的要求的唯一方法是手动拼写所有组合: ThreeDigitHex: '#000' | '#111' | ... | '#fff'; 除了令人讨厌之外,这还

对于一个学校项目,我正在构建一个CSS编译器,将我的CSS版本编译成常规的CSS

我想允许用户编写一个包含三个字符的CSS六码,而这个六码只是同一个字符

#ffffff
可以写成:
#fff

等效正则表达式为:

#([0-9a-f])\1\1

我知道还有一些短颜色代码与此不匹配,例如石灰的
#0f0

ANTLR不支持反向引用。指定所有数字必须相同的要求的唯一方法是手动拼写所有组合:

ThreeDigitHex: '#000' | '#111' | ... | '#fff';
除了令人讨厌之外,这还意味着像
#abc
这样的东西会给你一些像“意外的”#'、预期的三位数、ColorName或六位数”这样的东西,这并没有特别的帮助

更好的选择可能是只允许任何三个数字,然后添加一个操作,检查所有数字是否相同,如果不相同,则会产生有意义的错误(如“三字母十六进制代码中的所有数字必须相同”)


尽管如此,我并不认为这种特殊的限制有多大意义。真正的CSS允许将
#abc
作为
#aabbcc
的快捷方式而不存在任何问题,因此不清楚您为什么要付出额外的努力使您的CSS版本与真正的CSS不太兼容。

为什么只有在字符相同的情况下才这样做?为什么不允许
#aabbcc
使用
#abc
?请注意,CSS已经支持这种语法。@sepp2k我认为这也会允许许多代码没有指定颜色值。我不明白“指定颜色值”是什么意思。从
#000000
#ffffff
的所有内容在CSS中都是合法的颜色。即使不是这样,您仍然允许用户编写
#aabbcc
,对吗?那么,允许他们编写
#abc
会有什么影响呢?同样,真正的CSS允许
#abc
没有任何问题。