Как написать переводчика?

Я решил написать небольшой интерпретатор в качестве своего следующего проекта в Ruby. Какие знания и навыки мне понадобится, чтобы быть успешными?
Я еще не решил на языке интерпретировать, но я ищу что-то, что не является игрушечным языком, но было бы относительно легко написать переводчика. Заранее спасибо.

Ответы

Ответ 1

Вам нужно будет узнать хотя бы:

  • лексический анализ (группировка символов в токены)
  • синтаксический анализ (объединение маркеров вместе в структуру)
  • абстрактные деревья синтаксиса (представляющие структуру программы в структуре данных)
  • (если ваш язык будет иметь переменные)
  • цикл оценки, который запускает вашу программу

Отличное введение в некоторые из этих тем можно найти во вводном тексте Структура и интерпретация компьютерных программ. Язык, используемый в этой книге, - это схема, которая является надежным, хорошо определенным языком, который идеально подходит для вашей первой реализации интерпретатора. Очень рекомендуется.

Ответ 2

Я еще не определил язык для интерпретации, но я ищу то, что не является игрушечным языком, но было бы относительно легко написать интерпретатор для. Спасибо заранее.

Попробуйте какой-нибудь диалект Lisp, например, Scheme или Clojure. (Теперь есть идея: Clojure -in-Ruby, которая интегрируется с Ruby, а также Clojure делает с Java.)

С Lisp нет необходимости беспокоиться об идиосинкразиях синтаксиса, поскольку синтаксис Lisp намного ближе к абстрактному синтаксическому дереву.

Ответ 3

В этой главе SICP показано, как написать интерпретатор Lisp в Lisp (метакрикулярный оценщик). По-моему, это лучшее место для начала. Затем вы можете перейти к Lisp в Small Pieces, чтобы узнать, как писать передовые интерпретаторы и компиляторы для Lisp. Преимущество реализации языка типа Lisp (в самом Lisp!) Заключается в том, что вы бесплатно получаете лексический анализатор, парсер, AST, представление данных/программ и REPL. Вы можете сосредоточиться на задаче заставить ваш отличный язык работать!

Ответ 4

Существует проект верхнего уровня дерева, который может быть вам полезен http://treetop.rubyforge.org/

Ответ 6

У меня была аналогичная идея пару дней назад. LISP на сегодняшний день проще всего реализовать, потому что синтаксис настолько прост, и структуры данных, которыми манипулирует язык, являются теми же структурами, в которых написан код. Следовательно, вам нужна только минимальная реализация и может определять остальное в само по себе.

Однако, если вы пытаетесь узнать о разборе, вы можете захотеть сделать более сложный язык с абстрактными синтаксическими деревьями и т.д.

Если вы хотите проверить мою (буквально две дня) реализацию Java из lisp, зайдите mylisp.googlecode.com. Я все еще работаю над этим, но невероятно, как быстро прошло время, чтобы заставить существующие вещи работать.

Ответ 7

Это не так сложно. здесь LISP интерпретатор в ruby ​​, и источник настолько мал, что вы должны его скопировать/вставить. но вы собираетесь узнать LISP сейчас? хе-хе.

Ответ 8

Если вы просто делаете это ради удовольствия, составите свой собственный, простой язык и просто попробуйте. Моя рекомендация будет похожа на действительно простой классический BASIC (без визуального базового или объектно-ориентированного). С номерами строк, GOTO, INPUT и PRINT и что это. Вы можете сделать основы, и вы лучше понимаете, как все работает.

Знания, которые вам понадобятся?

  • Tokenizing (превращение этого огромного куска символов в нечто более эффективно читаемое, эффективное разделение его на слова)
  • Анализ (переключение маркеров и построение структуры данных)
  • Интерпретация (циклизация структуры данных и выполнение каждой команды)

И для этого последнего вам также понадобится способ сохранить переменные. Обычно вы просто реализуете "стек", один огромный блок данных, в котором вы можете отметить область в конце.

Ответ 9

Он не реализован в Lisp, но я нашел Write Yourself Scheme за 48 часов, чтобы быть очень полезным документом, когда я начинал с Haskell (хотя я не дошел до конца после 48 часов, YMMV). Это также дает вам много понимания устных переводчиков в целом.