博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用PHP写一个最简单的解释器Part3
阅读量:6324 次
发布时间:2019-06-22

本文共 3642 字,大约阅读时间需要 12 分钟。

总想成为一名写作技巧高超的作家,却一不小心成为了码农。

不知道,大家有没有看原文作者的一些看法()。我们为什么要学习新的知识,我们应该如何学习新的知识。看过很多书,却没有记住多少,有时候觉得自己就像鱼一样,真的只有七秒的记忆。

正如原作者所说的,学习知识最好的方法就是去实践。这样才可以将知识掌握。

之前,看过一篇新闻,PHPPHP,不知道有没有人记得这个项目,当时他出现时,我想很多人一样说,这个无聊的项目有什么用户,后来才逐渐发现了自己的无知。虽然PHPHP并未像pypy一样发展起来,却给了很多想学习解释器的同学一个学习和实践的途径。

言归正传,这节这个解释器已经可以完成计算器的很多功能,可以实现多位数连续加减运算。

Talk is cheap ,show me the code.

type=$type; $this->value=$value; } /** 通过该方法来获取类的私有属性 */ public function __get($name) { return $this->{$name}; } /** 用于调试 */ public function __toString() { return 'type:'.$this->type.' value:'.$this->value; }}//解释器class Interpreter{ private $current_char ; private $current_token ; private $text; private $pos=0; /*** $text 需要进行解释的字符串 */ public function __construct($text){ //去除前后可能存在的空格 这些空格是无效的 $this->text=trim($text); //初始化 获取第一个字符 $this->current_char = $this->text[$this->pos]; } public function error() { throw new \Exception('Lexer eroor'); } /* 步进方法,每操作一个字符后前进一位 */ public function advance() { $this->pos++; if ($this->pos>strlen($this->text)-1){ $this->current_char=null; }else{ $this->current_char=$this->text[$this->pos]; } } /* 去除空格 */ public function skip_whitespace() { if ($this->current_char!=null&&$this->current_char==WHITESPACE){ $this->advance(); } } /* 如果要支持多位的整数,则需要将每位数字存储起来 */ public function integers() { $result='';//用于存储数字 while($this->current_char!=null&&is_numeric($this->current_char)){//只要当前字符是数字就一直循环并将数字存储于$result $result.=$this->current_char; $this->advance();//步进方法,每操作一个字符后前进一位 } return intval($result);//将数字字符串转成整数 } //获取当前字符的Token public function get_next_token() { while($this->current_char!=null){ if ($this->current_char==WHITESPACE){ $this->skip_whitespace(); continue; } if (is_numeric($this->current_char)){ return new Token(ISINTEGER,$this->integers()); } if ($this->current_char=="+"){ $this->advance(); return new Token(PLUS,'+'); } if ($this->current_char=="-"){ $this->advance(); return new Token(MINUS,'-'); } return new Token('EOF', null); } } //如果字符类型和判断的类型一致,则继续,否则输入错误 public function eat($token_type) { if ($this->current_token->type==$token_type){ $this->current_token=$this->get_next_token(); }else{ $this->error(); } } public function term() { $token=$this->current_token; $this->eat(ISINTEGER); return $token->value; } //解释方法 public function expr() { $this->current_token=$this->get_next_token();//获取字符串开头部分的数字 $result=$this->term(); while($this->current_token->type==PLUS||$this->current_token->type==MINUS){ $token=$this->current_token; if ($token->type==PLUS){ $this->eat(PLUS); $result=$result+$this->term(); } else if ($token->type==MINUS){ $this->eat(MINUS); $result=$result-$this->term(); } } return $result; }}do{ fwrite(STDOUT,'xav>');; $input=fgets(STDIN); $Interpreter=new Interpreter($input); echo $Interpreter->expr(); unset($Interpreter); }while(true);

clipboard.png

转载地址:http://utmaa.baihongyu.com/

你可能感兴趣的文章
【BZOJ】2697: 特技飞行
查看>>
联想S720/S720i通刷刷机包 Vibe V1.0
查看>>
java异常 之 异常的层次结构
查看>>
数据库设计原则
查看>>
T - stl 的mapⅡ
查看>>
Matlab中的取整-floor,ceil,fix,round
查看>>
Atitit .c#的未来新特性计划草案
查看>>
经验总结17--submitbutton,ajax提交
查看>>
mysql分表技术
查看>>
.Net 垃圾回收和大对象处理 内存碎片整理
查看>>
Linux是如何启动的
查看>>
HiKey连接
查看>>
wget 参数大全
查看>>
使用Loadrunner进行文件的上传和下载
查看>>
Linux C 静态库(.a) 与 动态库(.so) 的详解
查看>>
JS函数
查看>>
sql语句分组/排序/计算总数/连接等sql语句书写
查看>>
【.net 深呼吸】启动一个进程并实时获取状态信息
查看>>
MVC5 的MicrosoftOwinSecurity扩展插件——微信,QQ登录第三方源码
查看>>
分布式系统理论基础 - CAP
查看>>