среда, 29 июня 2011 г.

Интерпретатор Brainfuck на BAT

Простота языка Brainfuck порождает множество реализаций его исполнения http://rosettacode.org/wiki/Execute_Brain****.  Есть вариант на Bash и даже на самом Brainfuck. Мне показалось, что несправедливо обойти еще один командный процессор. А именно командные файлы семейства WindowsNT, они же батники. При написании данного интерпретатора была поставлена цель реализовать всё только на встроенном «языке» консоли.


Спецификация диалекта Brainfuck

Командный процессор Windows имеет множество ограничений. Вот только некоторые из них:
  1. Из-за того, что символы "<" и ">" используются для перенаправления ввода/вывода использовать их не представляется возможным. Поэтому замененим их на схожие по написанию "(" и ")".
  2. Ограничены возможности по выводу текста и вводу данных с клавиатуры.
В конечном итоге получаем спецификацию на язык:
  1. Память представляет кольцевой буфер.
  2. Вывод ограничен первыми 127 символами кодовой страницы с исключением непечатных символов и некоторых символов, которые вызывали ошибку при работе батника. Последние были заменены на символ ".". Пробел заменен на знак "_".
  3. «Ключевые слова» языка:
    • «)» – перейти на следующую ячейку памяти
    • «(» – перейти на предыдущую ячейку памяти
    • «+» – увеличить значение ячейки на единицу
    • «-» – уменьшить значение ячейки на единицу
    • «,» – прочесть значение в ячейку со стандартного устройства ввода. В данный момент не реализовано
    • «.» – напечатать значение ячейки на стандартном устройстве вывода
    • «[» – начать цикл. если значение текущей ячейки не равно 0 и перейти к следующей команде. Иначе перейти к ] учитывая вложенность
    • «]» – конец цикла. Продолжить цикл, если значение текущей ячейки не равно 0


Полный текст интерпретатора находится тут: http://pastebin.com/MDbVJXsE


Код тестировался на Windows 2000, Windows XP, Windows Vista, Windows 7.

Ссылки

Комментариев нет: