Я решил написать небольшой интерпретатор в качестве своего следующего проекта в Ruby. Какие знания и навыки мне понадобится, чтобы быть успешными?
Я еще не определился с языком, который нужно интерпретировать, но я ищу что-то, что не является игрушечным языком, но было бы относительно легко написать переводчика. Спасибо заранее.Как написать переводчика?
ответ
Вы должны научиться, как минимум:
- лексический анализ (группировка символов в лексемы)
- разборе (группировка лексем вместе в структуру)
- абстрактные синтаксические деревья (представляющие структуру программы в данных структура)
- представление данных (при условии, что ваш язык будет иметь переменные)
- контрольный цикл, который «запускает» вашу программу
Отличное введение в некоторые из этих тем можно найти в вводном тексте Structure and Interpretation of Computer Programs. Язык, используемый в этой книге, - это схема, которая является надежным, хорошо определенным языком, который идеально подходит для вашей первой реализации интерпретатора. Настоятельно рекомендуется.
Спасибо за отличный ответ. Просто любопытно, как долго, по вашему мнению, потребуется сделать простой рабочий интерпретатор? – bennybdbc
Ответ на этот вопрос зависит от многих факторов, наиболее важными из которых являются: (а) уровень опыта человека, выполняющего реализацию, и (б) выбор языка для интерпретации. Также возможно (c) выбор языка реализации. Как общая приблизительная предпосылка, для среднего программиста, изучающего методы, я могу сказать пару недель посвященной работе. –
Это не так сложно. вот LISP interpreter in ruby, и источник настолько мал, что вы должны его скопировать/вставить. но вы собираетесь изучить LISP сейчас? хе-хе.
Я еще не решил на языке истолковать, но я ищу то, что это не игрушечный язык, но было бы относительно легко написать интерпретатор. Заранее спасибо.
Попробуйте какой-нибудь диалект Лиспа, например, Схему или Clojure. (Теперь есть идея: Clojure-in-Ruby, которая интегрируется с Ruby, а Clojure - с Java.)
С Lisp нет необходимости беспокоиться о синтаксисе, поскольку синтаксис Lisp намного ближе к абстрактное синтаксическое дерево.
Clorure звучит как язык Scooby Doo копается. – FMc
Это было сделано http://www.springerlink.com/content/q3n77q7172831288/ и http://onestepback.org/index.cgi/Tech/Ruby/LispInRuby.red –
This SICP chapter показывает, как написать интерпретатор Lisp в Lisp (метациркулярный оценщик). По-моему, это лучшее место для начала. Затем вы можете перейти к Lisp in Small Pieces, чтобы узнать, как писать сложные интерпретаторы и компиляторы для Lisp. Преимущество реализации языка, такого как Lisp (в самом Lisp!), Заключается в том, что вы бесплатно получаете лексический анализатор, парсер, AST, представление данных/программ и REPL. Вы можете сосредоточиться на задаче заставить ваш отличный язык работать!
Существует дерево топ проект которым может быть полезно для вас http://treetop.rubyforge.org/
Вы можете оформить Рубиновый проект Спецификация http://ruby-std.netlab.jp/
У меня была подобная идея пару дней назад. LISP на сегодняшний день проще всего реализовать, поскольку синтаксис настолько прост, и структуры данных, которыми манипулирует язык, являются теми же структурами, в которых написан код. Следовательно, вам нужна только минимальная реализация и может определять остальное в терминах сам.
Однако, если вы пытаетесь узнать о разборе, вы можете захотеть сделать более сложный язык с абстрактными синтаксическими деревьями и т. Д.
Если вы хотите проверить мой (буквально два дня) реализацию Java lisp, проверьте mylisp.googlecode.com. Я все еще работаю над этим, но невероятно, как быстро прошло время, чтобы заставить работать существующие вещи.
Я могу рекомендовать эту книгу. В нем рассматриваются шаблоны для написания парсеров и переводчиков и многое другое:
Если вы просто делаете это для удовольствия, сделать свой собственный, простой язык и просто попробовать. Моя рекомендация будет похожа на действительно простой классический BASIC (без визуального базового или объектно-ориентированного). С номерами строк, GOTO, INPUT и PRINT, и все. Вы можете делать основы, и вы лучше понимаете, как все работает.
Знания, в которых вы нуждаетесь?
- Tokenizing (точение, что огромный кусок символов в нечто более эффективно читаемых, эффективно расщепляя его на «слова»)
- Синтаксических (переходящие на лексемы и построение структуры данных из него)
- переводческих (зацикливание структуры данных и выполнение каждой команды)
И для этого последнего вам также понадобится способ сохранить переменные. Обычно вы просто реализуете «стек», один огромный блок данных, где вы можете отметить область в конце.
Это не реализовано в Лиспе, но я нашел Write Yourself A Scheme in 48 Hours быть очень полезный документ, в то время как я начинал с Haskell (хотя я не получил какой-либо отделки его после 48 часов; YMMV). Это также дает вам много понимания устных переводчиков в целом.
- 1. Два переводчика без переводчика
- 2. Полировка моего переводчика-переводчика Pig (Code) (Java)
- 3. Написание переводчика в OCaml
- 4. Рисунок переводчика
- 5. питона, как запустить питон без указания переводчика
- 6. рубин имя переводчика
- 7. Построение простого переводчика
- 8. Поведение переводчика на Python?
- 9. PHP - цепочки вариантов переводчика
- 10. ошибка переводчика Скала
- 11. Классический язык переводчика
- 12. Формальное определение переводчика
- 13. Написание переводчика SEH
- 14. Проблемы с выходом переводчика
- 15. Кодирование переводчика языка
- 16. Изменить текст переводчика Google
- 17. Elixir ошибка переводчика
- 18. Создание простого переводчика языка
- 19. Перевод без переводчика google
- 20. PyCharm не обнаруживает переводчика
- 21. Написание кода переводчика с Python на C?
- 22. Использование C# для вызова переводчика google
- 23. Написание переводчика с использованием шаблонов Antlr/Stringtemplates
- 24. Настройка переводчика Octave на 'tex'
- 25. Laravel 4,2 переводчика пользовательского ключа
- 26. Завершение табуляции для переводчика V8?
- 27. Вертикальная панель для переводчика LaTeX
- 28. Редактор для переводчика в Smalltalk
- 29. API для словаря и переводчика
- 30. Использование Streamreader для перевода переводчика
huh? Если вы не определились с языком, как вы узнаете? Некоторые могут быть очень просто интерпретировать, даже используя библиотеки ... –
Я думаю, что гораздо проще написать интерпретатор Ruby в Lisp, чем наоборот. – Svante
Сванте, я не уверен в этом. –