Может ли функция разбора 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, но это была бы та же идея.