Построение простого интерпретатора
Я начинаю проект, где мне нужно реализовать легкий переводчик. Интерпретатор используется для выполнения простых научных алгоритмов. Язык программирования, который будет использовать этот интерпретатор, должен быть простым, так как он ориентирован на разработчиков не программного обеспечения (например, математиков.)
интерпретатор должен поддерживать основные возможности языков программирования:
- реальные числа, переменные, многомерные массивы
- двоичный (+, -, *, /, %) и логический (==, !=, , =) операции
- циклы (for, while), условные выражения (if)
- функции
MathWorks MatLab является хорошим примером того, куда я направляюсь, просто намного проще. Интерпретатор будет использоваться в качестве среды для демонстрации алгоритмов; простые алгоритмы, такие как поиск среднего набора данных/массива, или немного более сложные алгоритмы, такие как метод Гаусса или RSA.
лучший / самый практичный ресурс, который я нашел по этому вопросу, - запись Рона Айюба в проекте кода (разбор алгебраических выражений с помощью шаблона интерпретатора) - идеальный пример уменьшенной версии моей проблемы.
фиолетовая книга Дракона, кажется, слишком много, что-нибудь более практичное?
интерпретатор будет реализован как библиотека .NET, используя C#. Однако ресурсы для любой платформы приветствуются, так как дизайн-архитектура часть этой проблемы является наиболее сложным.
любые практические ресурсы?
(пожалуйста, избегайте ответов "это не тривиально" или "зачем заново изобретать колесо")
8 ответов
Я бы написал его в ANTLR. Напишите грамматику, пусть ANTLR генерирует парсер C#. Вы можете ANTLR запросить дерево синтаксического анализа, и, возможно, интерпретатор уже может работать с деревом синтаксического анализа. Возможно, вам придется преобразовать дерево синтаксического анализа в более абстрактное внутреннее представление (хотя ANTLR уже позволяет исключить неуместную пунктуацию при создании дерева).
Это может показаться странным, но Game Scripting Mastery-отличный ресурс для изучения синтаксического анализа, компиляции и интерпретации кода.
вы действительно должны проверить это:
http://www.amazon.com/Scripting-Mastery-Premier-Press-Development/dp/1931841578
один из способов сделать это-изучить исходный код для существующего интерпретатора. Я написал интерпретатор javascript на языке программирования D, вы можете скачать исходный код изhttp://ftp.digitalmars.com/dmdscript.zip
Уолтер Брайт, Цифровой Марс
Lua был задуман как расширяемый интерпретатор для использования не программистами. (Первыми пользователями были бразильские геологи-нефтяники, хотя база пользователей значительно расширилась С тех пор.) Вы можете взять Lua и легко добавить свои научные алгоритмы, визуализации, что у вас есть. Он великолепно спроектирован, и вы можете справиться с задачей.
конечно, если то, что вы действительно хотите, это удовольствие от создания своего собственного, то другой совет разумный.
вы рассматривали возможность использования установить IronPython? Он прост в использовании с .NET и, похоже, соответствует всем вашим требованиям. Я понимаю, что python довольно популярен для научного программирования, поэтому возможно, ваши пользователи уже будут знакомы с ним.
язык программирования, который будет использовать этот интерпретатор, должен быть простым, так как он ориентирован на разработчиков не программного обеспечения.
Я собираюсь вмешаться в эту часть вашего вопроса. Простой язык-это не то, что вы действительно хотите передать разработчикам без программного обеспечения. Раздели языки требуют больше усилий со стороны программиста. Что вы действительно хотите id хорошо спроектированный и хорошо реализованный доменный язык (DSL).
в этом смысле я будет вторым, что Норман Рэмси рекомендует с Lua. Оно имеет превосходную репутацию как основание для высокомарочного DSLs. Хорошо документированный и полезный DSL требует времени и усилий, но сэкономит время в долгосрочной перспективе, когда эксперты домена могут быть быстро ускорены и требуют минимальной поддержки.
Я удивлен, что никто не упомянул xtext еще. Он доступен как Eclipse-плагин и плагин IntelliJ. Он предоставляет не только парсер, такой как ANTLR, но и весь конвейер (включая парсер, компоновщик, typechecker, компилятор), необходимый для DSL. Вы можете проверить исходный код на Github для понимания того, как работает интерпретатор/компилятор.