资讯专栏INFORMATION COLUMN

用PHP写一个最简单的解释器Part1

molyzzx / 2733人阅读

摘要:偶然间在朋友圈发现有人在看一本两周自制脚本语言,觉得写个脚本语言挺不错的,方便自己对语言本身进一步了解。,不过同样,该教程采用的也不是。在这里写出代码方便自己查找,同时也希望一些对解释器感兴趣的朋友一同学习。

偶然间在朋友圈发现有人在看一本《两周自制脚本语言》,觉得写个脚本语言挺不错的,方便自己对语言本身进一步了解。于是乎,买了下来看了看,写的挺通俗易懂,但是不便的是,采用的语言是Java,PHP才是最好的语言么!为什么要采用Java。

这几日,我也在网上搜索了一些资料,发现这个不错。https://github.com/rspivak/ls...,不过同样,该教程采用的也不是PHP。正如作者所言,选什么语言由你,解释器并不依赖语言特性。

于是乎,我用PHP重写了part1的部分,并在以后几日,将会采用PHP重写所有部分。

在这里写出代码方便自己查找,同时也希望一些对解释器感兴趣的朋友一同学习。

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;
    public function __construct($text){
        $this->text=trim($text);
    }
    
    public function error()
    {
        throw new Exception("Lexer eroor");
    }
    
    public function get_next_token()
    {
        $text=$this->text;
        if ($this->pos > strlen($text)-1){
            return new Token("EOF", null);
        }
        
        $this->current_char = $text[$this->pos];
        if (is_numeric($this->current_char)){
            $token=new Token("INTEGER",intval($this->current_char));
            $this->pos++;
            return $token;
        }
        
        if ($this->current_char=="+"){
            $token = new Token("PLUS", $this->current_char);
            $this->pos ++;
            return $token;
        }
        $this->error();
    }
    
    public function eat($token_type)
    {
        if ($this->current_token->type==$token_type){
            $this->current_token=$this->get_next_token();
        }else{
            $this->error();
        }
    }
    
    
    public function expr()
    {
        $this->current_token=$this->get_next_token();
        $left=$this->current_token;
        $this->eat("INTEGER");
        $op=$this->current_token;
        $this->eat("PLUS");
        $right=$this->current_token;
        $this->eat("INTEGER");
        $result=$left->value+$right->value;
        return $result;
    }
}

do{
    fwrite(STDOUT,"xav>");;
    $input=fgets(STDIN);
    $Interpreter=new Interpreter($input);
    echo $Interpreter->expr();
    unset($Interpreter);
    
}while(true);


目前仅支持个位整数相加

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29004.html

相关文章

  • Part1JS一个Blog(node + vue + mongoDB)

    摘要:总的来说就是开发博客系统,探索前端走向全栈之路。我会记录下来整个过程在我的专栏,有兴趣的可以关注一下,一起学习,欢迎讨论。话不多说,先进行前后端项目的初始化。安装完成后,输入命令切换到项目文件夹后输入命令访问一下项目初始化完成。 学习JS也有一段时间了,准备试着写一个博客项目,前后端分离开发,后端用node只提供数据接口,前端用vue-cli脚手架搭建,路由也由前端控制,数据异步交互用...

    jhhfft 评论0 收藏0
  • Part1JS一个Blog(node + vue + mongoDB)

    摘要:总的来说就是开发博客系统,探索前端走向全栈之路。我会记录下来整个过程在我的专栏,有兴趣的可以关注一下,一起学习,欢迎讨论。话不多说,先进行前后端项目的初始化。安装完成后,输入命令切换到项目文件夹后输入命令访问一下项目初始化完成。 学习JS也有一段时间了,准备试着写一个博客项目,前后端分离开发,后端用node只提供数据接口,前端用vue-cli脚手架搭建,路由也由前端控制,数据异步交互用...

    ctriptech 评论0 收藏0
  • 测试你前端代码 - part1(介绍篇)

    摘要:测试光谱光谱的一端单元测试顾名思义,代码以单元为单位进行测试。这个系列文章整体如下测试你的前端代码单元测试测试你的前端代码端到端测试测试你的前端代码集成测试。 showImg(https://segmentfault.com/img/remote/1460000008812278?w=998&h=354); 本文作者:Gil Tayar 编译:胡子大哈 翻译原文:http://hu...

    helloworldcoding 评论0 收藏0
  • 测试你前端代码 - part1(介绍篇)

    摘要:测试光谱光谱的一端单元测试顾名思义,代码以单元为单位进行测试。这个系列文章整体如下测试你的前端代码单元测试测试你的前端代码端到端测试测试你的前端代码集成测试。 showImg(https://segmentfault.com/img/remote/1460000008812278?w=998&h=354); 本文作者:Gil Tayar 编译:胡子大哈 翻译原文:http://hu...

    jimhs 评论0 收藏0
  • 前端跳槽面试算法——动态规划

    摘要:我记得大三参加腾讯的校招面试时只准备了几种常见的排序算法就足以应对了,然而今年包括今日头条在内的多家大厂的前端笔试题目中都出现了贪心算法动态规划分治算法等进阶性的算法题目。本篇博客参考今日头条银国徽老师的《js版数据结构与算法》Part1改编自《漫画算法》原作者:程序员小灰前言众所周知,与后台开发人员相比,算法是我们前端开发人员的一个弱项。而近两年随着互联网行业竞争愈发激烈,市场上对前端岗位...

    mushang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<