Может ли функция разбора rebol иметь возможность создавать правила для полного разбора css2 / css3? - PullRequest
2 голосов
/ 14 августа 2010

Есть ли ограничения для ребол функции питания? Будет ли он способен анализировать всю спецификацию css2 / css 3 или он столкнется с теоретической невозможностью сформировать некоторые правила?

Обновление после ответа HostileFork: я имею в виду в регулярном выражении, я думаю, что это было бы довольно невозможно, разве анализ гораздо более мощный?

Если да, значит ли это, что можно было бы создать браузер в rebol vid, совместимом с html5?

Ответы [ 2 ]

8 голосов
/ 15 августа 2010

Ваш вопрос "есть ли пределы" скользкий. Я постараюсь дать вам " ответ" вместо просто "да, конечно" ... что было бы более целесообразно, хотя и не слишком образовательно. :)

Рассмотрим следующий фрагмент. Он фиксирует позицию парсера в x, а затем выполняет то, что в скобках на диалекте DO. Этот код сбрасывает x в конец ввода, если функция css-parser завершается успешно, или в начало ввода, если функция не выполняется. Наконец, он устанавливает текущую позицию разбора x. И, как мы знаем, PARSE возвращает true, только если мы находимся в конце серии ввода, когда правила заканчиваются ...

parse my-css [x: (x: either css-parser x [tail x] [head x]]) :x]

Это действительный код разбора диалекта И возвращает значение true, если (и только если) функция css-parser завершается успешно. Поэтому, если вы вообще можете написать синтаксический анализатор CSS в Rebol, вы можете написать его «на диалекте синтаксического анализа».

(Это приводит к вопросу о том, что можно решить данную вычислительную проблему с помощью функции Rebol. К счастью, программисты не должны повторно отвечать на этот вопрос каждый раз, когда появляется новый язык. Вы можете вычислить все, что будет вычислено машиной Тьюринга, и ничего, что не может быть ... и проверить собственные слова Алана Тьюринга , с точки зрения непрофессионала. Синтаксический анализ CSS - это не совсем проблема остановки, так что да ... это можно сделать.)

Я попробую переформулировать ваш вопрос:

"Можно ли написать блок правил (в котором не используются конструкции PAREN !, SET-WORD !, или GET-WORD!), Которые можно передать в функцию PARSE и вернуть TRUE для любого допустимого Файл CSS и ЛОЖЬ на каком-нибудь уродливом? "

W3C выпускает формальную спецификацию того, что делает хорошо или плохо CSS:

http://www.w3.org/TR/CSS2/grammar.html

Но заметьте, что даже там не все так просто и сухо. Их «формальная» спецификация цветовых констант не может исключать #abcd, они должны были написать об этом в комментариях на английском языке:

/*
 * There is a constraint on the color that it must
 * have either 3 or 6 hex-digits (i.e., [0-9a-fA-F])
 * after the "#"; e.g., "#000" is OK, but "#abcd" is not.
 */
hexcolor
  : HASH S*
  ;

Это заставляет нас спросить, простим ли мы Ребола за неспособность сделать такое признание после того, как мы связали руки PARSE, забрав PAREN! / GET-WORD! / SET-WORD! (Я просто хочу указать на такую ​​проблему в свете вашего вопроса).

В рамках проекта разбора Rebol 3 была написана Теория разбора ...

Диалект PARSE является расширенным членом семейства языков синтаксического анализа сверху вниз (семейство TDPL), включая язык синтаксического анализа сверху вниз (TDPL), обобщенный язык синтаксического анализа сверху вниз (GTDPL) и синтаксический анализ грамматика выражения (PEG) и использует тот же метод разбора «упорядоченный выбор», что и другие члены семейства.

Как указывалось в ссылке выше, членство в этом классе делает Reseb PARSE строго более мощным, чем как регулярные выражения, так и LL-парсеры . Я предполагаю, что он более мощный, чем парсеры LL (k) и LL *, но уже давно я изучал этот материал и не стал бы ставить на это свою жизнь. :)

Вам на самом деле не нужно понимать, что все это значит, чтобы использовать его, чтобы ответить на ваш вопрос «можно ли это сделать». Поскольку люди утверждают, что анализируют CSS с ANTLR , а ANTLR является LL * -парсером, то я бы сказал, что Rebol может это сделать. PAREN! это туз в дыре, который позволяет вам делать «что угодно», если вы ударились о стену, но это скользкий путь, чтобы начать использовать его слишком небрежно.

1 голос
/ 15 августа 2010

Должен быть в состоянии проанализировать спецификацию, если у вас есть мотив и терпение, чтобы написать правила.Это было бы немного сложнее, чем, скажем, анализатор JSON, но это была бы та же идея.

...