A PHP implement for Brainfuck Compiler
Copyright 2015 Everstray Jun Sinri Edogawa**/$bc=new BrainfuckCompiler();$bc->compile('++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.');/**字元含義>指標加一<指標減一+指標指向的位元組的值加一-指標指向的位元組的值減一.輸出指標指向的單元內容(ASCII碼),輸入內容到指標指向的單元(ASCII碼)[如果指標指向的單元值為零,向後跳轉到對應的]指令的次一指令處]如果指標指向的單元值不為零,向前跳轉到對應的[指令的次一指令處*/class BrainfuckCompiler{public static $PTR_RIGHT ='>';public static $PTR_LEFT ='<';public static $VAL_PLUS ='+';public static $VAL_MINUS = '-';public static $PTR_OUTPUT = '.';public static $PTR_INPUT = ',';public static $WHILE_BEGIN = '[';public static $WHILE_END = ']';public static $DEBUG_MODE=false;private $ptr=0;private $memory=array(-1=>0,0=>0,1=>0);private $codes=array();private $code_index=0;public function compile($program_code){$this->codes=str_split($program_code);$this->code_index=0;while($this->code_indexcodes)){$this->process_code();}}private function process_code(){if(BrainfuckCompiler::$DEBUG_MODE){echo "[DEBUG] process_code at ".$this->code_index;}$code=$this->codes[$this->code_index];if(BrainfuckCompiler::$DEBUG_MODE){echo " as ".$code.PHP_EOL;}if($code===BrainfuckCompiler::$PTR_RIGHT){$this->act_ptr_right();$this->code_index+=1;}elseif($code===BrainfuckCompiler::$PTR_LEFT){$this->act_ptr_left();$this->code_index+=1;}elseif($code===BrainfuckCompiler::$VAL_PLUS){$this->act_val_plus();$this->code_index+=1;}elseif($code===BrainfuckCompiler::$VAL_MINUS){$this->act_val_minus();$this->code_index+=1;}elseif($code===BrainfuckCompiler::$PTR_OUTPUT){$this->act_ptr_output();$this->code_index+=1;}elseif($code===BrainfuckCompiler::$PTR_INPUT){$this->act_ptr_input($this->codes[$this->code_index+1]);$this->code_index+=2;}elseif($code===BrainfuckCompiler::$WHILE_BEGIN){$this->act_while_begin();}elseif($code===BrainfuckCompiler::$WHILE_END){$this->act_while_end();}}private function act_ptr_right(){$this->ptr+=1;if(!isset($this->memory[$this->ptr])){$this->memory[$this->ptr]=0;}}private function act_ptr_left(){$this->ptr-=1;if(!isset($this->memory[$this->ptr])){$this->memory[$this->ptr]=0;}}private function act_val_plus(){$this->memory[$this->ptr]=($this->memory[$this->ptr]+1)%256;}private function act_val_minus(){$this->memory[$this->ptr]=($this->memory[$this->ptr]-1)%256;}private function act_ptr_output(){echo chr($this->memory[$this->ptr]);}private function act_ptr_input($value){$this->memory[$this->ptr]=($value%256);}private function act_while_begin(){if($this->memory[$this->ptr]===0){//find the pair WHILE_END$pair=1;$i=0;for($i=$this->code_index+1;$icodes);$i++){if($this->codes[$i]===BrainfuckCompiler::$WHILE_BEGIN){$pair+=1;}elseif($this->codes[$i]===BrainfuckCompiler::$WHILE_END){$pair-=1;}if($pair==0){//here it isbreak;}}$this->code_index=$i;}else{$this->code_index+=1;}}private function act_while_end(){if($this->memory[$this->ptr]!==0){//find the pair WHILE_BEGIN$pair=1;$i=0;for($i=$this->code_index-1;$i>=0;$i--){if($this->codes[$i]===BrainfuckCompiler::$WHILE_END){$pair+=1;}elseif($this->codes[$i]===BrainfuckCompiler::$WHILE_BEGIN){$pair-=1;}if($pair==0){//here it isbreak;}}$this->code_index=$i+1;}else{$this->code_index+=1;}}}?>
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
以上就介紹了Brainfuck Compiler on PHP,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。