В терминах JNI clone
реализуется (или может быть) с использованием метода AllocObject
, который создает новый объект без вызова какого-либо конструктора (в отличие от NewObject
). Когда у вас есть новый объект, отражение используется для мелкой копии всех полей.
Но опять-таки механизм clone
/ Clonable
принципиально нарушен в Java. У Джошуа Блоха есть раздел об этом в Эффективном Java . Существует также несколько связанных с этим SO вопросов .
Pyparsing удобен для написания "маленьких языков". Я сделал презентацию на PyCon'06 о написании простого движка приключенческой игры, в котором язык, анализируемый и интерпретируемый, был набором игровых команд («инвентарь», «взять меч», «выпустить книгу», так далее.). (Исходный код здесь .)
Вы также можете найти ссылки на другие статьи о pyparsing в wiki по pyparsing .
Python - настолько удивительно простой и расширяемый язык, что я бы предложил просто создать комплексный модуль python и написать код против него.
Я вижу, что пока я набирал вышеупомянутое, PLY
уже упоминался.
У меня ограниченный, но положительный опыт работы с PLY (Python Lex-Yacc). Он объединяет функции Lex и Yacc в одном классе Python. Вы можете проверить это.
Сотрудник Stackoverflow'er Нед Батчелдер имеет хороший обзор доступных инструментов на своем веб-сайте. Также есть обзор на веб-сайте Python .
Я бы порекомендовал funcparserlib
. Он был написан специально для синтаксического анализа небольших языков и DSL, и он быстрее и меньше, чем pyparsing
(см. Статистику на его домашней странице). Минималистам и функциональным программистам может понравиться funcparserlib
.
Edit: Кстати, я являюсь автором этой библиотеки, поэтому мое мнение может быть необъективным.
Чтобы быть продуктивным, я всегда использовал бы генератор синтаксического анализатора, например CocoPy ( Учебник ), чтобы преобразовать вашу грамматику в (правильный ) parser (если вы не хотите реализовать парсер вручную для обучения).
Остальное - это написание фактического интерпретатора / компилятора (создание байтового кода на основе стека или памяти AST для интерпретации, а затем его оценка).