Где я могу найти формальную грамматику для языка программирования Perl? - PullRequest
18 голосов
/ 07 января 2011

Я понимаю, что синтаксис Perl неоднозначен и что его устранение неоднозначности нетривиально ( иногда включает выполнение кода на этапе компиляции ).Независимо от того, есть ли в Perl формальная грамматика (хотя и неоднозначная и / или контекстно-зависимая)?

Ответы [ 3 ]

30 голосов
/ 07 января 2011

С perlfaq7

Могу ли я получить BNF / yacc / RE для языка Perl?

Нет BNF, но вы можете проложить свой путь через грамматику yacc в perly.y в исходном дистрибутиве, если вы особенно смелы.Грамматика опирается на очень умный токенизирующий код, поэтому будьте готовы к тому, чтобы отправиться и в toke.c.

По словам Хаима Френкеля: «Грамматика Perl не может быть сведена к BNF.распределяется между yacc, лексером, дымом и зеркалами. "

Чтобы увидеть замечательный набор примеров того, ПОЧЕМУ практически невозможно проанализировать Perl из-за влияния контекста, посмотрите RandalПост Шварца: О синтаксическом анализе Perl

Кроме того, см. Обсуждение в " Perl 5 Internals (Глава 5. Лексер и парсер) " Саймона Козенса.


Обратите внимание, что ответ отличается для Perl6:

9 голосов
/ 08 января 2011

Другие люди ранее публиковали эту ссылку на похожие вопросы, но я думаю, что это весело и имеет хороший пример: Perl не может быть проанализирован (формальное доказательство) .

По этой ссылке:

[Рассмотрим] следующий дьявольский фрагмент кода, придуманный Рэндалом Шварцем, и определим правильный синтаксический анализ для него:

независимо от /25;# /;die "this dies!";

Фрагмент Шварца может анализировать два разных способа: если все, что является нулевым (то есть не принимает аргументов), первое утверждение является делением в пустом контексте, а остальная часть строкиэто комментарий.Если что-либо принимает аргумент, фрагмент кода Шварца анализирует как вызов любой функции с результатом оператора match, а затем вызов функции die ().

Это означает, что для статического анализа Perl, должно быть возможно определить из строки кода Perl 5, устанавливает ли он нулевой прототип для любой подпрограммы.

Я просто публикую эту часть, чтобы показать, что она действительно очень быстро становится очень сложной.

В качестве альтернативы, многие редакторы кода / текста могут выполнять приличную (хотя и не отличную) работу по выделению синтаксиса, так что вы можете начать с этих спецификаций, чтобы увидеть, что они делают.На самом деле вы вдохновили меня, я думаю, что я опубликую связанный вопрос, спрашивающий, какой редактор лучше всего выделяет Perl.

6 голосов
/ 07 января 2011

Не существует формальной грамматики в смысле «это спецификация Perl 5» (хотя попытка Perl 6 пытается это исправить).Но в исходном коде Perl 5 есть формальная грамматика.Конечно, понимание кода, скорее всего, не является тривиальной задачей.

Джеффри Кеглер также написал несколько хороших статей о грамматике perl в своем блоге.В частности, см. этот пост и этот пост .В остальной части блога есть довольно интересные мысли о парсинге в целом.

...