Мини-языки в Python - PullRequest
       21

Мини-языки в Python

43 голосов
/ 10 октября 2009

Я после создания простого анализатора мини-языков в Python, программирования близко к проблемной области и все такое.

В любом случае, мне было интересно, как люди здесь будут делать это - каковы предпочтительные способы делать подобные вещи в Python?

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

Спасибо за ваш вклад!

Ответы [ 6 ]

40 голосов
/ 10 октября 2009

Pyparsing удобен для написания "маленьких языков". На PyCon'06 я выступил с презентацией по написанию простого движка приключенческой игры, в котором анализируемым и интерпретируемым языком был набор игровых команд («инвентарь», «взять меч», «выпадающая книга», так далее.). (Исходный код здесь .)

Вы также можете найти ссылки на другие статьи, посвященные pyparsing, на вики-странице pyparsing Страница публикаций .

23 голосов
/ 10 октября 2009

У меня ограниченный, но положительный опыт работы с PLY (Python Lex-Yacc). Он объединяет функциональность Lex и Yacc в одном классе Python. Вы можете проверить это.

Товарищ Stackoverflow'er Нед Бэтчелдер имеет хороший обзор доступных инструментов на своем сайте. Также есть обзор самого сайта Python .

20 голосов
/ 10 октября 2009

Я бы порекомендовал funcparserlib. Он был написан специально для анализа небольших языков и DSL, и он быстрее и меньше, чем pyparsing (см. Статистику на его домашней странице). Минималистам и функциональным программистам должно понравиться funcparserlib.

Редактировать: Кстати, я автор этой библиотеки, поэтому мое мнение может быть предвзятым.

5 голосов
/ 10 октября 2009

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

Я вижу, что, хотя я набрал выше, PLY уже упоминалось.

3 голосов
/ 04 октября 2016

Если вы спросите меня об этом сейчас, я бы попробовал библиотеку textx для python. Вы можете очень легко создать DSL в этом с Python! Преимущества заключаются в том, что он создает для вас AST, а лексинг и разбор объединяются.

http://igordejanovic.net/textX/

3 голосов
/ 10 октября 2009

Чтобы быть продуктивным, я всегда использовал генератор синтаксического анализатора, такой как CocoPy ( Tutorial ), чтобы ваша грамматика была преобразована в (правильный) синтаксический анализатор (если вы не хотите реализовать парсер вручную для обучения).

Остальное - написание фактического интерпретатора / компилятора (создайте байтовый код на основе стека или AST памяти для интерпретации, а затем оцените его).

...