Как сделать правило лексера для краткой цветовой записи CSS? - PullRequest
0 голосов
/ 10 октября 2019

Для школьного проекта я создаю компилятор CSS, который компилирует мою версию CSS в обычный CSS.

Я хочу разрешить пользователю писать шестнадцатеричный CSS-код с тремя символами, если шестнадцатеричный код - только один и тот же символ,

#ffffff затем можно записать в виде: #fff.

Эквивалентное регулярное выражение будет:

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

Я знаю, что существует такжекороткие цветовые коды, которые не будут соответствовать этому, например #0f0 для Lime.

1 Ответ

0 голосов
/ 15 октября 2019

ANTLR не поддерживает обратные ссылки. Единственный способ указать, что все цифры должны быть одинаковыми, это прописать все комбинации вручную:

ThreeDigitHex: '#000' | '#111' | ... | '#fff';

В дополнение к раздражению, это также означает, что что-то вроде #abc даст вам кое-чтокак "Неожиданный '#', ожидаемый ThreeDigitHex, ColorName или SixDigitHex", что не особенно полезно.

Лучшей альтернативой может быть просто разрешить любые три цифры и затем добавить действие, которое проверяет, все ли цифры являютсято же самое и выдает значимую ошибку (например, «Все цифры в трехбуквенном шестнадцатеричном коде должны быть одинаковыми»), если они не совпадают.

Все это говорит, я не обязательно думаю, что этот конкретныйограничение имеет много смысла. Реальный CSS позволяет без проблем использовать #abc в качестве ярлыка для #aabbcc, поэтому неясно, почему вы приложили дополнительные усилия, чтобы сделать вашу версию CSS менее совместимой с реальным CSS.

...