<?php
/****
****
*** @ Brainf_ck interpreter class
*** @ Developed by Takis Maletsas
****
****/
class Brainfuck
{
private $source = [], $charset = [">", "<", "+", "-", ".", ",", "[", "]"], $cells, $pointer = 0;
public function __construct($source)
{
foreach (str_split($source) as $ch)
if (in_array($ch, $this->charset))
$this->source[] = $ch;
$this->cells = array_fill(0, 30000, 0);
$this->parse($this->source);
}
private function parse($source)
{
for ($i = 0; $i < count($source); $i++)
switch ($source[$i])
{
case '>': $this->incPtr(); break;
case '<': $this->decPtr(); break;
case '+': $this->incVal(); break;
case '-': $this->decVal(); break;
case ',': $this->inpVal(); break;
case '.': $this->outVal(); break;
case '[':
$pointer = $this->pointer;
$skip = 0;
$char = @$source[++$i];
while ($char)
{
if ($char == '[')
$skip++;
if ($char == ']')
{
if (!$skip)
break;
else
$skip--;
}
$loop[] = $char;
$char = @$source[++$i];
}
while ($this->cells[$pointer])
$this->parse($loop);
break;
}
}
private function incVal()
{
$this->cells[$this->pointer]++;
$this->cells[$this->pointer] %= 255;
}
private function decVal()
{
if (--$this->cells[$this->pointer] < 0)
$this->cells[$this->pointer] = 255;
}
private function incPtr()
{
if (++$this->pointer > 29999)
exit("Brainfuck: Cell overflow.");
}
private function decPtr()
{
if (--$this->pointer < 0)
exit("Brainfuck: Cell underflow.");
}
private function inpVal()
{
echo "Input: ";
$this->cells[$this->pointer] = ord(fread(STDIN, 1));
}
private function outVal()
{
echo chr($this->cells[$this->pointer]);
}
}
?>
|