用PHP寫一個最簡單的解釋器Part1

偶然間在朋友圈發現有人在看一本《兩週自制腳本語言》,以爲寫個腳本語言挺不錯的,方便本身對語言自己進一步瞭解。因而乎,買了下來看了看,寫的挺通俗易懂,可是不便的是,採用的語言是Java,PHP纔是最好的語言麼!爲何要採用Java。php

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

因而乎,我用PHP重寫了part1的部分,並在之後幾日,將會採用PHP重寫全部部分。github

在這裏寫出代碼方便本身查找,同時也但願一些對解釋器感興趣的朋友一同窗習。學習

<?php

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

clipboard.png

目前僅支持個位整數相加this

相關文章
相關標籤/搜索