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