108 lines
2.3 KiB
Plaintext
108 lines
2.3 KiB
Plaintext
class Brainfuck {
|
|
private string $code;
|
|
private int $code_pointer;
|
|
private int[] $cells;
|
|
private int $pointer;
|
|
private string $input;
|
|
private int $input_pointer;
|
|
private int[] $buffer;
|
|
private string $output;
|
|
|
|
public void __construct(string $code, string $input = NULL) {
|
|
$this->code = $code;
|
|
$this->input = $input;
|
|
}
|
|
|
|
public void run() {
|
|
while ($this->code_pointer < strlen($this->code)) {
|
|
$this->interpret($this->code[$this->code_pointer]);
|
|
$this->code_pointer++;
|
|
}
|
|
print($this->output);
|
|
}
|
|
|
|
private void interpret(string $command) {
|
|
if(!$this->cells[$this->pointer]) {
|
|
$this->cells[$this->pointer] = 0;
|
|
}
|
|
switch ($command) {
|
|
case '>' :
|
|
$this->pointer++;
|
|
break;
|
|
case '<' :
|
|
$this->pointer--;
|
|
break;
|
|
case '+' :
|
|
$this->cells[$this->pointer]++;
|
|
if($this->cells[$this->pointer] > 255) {
|
|
$this->cells[$this->pointer] = 0;
|
|
}
|
|
break;
|
|
case '-' :
|
|
$this->cells[$this->pointer]--;
|
|
if($this->cells[$this->pointer] < 0) {
|
|
$this->cells[$this->pointer] = 255;
|
|
}
|
|
break;
|
|
case '.' :
|
|
$this->output += chr($this->cells[$this->pointer]);
|
|
break;
|
|
case ',' :
|
|
$this->cells[$this->pointer] = $this->input[$this->input_pointer] ? ord($this->input[$this->input_pointer]) : 0;
|
|
$this->input_pointer++;
|
|
break;
|
|
case '[' :
|
|
if($this->cells[$this->pointer] == 0) {
|
|
int $delta = 1;
|
|
while($delta && $this->code_pointer++ < strlen($this->code)) {
|
|
switch ($this->code[$this->code_pointer]) {
|
|
case '[' :
|
|
$delta++;
|
|
break;
|
|
case ']' :
|
|
$delta--;
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
$this->buffer[] = $this->code_pointer;
|
|
}
|
|
break;
|
|
case ']' :
|
|
$this->code_pointer = array_pop($this->buffer) - 1;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
class Program {
|
|
|
|
void main() {
|
|
object $bf;
|
|
string $code;
|
|
resource $dir;
|
|
string $file;
|
|
string[] $files;
|
|
string $input;
|
|
$dir = opendir('tests/data/brainfuck');
|
|
while($file = readdir($dir)) {
|
|
if($file == '.' || $file == '..') {
|
|
continue;
|
|
}
|
|
$files[] = $file;
|
|
}
|
|
sort($files);
|
|
unset($file);
|
|
for(int $n = 0; $n < sizeof($files); $n++) {
|
|
print('Executing "' + $files[$n] + '"' + "\n");
|
|
$code = file_get_contents('tests/data/brainfuck/' + $files[$n]);
|
|
$bf = new Brainfuck($code, $input);
|
|
$bf->run();
|
|
print("\n");
|
|
}
|
|
closedir($dir);
|
|
}
|
|
|
|
}
|