Интерпретатор BrainFuck

Увидел подобное на другом языке программирования и решил реализовать на 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("++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.");
}

Вот и все. Попробуйте сами, это весьма прикольно!

Добавить комментарий