Можно сделать это при установке display:block. Но в html 4.01, строгом, необходимо определить седла и строки, но я думаю, что можно переопределить их с css.
Попробуйте переместить # в вашем файле лексера из COLOR в его собственный объект, как таковой:
LLETTERS: ( 'a'..'z' )
ULETTERS: ( 'A'..'Z' )
NUMBERS: ( '0'..'9' )
HASH : '#';
Затем в ваших правилах парсера вы можете сделать это следующим образом:
color: HASH (LLETTERS | ALPHANUM)+;
selector: HASH (ULETTERS | LLETTERS) (ULETTERS | LLETTERS | NUMBERS)*;
и т. Д.
Это позволяет вам указать разницу грамматически, что можно грубо описать как контекстуально, а не лексически, что примерно можно описать как внешность. Если значение чего-то меняется в зависимости от того, где оно находится, это различие следует указывать в грамматике, а не в лексическом анализаторе.
Обратите внимание, что цвет и селектор - это одно и то же определение. Лексеры обычно являются отдельным этапом от модуля, который переводит входную строку в грамматику, поэтому недопустимо иметь неоднозначную лексику (как было указано, bbb может быть шестнадцатеричным или строчной буквой). Таким образом, проверка достоверности данных должна выполняться в другом месте.
Аналогично тому, что сказал Уолт, Приложение G. Грамматика CSS 2.1 сообщает lex HASH
, а затем (в зависимости от его положения относительно других token) для анализа HASH
либо как simple_selector
, либо как hexcolor
.
Лексер определяет следующий токен ...
"#"{name} {return HASH;}
.. ..и грамматика включает следующие правила ...
hexcolor
: HASH S*
;
simple_selector
: element_name [ HASH | class | attrib | pseudo ]*
| [ HASH | class | attrib | pseudo ]+
;
Это означает, что синтаксический анализатор, основанный на грамматике, допускает использование не-шестнадцатеричного цвета.
Я обнаружил бы не-шестнадцатеричный цвет позже, в коде, который анализирует / интерпретирует лексированное + проанализированное синтаксическое дерево.