2010-03-21 2 views
2

Я создаю (исследую возможность) очень настраиваемый клиент python и хочу, чтобы пользователи могли фактически редактировать код на другом языке для настройки работы программы. (аналогичный браузеру, который сам кодируется в c/C++ и запускает другой язык html/js). так что мой вопрос в том, есть ли какой-либо язык программирования, реализованный в чистом python, который я могу видеть как ссылку (или использовать напрямую?) - мне нужен простой язык (простые инструкции и ifs могут делать)язык программирования, реализованный в чистом python

Редактировать: извините, если i не делал себя ясным, но то, что я хочу, является «языком для настройки работы программы», хотя pypi кажется отличным вариантом, то, что я ищу, более просто, и я могу изучать и расширять себя, если это необходимо. мои поисковые запросы Google указывают на xml based langagues. (BMEL, XForms и т. Д.).

+1

Собираетесь ли вы попытаться обеспечить безопасность между своим кодом и вашей программой? Потому что, если нет, вы можете просто использовать python. –

+1

Не могли бы вы просто использовать Python? –

+0

Возможно, вам действительно не нужен язык, реализованный в python - вы можете связать/вставить язык в вашу программу, чтобы он мог быть реализован на любых других языках, таких как C. – Francis

ответ

1

В качестве примера могут служить многочисленные шаблонные языки, такие как гепард, шаблоны Django, Genshi, Mako, Mighty.

3

Ren'Py является модификацией синтаксиса Python, построенной поверх самого Python, используя language tools в stdlib.

+0

это похоже прохладный опция. TXS. – iamgopal

+0

Ren'Py не является модификацией, так как это отдельный язык, который позволяет встроить Python в исходный код и, возможно, также написан на Python. Просканирование через файлы parser.py и ast.py в источнике Ren'Py показывает, как это работает. –

0

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

+0

Я не могу представить, чтобы попросить пользователей изучить общий lisp для настройки моего приложения. Это походило бы на то, чтобы дать им Emacs, только немного менее болезненным. –

+0

Кто сказал что пользователям нужно будет изучить Common Lisp? Я имею в виду, что Common Lisp может быть как хост-язык, поверх которого может быть создан пользовательский DSL. Использование этих клиентов DSL может настроить ваше приложение. –

4

Вопрос не совсем ясен по области, но у меня есть подозрение, что PyPy, встраивание других полных языков и подобных решений может быть излишним. Похоже, что iamgopal действительно может заинтересоваться чем-то большим, чем Interpreter Pattern или Little Language.

Если язык, который вы хотите поддерживать, очень мал (см. Ссылку на шаблон интерпретатора), тогда ручное кодирование этого в Python не будет слишком сложным. Вы можете написать простой парсер (Google около, вот one example), затем пройдите по AST и оцените выражения пользователя.

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

1

Почему бы не сам Python? С некоторой осторожностью вы можете использовать eval для запуска кода пользователя.

Одна из хороших особенностей интерпретируемых языков сценариев заключается в том, что вам не нужен еще один дополнительный скриптовый язык!

0

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

if some flag 
    activate some feature 
    deactivate some feature 
elif some other flag 
    activate some feature 
    activate some feature 
else 
    logout 

Просто написать класс, который, в то время как синтаксические занимает первое слово, проверяет, является ли это «если, Элиф, иначе,» и т.д., и если да, то проверить флаг и установить флаг говорит вам, либо является или не выполняются до следующего условия. Если это не условно, вызовите функцию, основанную на первом ключевом слове, который каким-то образом изменит состояние программы.

Класс может хранить некоторое локальное состояние выполнения (находятся ли мы в операторе if? Если это так, мы выполняем эту ветвь?) И имеем еще один класс, содержащий какое-либо глобальное состояние приложения (флаги, которые можно проверить с помощью операторов if и т. Д.).

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

Серьезно, хотя, если вы попробуете это, будьте очень, очень осторожны.Не давайте сценариям какую-либо функциональность, чтобы они не определенно, потому что вы почти наверняка открываете дыры в безопасности, делая что-то вроде этого.

Не говорите, что я вас не предупреждал.

3

Для вашего удобства, не используйте язык на основе XML. XML - это ужасная основа для языка программирования, и ваши пользователи будут ненавидеть вас за это.

Вот предложение. Используйте строгий поднабор Python для вашего языка. Используйте compiler module, чтобы преобразовать свой код в абстрактное синтаксическое дерево и пройти дерево, чтобы проверить, соответствует ли код вашему подмножеству, прежде чем преобразовать AST в байт-код python.

N.B. Я просто проверил документы и увидел, что пакет компилятора устарел в 2.6 и удален в Python 3.x. Кто-нибудь знает, почему это так?

+0

Я предполагаю, что его функции дублируются в парсере и других языковых пакетах. http://docs.python.org/library/language.html –

Смежные вопросы