Увидел подобное на другом языке программирования и решил реализовать на D интерпретатор BrainFuck. Смотрим что получилось…
Сразу код всего приложения:
class brainfuckInterpreter
{
// лента ячеек BrainFuck'а
private char[] _memory;
// создаем экземпляр интерпретатора с количеством ячеек size
this(uint size = 30_000)
{
_memory.length = size;
_memory[] = 0;
}
// интерпретирование программы
void interpret(string program)
{
// указатель на текущую ячейку памяти
uint currentCell = 0;
// счетчик скобок
uint brackets = 0;
// интерпретация программы
for (uint i = 0; i < program.length; i++)
{
// на ячейку вперед
if (program[i] == '>') currentCell++;
// на ячейку назад
if (program[i] == '<') currentCell--;
// увеличить значение в текущей ячейке
if (program[i] == '+') _memory[currentCell]++;
// уменьшить значение в текущей ячейке
if (program[i] == '-') _memory[currentCell]--;
// вывод значения из текущей ячейки
if (program[i] == '.') write(_memory[currentCell]);
// ввод значения в текущую ячейку
if (program[i] == ',')
{
char tmp;
readf("%c", &tmp);
_memory[currentCell] = tmp;
}
// если значение текущей ячейки ноль, перейти вперёд по тексту программы на ячейку,
// следующую за соответствующей ] (с учётом вложенности)
if (program[i] == '[')
{
if (!_memory[currentCell])
{
++brackets;
while(brackets)
{
++i;
if (program[i] == '[') ++brackets;
if (program[i] == ']') --brackets;
}
}
else continue;
}
// если значение текущей ячейки не нуль,
// перейти назад по тексту программы на символ [ (с учётом вложенности)
else if (program[i] == ']')
{
if (!_memory[currentCell]) continue;
else
{
if (program[i] == ']') brackets++;
while (brackets)
{
--i;
if (program[i] == '[') --brackets;
if (program[i] == ']') ++brackets;
}
--i;
}
}
}
}
}Возьмем простейшую программу на BrainFuck, выводящую надпись “Hello World”:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++ .>+.+++++++..+++.>++.<<+++++++++++++++.>.+++. ------.--------.>+.>.
И запустим интерпретатор:
import std.stdio;
void main()
{
// интерпретатор с памятью на 5 ячеек
brainfuckInterpreter bvm = new brainfuckInterpreter(5);
// интерпретация программы 'Hello !world !'
bvm.interpret("++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.");
}Вот и все. Попробуйте сами, это весьма прикольно!