Возникли проблемы с утомлением грамматики CSS 2.1 - PullRequest
4 голосов
/ 15 мая 2011

Я пишу кодируемый вручную механизм синтаксического анализа CSS 2.1 (в C #) и работаю непосредственно над грамматикой W3C CSS 2.1 (http://www.w3.org/TR/CSS21/grammar.html).). Однако есть маркер, который я просто не совсем понимаю.get:

url     ([!#$%&*-~]|{nonascii}|{escape})*

...

"url("{w}{url}{w}")"    {return URI;}
"url("{w}{string}{w}")" {return URI;}

Я не понимаю, что должен делать URL-адрес. Похоже, что это строка только из !#$%&*-~, не ascii или экранированных кодов Unicode.URL-адрес? Является ли этот продукт просто действительно плохо названным, и какой цели он должен служить?

Любая помощь приветствуется. К вашему сведению, я добавил тег C # только для увеличения аудитории у настоящих программистовкто мог столкнуться с этим или есть идеи - я прошу прощения, если вы думаете, что я не должен подавать заявку.

Ответы [ 3 ]

2 голосов
/ 16 февраля 2013

[!#$%&*-~] разбивается на:

!, #, $, %, &, а также диапазон символов * - ~.

Это принимает большинство печатных символов ASCII, включая прописные, строчные, цифры и диапазон знаков пунктуации.

Проще перечислить печатаемые символы ASCII, которым не соответствует это регулярное выражение:

Двойная кавычка ", одинарная кавычка ' и скобки (, );т.е. печатные символы ascii минус разделители.Это позволяет анализировать URL-адреса, которые не содержат кавычек.Например, url(http://example.com) вместо url("http://example.com").

Сжато, но сложно!

PS Имя токена также сбивает с толку.Лучшим именем было бы что-то вроде: url_string или url_arg.

РЕДАКТИРОВАТЬ февраль 2015 Последний CSS3 Синтаксис Spec называет токен url-unquoted

2 голосов
/ 15 мая 2011

Чувак, ты прочитал КОНТЕКСТ, окружающий это выражение?

baduri1         url\({w}([!#$%&*-\[\]-~]|{nonascii}|{escape})*{w}
baduri2         url\({w}{string}{w}
baduri3         url\({w}{badstring}

Хммм ... Плохо, плохо, плохо. Немного поддавки, а что? Как правило, если что-то в документе не имеет для вас смысла или выглядит просто неправильно, может быть, это не имеет смысла? Да? Таким образом, вы читаете вокруг этого ... чтобы получить правильный контекст.

1 голос
/ 10 октября 2012

Я не понимаю, что должен делать URL-адрес.Кажется, что это строка только! # $% & * - ~, не ascii или экранированных кодовых точек юникода.Как это URL?Является ли это произведение просто действительно плохо названным, и какой цели оно предназначено?

Первая строка определяет url как регулярное выражение:

url     ([!#$%&*-~]|{nonascii}|{escape})*

Вторая строкаопределяет URI как токен, который может быть произведен / возвращен лексером:

"url("{w}{url}{w}")"    {return URI;}

Во второй строке сказано, что если лексер видит url(, тогда {w} затем {url}, затем {w}затем ) затем он нашел URI.

Выражение {w} является необязательным пробелом.

Таким образом, согласно определению, {url} является регулярным выражением: которое определяет, чтосимволы допускаются внутри токена URI, между начальным url( и последним ).

...