Мини-языки в Python
Я создаю простой мини-синтаксический анализатор в Python, программируя рядом с проблемным доменом и все такое.
Во всяком случае, мне было интересно, как люди здесь будут заниматься этим - какие предпочтительные способы делать такие вещи на Python?
Я не буду давать подробные сведения о том, что мне нужно, потому что на данный момент я просто изучаю, насколько легко все это поле находится в Python.
Спасибо за ваш вклад!
Ответы
Ответ 1
Pyparsing удобен для написания "маленьких языков". Я выступил с презентацией на PyCon'06 по написанию простого движка приключенческой игры, в котором анализируемым и интерпретируемым языком был набор игровых команд ("инвентарь", "взять меч", "бросить книгу", и т.д.). (Исходный код здесь.)
Вы также можете найти ссылки на другие статьи о разборке в вики.
Ответ 2
У меня ограниченный, но положительный опыт работы с PLY (Python Lex-Yacc). Он объединяет функции Lex и Yacc в одном классе Python. Вы можете проверить это.
Сотрудник Stackoverflow'er Нед Бэтчелдер имеет хороший обзор доступных инструментов на своем веб-сайте. Там также есть обзор самого сайта Python.
Ответ 3
Я бы порекомендовал funcparserlib
. Он был написан специально для парсинга небольших языков и DSL, и он быстрее и меньше, чем pyparsing
(см. Статистику на главной странице). Минималистам и функциональным программистам нравится funcparserlib
.
Изменить: Кстати, я автор этой библиотеки, поэтому мое мнение может быть предвзятым.
Ответ 4
Python - это такой удивительно простой и расширяемый язык, что я бы предложил просто создать всеобъемлющий модуль на Python и программировать против него.
Я вижу, что в то время как я напечатал выше, PLY
уже упоминалось.
Ответ 5
Чтобы быть продуктивным, я всегда использовал генератор синтаксического анализатора, например CocoPy (Tutorial), чтобы ваша грамматика трансформировалась в (правильный) парсер (если вы не хотите реализовать парсер вручную ради обучения).
Остальное записывает фактический интерпретатор/компилятор (создайте байт-код на основе стека или память AST для интерпретации, а затем оцените его).
Ответ 6
Если вы спросите меня об этом сейчас, я бы попробовал библиотеку textx для python. Вы можете очень легко создать dsl в том, что с python! Преимущества заключаются в том, что он создает для вас AST, а лексирование и синтаксический анализ объединяются.
http://igordejanovic.net/textX/