PHP Brainf*ck class

Компилятор с языка Brainfuck в язык PHP с оптимизацией кода.

PHP Brainf*ck class

Текущая версия

Текущая и единственная, на данный момент версия — 0.1.0 от 11 сентября 2005. Её автор — я, Евгений Степанищев. Мои координаты есть на сайте.

Что такое brainf*ck?

Язык Brainfuck был придуман Urban Mueller, имеет очень простой синтаксис, состоящий всего из 8 несложных конструкций:
  • + — добавить единицу к содержимому ячейки под указателем.
  • — — вычесть единицу
  • > — сдвинуть указать вперед
  • . — Вывести символ, соответствующий коду в ячейке, на печать
  • , — Дождаться ввода символа и записать его код в ячейку под указателем
  • [ — Если в ячейке под указателем — 0, то пропустить все команды до парной закрывающей скобки включительно
  • ] — Перейти к парной открывающей скобке
В распоряжении програмиста имеется некоторое число ячеек, заполненых нулями. С первого взгляда кажется, что написать на таком языке что-то серьезнее «взять символ с ввода и вывести его на печать» нельзя, но уверяю это не так. Есть реализации на языке Brainf*ck вычисления числа π, вывод «песни о бутылки с пивом» и даже интерпретатор Brainf*ck, написанный на самом Brainf*ck. Литературы по языку предостаточно, есть учебники по программированию, клубы поклонников, каталоги программ.

Возможности библиотеки

Библиотека переводит программу на языке Brainf*ck в листинг на языке PHP, выполняя некоторую оптимизацию кода. Например, код [->+>+++>[-]+
<?
$in = array(0, $id = 0);
$d = array_fill(-65535, 65535, $di = 0);

$d[$di+1]+= $d[$di];
$d[$di+2]+= $d[$di]*2;
$d[$di] = 0;

$d[$di+1]+= $d[$di];
if ($d[$di]) $d[$di+2] = 0;
$d[$di] = 0;

$d[$di+1]+= $d[$di];
$d[$di] = 0;
?>

Использование

Внутри библиотеки всего один класс Processing_BF с тремя методами:
  • toPHP($str) — компилирует BF программу в PHP
  • addHeader($str, $input = '') — добавляет к скомпилированной программе стандартный заголовок. Принимает один или два параметра. Первый — код программы, второй (опциональный) — данные для обработки программой на BF.
  • compile($str, $input = '') — последовательный вызов методов toPHP и addHeader, т.е. на выходе — скомпилированная программа с заголовком.

Пример использования

<?php
    $program = <<<ROT13
,
[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
[>++++++++++++++<-
[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
[>>+++++[<----->-]<<-
[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
[>++++++++++++++<-
[>+<-[>+<-[>+<-[>+<-[>+<-
[>++++++++++++++<-
[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
[>>+++++[<----->-]<<-
[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
[>++++++++++++++<-
[>+<-]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]>.[-]<,]
ROT13;


    include_once 'Processing/Processing_BF.php';

    $bf =& new Processing_BF();

    $res = $bf->compile($program, 'test');

    eval($res);
?>

Скачать

Скачать библиотеку в формате PEAR: Processing_BF-0.1.0.tgz ( байт)
Посмотреть исходный код Processing_BF: Processing_BF.phps
С уважением,
Евгений Степанищев
http://bolknote.ru/
Состав архива