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
|