Brainfuck Compiler on PHP

來源:互聯網
上載者:User
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教程有興趣的朋友有所協助。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.