首頁 >後端開發 >php教程 >PHP 上的 Brainfuck 編譯器

PHP 上的 Brainfuck 編譯器

WBOY
WBOY原創
2016-07-30 13:31:191480瀏覽
A PHP implement for Brainfuck Compiler

<?php
/**
Brainfuck Compiler on PHP
Copyright 2015 Everstray Jun Sinri Edogawa
**/

$bc=new BrainfuckCompiler();
$bc->compile(
'++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.'
);


/**
字符	含义
>	指针加一
<	指针减一
+	指针指向的字节的值加一
-	指针指向的字节的值减一
.	输出指针指向的单元内容(ASCII码)
,	输入内容到指针指向的单元(ASCII码)
[	如果指针指向的单元值为零,向后跳转到对应的]指令的次一指令处
]	如果指针指向的单元值不为零,向前跳转到对应的[指令的次一指令处

*/
class BrainfuckCompiler
{
	public static $PTR_RIGHT =&#39;>';
	public static $PTR_LEFT ='<&#39;;
	public static $VAL_PLUS =&#39;+&#39;;
	public static $VAL_MINUS = &#39;-&#39;;
	public static $PTR_OUTPUT = &#39;.&#39;;
	public static $PTR_INPUT = &#39;,&#39;;
	public static $WHILE_BEGIN = &#39;[&#39;;
	public static $WHILE_END = &#39;]&#39;;

	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_index<count($this->codes)){
			$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;$i<count($this->codes);$i++){
				if($this->codes[$i]===BrainfuckCompiler::$WHILE_BEGIN){
					$pair+=1;
				}elseif($this->codes[$i]===BrainfuckCompiler::$WHILE_END){
					$pair-=1;
				}
				if($pair==0){
					//here it is
					break;
				}
			}
			$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 is
					break;
				}
			}
			$this->code_index=$i+1;
		}else{
			$this->code_index+=1;
		}
	}
}

?>

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。

以上就介紹了Brainfuck Compiler on PHP,包含了方面的內容,希望對PHP教學有興趣的朋友有幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn