成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

用PHP寫一個(gè)最簡單的解釋器Part1

molyzzx / 2741人閱讀

摘要:偶然間在朋友圈發(fā)現(xiàn)有人在看一本兩周自制腳本語言,覺得寫個(gè)腳本語言挺不錯(cuò)的,方便自己對(duì)語言本身進(jìn)一步了解。,不過同樣,該教程采用的也不是。在這里寫出代碼方便自己查找,同時(shí)也希望一些對(duì)解釋器感興趣的朋友一同學(xué)習(xí)。

偶然間在朋友圈發(fā)現(xiàn)有人在看一本《兩周自制腳本語言》,覺得寫個(gè)腳本語言挺不錯(cuò)的,方便自己對(duì)語言本身進(jìn)一步了解。于是乎,買了下來看了看,寫的挺通俗易懂,但是不便的是,采用的語言是Java,PHP才是最好的語言么!為什么要采用Java。

這幾日,我也在網(wǎng)上搜索了一些資料,發(fā)現(xiàn)這個(gè)不錯(cuò)。https://github.com/rspivak/ls...,不過同樣,該教程采用的也不是PHP。正如作者所言,選什么語言由你,解釋器并不依賴語言特性。

于是乎,我用PHP重寫了part1的部分,并在以后幾日,將會(huì)采用PHP重寫所有部分。

在這里寫出代碼方便自己查找,同時(shí)也希望一些對(duì)解釋器感興趣的朋友一同學(xué)習(xí)。

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);


目前僅支持個(gè)位整數(shù)相加

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29004.html

相關(guān)文章

  • Part1JS一個(gè)Blog(node + vue + mongoDB)

    摘要:總的來說就是開發(fā)博客系統(tǒng),探索前端走向全棧之路。我會(huì)記錄下來整個(gè)過程在我的專欄,有興趣的可以關(guān)注一下,一起學(xué)習(xí),歡迎討論。話不多說,先進(jìn)行前后端項(xiàng)目的初始化。安裝完成后,輸入命令切換到項(xiàng)目文件夾后輸入命令訪問一下項(xiàng)目初始化完成。 學(xué)習(xí)JS也有一段時(shí)間了,準(zhǔn)備試著寫一個(gè)博客項(xiàng)目,前后端分離開發(fā),后端用node只提供數(shù)據(jù)接口,前端用vue-cli腳手架搭建,路由也由前端控制,數(shù)據(jù)異步交互用...

    jhhfft 評(píng)論0 收藏0
  • Part1JS一個(gè)Blog(node + vue + mongoDB)

    摘要:總的來說就是開發(fā)博客系統(tǒng),探索前端走向全棧之路。我會(huì)記錄下來整個(gè)過程在我的專欄,有興趣的可以關(guān)注一下,一起學(xué)習(xí),歡迎討論。話不多說,先進(jìn)行前后端項(xiàng)目的初始化。安裝完成后,輸入命令切換到項(xiàng)目文件夾后輸入命令訪問一下項(xiàng)目初始化完成。 學(xué)習(xí)JS也有一段時(shí)間了,準(zhǔn)備試著寫一個(gè)博客項(xiàng)目,前后端分離開發(fā),后端用node只提供數(shù)據(jù)接口,前端用vue-cli腳手架搭建,路由也由前端控制,數(shù)據(jù)異步交互用...

    ctriptech 評(píng)論0 收藏0
  • 測試你前端代碼 - part1(介紹篇)

    摘要:測試光譜光譜的一端單元測試顧名思義,代碼以單元為單位進(jìn)行測試。這個(gè)系列文章整體如下測試你的前端代碼單元測試測試你的前端代碼端到端測試測試你的前端代碼集成測試。 showImg(https://segmentfault.com/img/remote/1460000008812278?w=998&h=354); 本文作者:Gil Tayar 編譯:胡子大哈 翻譯原文:http://hu...

    helloworldcoding 評(píng)論0 收藏0
  • 測試你前端代碼 - part1(介紹篇)

    摘要:測試光譜光譜的一端單元測試顧名思義,代碼以單元為單位進(jìn)行測試。這個(gè)系列文章整體如下測試你的前端代碼單元測試測試你的前端代碼端到端測試測試你的前端代碼集成測試。 showImg(https://segmentfault.com/img/remote/1460000008812278?w=998&h=354); 本文作者:Gil Tayar 編譯:胡子大哈 翻譯原文:http://hu...

    jimhs 評(píng)論0 收藏0
  • 前端跳槽面試算法——?jiǎng)討B(tài)規(guī)劃

    摘要:我記得大三參加騰訊的校招面試時(shí)只準(zhǔn)備了幾種常見的排序算法就足以應(yīng)對(duì)了,然而今年包括今日頭條在內(nèi)的多家大廠的前端筆試題目中都出現(xiàn)了貪心算法動(dòng)態(tài)規(guī)劃分治算法等進(jìn)階性的算法題目。本篇博客參考今日頭條銀國徽老師的《js版數(shù)據(jù)結(jié)構(gòu)與算法》Part1改編自《漫畫算法》原作者:程序員小灰前言眾所周知,與后臺(tái)開發(fā)人員相比,算法是我們前端開發(fā)人員的一個(gè)弱項(xiàng)。而近兩年隨著互聯(lián)網(wǎng)行業(yè)競爭愈發(fā)激烈,市場上對(duì)前端崗位...

    mushang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<