Подтвердить что ты не робот

Где я могу найти формальную грамматику для языка программирования Perl?

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

4b9b3361

Ответ 1

От perlfaq7

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

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

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

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

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


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

Ответ 2

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

Из этой ссылки:

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

что угодно /25; #/; умереть "это умирает!";

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

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

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

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

Ответ 3

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

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