Brainfuck Compiler on PHP

php中文网
发布: 2016-07-30 13:31:19
原创
1932人浏览过

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 ='>';
	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_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;
		}
	}
}

?>
登录后复制

版权声明:本文为博主原创文章,未经博主允许不得转载。

PHP多文件上传插件
PHP多文件上传插件

PHP多文件上传插件

PHP多文件上传插件 149
查看详情 PHP多文件上传插件

以上就介绍了Brainfuck Compiler on PHP,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号