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(-6553565535$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/