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

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

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

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

2 ответа

Решение

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

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

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

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

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

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

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

Формальная спецификация того, что делает хороший или плохой CSS, представлена ​​W3C:

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 была разработана Теория синтаксического анализа...

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

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

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

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

Другие вопросы по тегам