如何使用PHP來寫一個簡單的解譯器

來源:互聯網
上載者:User
這篇文章主要介紹了關於如何使用PHP來寫一個簡單的解譯器,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

偶然間在朋友圈發現有人在看一本《兩周自製指令碼語言》,覺得寫個指令碼語言挺不錯的,方便自己對語言本身進一步瞭解。於是乎,買了下來看了看,寫的挺通俗易懂,但是不便的是,採用的語言是Java,PHP才是最好的語言麼!為什麼要採用Java。

這幾日,我也在網上搜尋了一些資料,發現這個不錯。https://github.com/rspivak/ls...,不過同樣,該教程採用的也不是PHP。正如作者所言,選什麼語言由你,解譯器並不依賴語言特性。

於是乎,我用PHP重寫了part1的部分,並在以後幾日,將會採用PHP重寫所有部分。

在這裡寫出代碼方便自己尋找,同時也希望一些對解譯器感興趣的朋友一同學習。

<?phpclass Token{    private $type;    private $value;    public function __construct($type,$value)    {        $this->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('Error parsing input');    }        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);

目前僅支援個位整數相加

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.