язык программирования реализован на чистом питоне - PullRequest
2 голосов
/ 21 марта 2010

Я создаю (изучаю возможность) настраиваемый клиент Python и хотел бы позволить пользователям фактически редактировать код на другом языке, чтобы настроить запуск программы.(аналог браузера, который сам кодируется на c / c ++ и работает на другом языке html / js).Итак, мой вопрос, есть ли какой-либо язык программирования, реализованный на чистом Python, который я могу видеть в качестве справочного материала (или использовать напрямую?) - мне нужен простой язык (простые операторы и если можно сделать)если я не прояснил себя, но то, что я хочу, это «язык для настройки работы программы», хотя pypi кажется отличным вариантом, то я ищу более простой способ, который я могу изучить и расширить, если возникнет необходимость.мои поиски в Google, указывающие на ланги на основе xml.(BMEL, XForms и т. Д.).

Ответы [ 8 ]

4 голосов
/ 21 марта 2010

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

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

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

3 голосов
/ 21 марта 2010

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

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

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

3 голосов
/ 21 марта 2010

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

1 голос
/ 21 марта 2010

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

1 голос
/ 21 марта 2010

PLY (Python Lex-Yacc) это то, что вас интересует.

1 голос
/ 21 марта 2010

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

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

0 голосов
/ 21 марта 2010

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

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

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

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

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

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

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

0 голосов
/ 21 марта 2010

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

...