@ 2014-02-16T09:35:25Z <?PHP
class InvalidStateException extends RuntimeException { }
class Compiler {
private $ptr;
private $arr;
private $code;
private $commands = array('>', '<', '+', '-', '.', ',', '[', ']');
private $call_stack = array();
private $cellsize = 8;
public function parseString($code, $throwException = true) {
$this->code = $code;
for ($i=0;$i<strlen($this->code);$i++) {
$c = substr($this->code, $i, 1);
if (!in_array($c, $this->commands)) {
continue;
}
}
}
public function execute($code) {
$this->arr = array(0 => 0);
$this->ptr = 0;
$this->code = $code;
for ($this->i=0;$this->i<strlen($this->code);$this->i++) {
$c = $this->c = substr($this->code, $this->i, 1);
if (!in_array($c, $this->commands)) {
continue;
}
elseif ($c == '>') {
$this->increment_pointer();
}
elseif ($c == '<') {
$this->decrement_pointer();
}
elseif ($c == '+') {
$this->increment_val();
}
elseif ($c == '-') {
$this->decrement_val();
}
elseif ($c == '.') {
$this->output_val();
}
elseif ($c == ',') {
$this->store_val($this->input_val());
}
elseif ($c == '[') {
$this->loop($this->i);
}
}
}
private function stack($func=null) {
if (is_null($func)) {
if (count($this->call_stack) == 0) {
throw new InvalidStateException("Trying to pop empty call stack.");
return false;
}
array_pop($this->call_stack);
return true;
}
else {
$info = array('command' => $this->c, 'pos' => $this->i, 'internal_function' => $func);
array_push($this->call_stack, $info);
return true;
}
}
public function minimum_cellsize() {
return (-1*(pow(2, $this->cellsize-1)));
}
public function maximum_cellsize() {
return pow(2, $this->cellsize-1)-1;
}
private function increment_pointer() {
$this->stack(__FUNCTION__);
$this->ptr++;
if (!isset($this->arr[$this->ptr])) $this->arr[$this->ptr] = 0;
$this->stack();
return true;
}
private function decrement_pointer() {
$this->stack(__FUNCTION__);
$this->ptr--;
if ($this->ptr < 0) {
throw new InvalidStateException("The data pointer is less than 0.");
return false;
}
$this->stack();
return true;
}
private function increment_val() {
$x = $this->arr[$this->ptr]++;
if ($x < $this->minimum_cellsize()) {
$this->arr[$this->ptr] = $this->maximum_cellsize();
}
elseif ($x > $this->maximum_cellsize()) {
$this->arr[$this->ptr] = $this->minimum_cellsize();
}
return true;
}
private function output_val() {
$c = $this->arr[$this->ptr];
echo chr($c);
}
private function store_val($chr) {
$x = ord($chr);
$this->arr[$this->ptr] = $x;
}
private function input_val() {
return fgets(STDIN);
}
public function getCallStack() {
return $this->call_stack;
}
}
$c = new Compiler();
$bf = '+++++++++ +++++++++ +++++++++ + > +++++++++ +++++++++ +++++++++ ++ < . < .';
try {
$c->execute($bf);
}
catch (Exception $e) {
var_dump($c->getCallStack());
}
?>
Enable javascript to submit You have javascript disabled. You will not be able to edit any code.
Output for 8.2.0 - 8.2.18 , 8.3.0 - 8.3.6 Deprecated: Creation of dynamic property Compiler::$i is deprecated in /in/Oo0pR on line 28
Deprecated: Creation of dynamic property Compiler::$c is deprecated in /in/Oo0pR on line 29
array(1) {
[0]=>
array(3) {
["command"]=>
string(1) "<"
["pos"]=>
int(71)
["internal_function"]=>
string(17) "decrement_pointer"
}
}
Output for 5.1.0 - 5.1.6 , 5.2.0 - 5.2.17 , 5.3.0 - 5.3.29 , 5.4.0 - 5.4.45 , 5.5.0 - 5.5.38 , 5.6.0 - 5.6.40 , 7.0.0 - 7.0.33 , 7.1.0 - 7.1.33 , 7.2.0 - 7.2.33 , 7.3.0 - 7.3.33 , 7.4.0 - 7.4.33 , 8.0.0 - 8.0.30 , 8.1.0 - 8.1.28 array(1) {
[0]=>
array(3) {
["command"]=>
string(1) "<"
["pos"]=>
int(71)
["internal_function"]=>
string(17) "decrement_pointer"
}
}
Output for 5.0.0 - 5.0.5 Fatal error: Class 'RuntimeException' not found in /in/Oo0pR on line 3
Process exited with code 255 . Output for 4.4.2 - 4.4.9 Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /in/Oo0pR on line 6
Process exited with code 255 . Output for 4.3.0 - 4.3.1 , 4.3.5 - 4.3.11 , 4.4.0 - 4.4.1 Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /in/Oo0pR on line 6
Process exited with code 255 . Output for 4.3.2 - 4.3.4 Parse error: parse error, expecting `T_OLD_FUNCTION' or `T_FUNCTION' or `T_VAR' or `'}'' in /in/Oo0pR on line 6
Process exited with code 255 . preferences:dark mode live preview
297.78 ms | 401 KiB | 460 Q