Существуют ли программные инструменты для преобразования Perl в Python?

В моей новой работе больше людей используют Python, чем Perl, и у меня есть очень полезный API, который я написал сам, и я хотел бы сделать доступным для своих сотрудников в Python.

Я думал, что компилятор, который скомпилировал Perl-код в код Python, был бы действительно полезен для такой задачи. Прежде чем пытаться написать что-то, что проанализировало Perl (или, по крайней мере, подмножество Perl, которое я использовал при определении моего API), я столкнулся с bridgekeeper от консультанта.

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

Кто-нибудь знает о компиляторе, который проанализирует (или попытается разобрать!) код Perl5 и скомпилирует его в Python? Если этого не происходит, как мне начать писать простой компилятор, который анализирует мой объектно-ориентированный код Perl и превращает его в Python? Есть ли ANTLR или YACC-грамматика, которую я могу использовать в качестве отправной точки?

Изменить: я нашел perl.y, что может быть отправной точкой, если я должен был свернуть собственный компилятор.

Ответы

Ответ 1

Джеймс

Я рекомендую вам просто переписать модуль в Python по нескольким причинам:

  • Parsing Perl - DARN HARD. Если это не является важным и желательным упражнением для вас, вы обнаружите, что тратите гораздо больше времени на перевод, чем на полезную работу.
  • Переписав его, у вас будет отличный шанс попрактиковаться в Python. Учить лучше всего делать, и выполнение задачи, которую вам действительно нужно сделать, - отличное благо.
  • Наконец, у Python и Perl есть совершенно разные философии. Чтобы получить более Pythonic API, лучше всего переписать его на Python.

Ответ 2

Я думаю, вы должны переписать свой код. Качество результатов синтаксического анализа зависит от вашего стиля кодирования Perl. Я думаю, что цитата ниже очень хорошо отражает теоретическую сторону. Материал из Википедии: Perl в Википедии

Perl имеет грамматику Turing-complete, поскольку на синтаксический анализ может влиять код выполнения, выполняемый во время фазы компиляции. [25] Поэтому Perl не может быть проанализирован прямой комбинацией лексер/парсер Lex/Yacc. Вместо этого интерпретатор реализует свой собственный лексер, который координирует с модифицированным анализатором бинов двоюродного брата GNU для устранения двусмысленностей на языке.

Часто говорят, что "Только perl может анализировать Perl", что означает, что только интерпретатор Perl (perl) может анализировать язык Perl (Perl), но даже это не так, как правило, истинно. Поскольку интерпретатор Perl может моделировать машину Тьюринга во время фазы ее компиляции, ей нужно будет решить проблему с остановкой, чтобы завершить разбор в каждом случае. Это давний результат, что проблема с остановкой неразрешима, и поэтому даже Perl не может всегда анализировать Perl. Perl делает необычный выбор, предоставляя пользователю доступ к полной мощности программирования на своей собственной фазе компиляции. Стоимость теоретической чистоты высока, но практические неудобства, по-видимому, редки.

Другие программы, которые берутся на разбор Perl, такие как анализаторы исходного кода и автоиндекторы, должны бороться не только с неоднозначными синтаксическими конструкциями, но и с неразрешимостью разбора Perl в общем случае. Проект PPI ​​Адама Кеннеди сосредоточился на анализе Perl-кода в качестве документа (сохраняющего его целостность как документ), вместо того, чтобы анализировать Perl как исполняемый код (который даже сам Perl не может всегда делать). Именно Кеннеди впервые предположил, что "разбор Перла страдает от" проблемы с остановкой "" [26], и это было позже доказано. [27]

Ответ 3

Начиная с 5.10 вы можете скомпилировать perl с экспериментальным Разнообразным украшением атрибутов и установить переменную среды PERL_XMLDUMP в имя файла, чтобы получить XML дамп дерева разбора (включая комментарии - очень полезно для переводчиков языка). Хотя, как говорит док, это незавершенное производство.

Ответ 4

Я никогда не пробовал, и кажется, что это не поддерживается, но возможно PyPerl является опцией?

Насколько велик этот API? Если это действительно так полезно, то почему бы вам не переписать его в python. Написание автоматического конвертера, вероятно, займет больше времени, чем переписывание API.

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

Обязательно ознакомьтесь с ответами weismat и eliben

Ответ 5

Как бы это ни смешно было преобразовать или переписать в python, я бы не сделал ни один из этих моих первых выборов. Тогда вы застряли с раздвоенной базой кода. Любые сделанные вами изменения придется дублировать.

Напишите какую-то оболочку для вашего API, к которой вы можете получить доступ извне Perl. Одна из возможностей - интерфейс RESTful. Другое, если вы не хотите заниматься сетевыми проблемами, заключается в создании набора инструментов командной строки, которые обращаются к API (возможно, передавая информацию как JSON). Затем вы можете написать легкую библиотеку python, которая обращается к API-интерфейсу обертки, используя httplib2 или подпроцесс (в зависимости от того, как вы реализовали оболочку).

Вам все равно придется обновлять API Python всякий раз, когда изменяется интерфейс, но теперь он только для изменений интерфейса.

Ответ 6

Вы можете попробовать написать парсер с PPI, выгрузить его в какую-то промежуточную форму и записать Python из нее. Трудный, но выполнимый. Полезно? Er....

Или вы можете перенести свой код на Perl 6, подождать Pynie, чтобы быть готовым, чтобы разрешить прямой вызов с Python на Perl6 в пределах одной и той же среды выполнения! Это не так далеко в конце концов. Слишком плохо Ponie мертв, хотя.

Ответ 7

https://perthon.sourceforge.net, возможно, сработает? Хотя он все еще находится в альфа, я вижу большой потенциал.