Для начала о brainfuck. Это эзотерический тьюринг-полный язык программирования, в котором имеется 8 инструкций :
>Переход к следующей ячейке памяти
<Переход к предыдущей ячейке памяти
+ увеличение на 1 значения в текущей ячейке
-Уменьшение на 1 значения в текущей ячейки
. - вывод символа с кодом, соответсвующим знанчению в ячейке
,[i] - ввод символа и помещение его значения в ячейку
[i] - если в текущей ячейке 0, то перейти по тексту проги вперёд к соответсвующей ] (с учётом вложенности)
[i]] Переход по тексту программы назад к [ если в ячейке не 0
Осилили? Тогда дальше
В принципе, для работы интерпретатора нам понадобятся :
Массив - те самые ячейки памяти
Анализ вложенности скобок
Т.е. идея такая - посимвольно обходим текст проги, если нам не хватает памяти - наращиваем массив, А далее в завсимости от символа :
>,< - меняем индекс элемента в массиве
+,- - инкремент/декремент элемента с текущим индексом
,,. - ввод/вывод
[,] - переходы
Рассмотрим подробнее переходы. Очевидно, нам понадобится анализ вложенности скобок. Для этого обходим код справа налево и при нахождении открывающей скобки ищём ближающую расположенную правее закрывающую. И будем хранить в структуре такого вида : [ [N1,N2], [N3,N4] ... ] где N1,N3 - номера символов открывающих скобок, N2,N4 - закрывающих.
Вот код
Кстати, за счёт того, что разные левые сиволы не анализируются - можно оформлять код и комментировать, чего в нарытых интерпретаторах я не нашёл.
Вот так же код простой проги на brainfuck, демонстрирующей работу операторов :
Code
Ввод , Так как символ 0 имеет код 48 то чтобы сравнить с 0 проведём 48 декрементов ------------------------------------------------ Если 0 идём в конец проги иначе же : [ Переходим в слудующую ячейку > Код символа G +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Вывод . В пустую ячейку > Так как в пустой ячейке 0 то произойдёт выход ]