国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

Ajian / 640人閱讀

摘要:總想成為一名寫作技巧高超的作家,卻一不小心成為了碼農(nóng)。雖然并未像一樣發(fā)展起來,卻給了很多想學習解釋器的同學一個學習和實踐的途徑。言歸正傳,這節(jié)這個解釋器已經(jīng)可以完成計算器的很多功能,可以實現(xiàn)多位數(shù)連續(xù)加減運算。

總想成為一名寫作技巧高超的作家,卻一不小心成為了碼農(nóng)。

不知道,大家有沒有看原文作者的一些看法(傳送門)。我們?yōu)槭裁匆獙W習新的知識,我們應該如何學習新的知識。看過很多書,卻沒有記住多少,有時候覺得自己就像魚一樣,真的只有七秒的記憶。

正如原作者所說的,學習知識最好的方法就是去實踐。這樣才可以將知識掌握。

之前,看過一篇新聞,PHPPHP,不知道有沒有人記得這個項目,當時他出現(xiàn)時,我想很多人一樣說,這個無聊的項目有什么用戶,后來才逐漸發(fā)現(xiàn)了自己的無知。雖然PHPHP并未像pypy一樣發(fā)展起來,卻給了很多想學習解釋器的同學一個學習和實踐的途徑。

言歸正傳,這節(jié)這個解釋器已經(jīng)可以完成計算器的很多功能,可以實現(xiàn)多位數(shù)連續(xù)加減運算。

Talk is cheap ,show me the code.

type=$type;
        $this->value=$value;
    }
    
    /**
    通過該方法來獲取類的私有屬性
    */
    public function __get($name)
    {
        return $this->{$name};
    }
    /**
    用于調(diào)試
    */
    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();
        }
    }
    
    /*
    如果要支持多位的整數(shù),則需要將每位數(shù)字存儲起來
    */
    public function integers()
    {
        $result="";//用于存儲數(shù)字
        while($this->current_char!=null&&is_numeric($this->current_char)){//只要當前字符是數(shù)字就一直循環(huán)并將數(shù)字存儲于$result
            $result.=$this->current_char;
            $this->advance();//步進方法,每操作一個字符后前進一位
        }
        return intval($result);//將數(shù)字字符串轉成整數(shù)
    }
    
    //獲取當前字符的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);
        }
    }
    
    //如果字符類型和判斷的類型一致,則繼續(xù),否則輸入錯誤
    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();//獲取字符串開頭部分的數(shù)字
        $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);


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

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29019.html

相關文章

  • EOS入門指南——PART3 如何創(chuàng)建賬戶

    摘要:最后一步付款和比特幣以及以太坊不一樣的是,在創(chuàng)建賬戶是有成本的,這也就是為什么我們需要一個賬戶才能創(chuàng)建賬戶的原因找個人來買單。 之前我們學習了如何編譯EOS程序,以及如何連接到EOS主網(wǎng),接下來我們要談一談大家最關心的,如何創(chuàng)建自己的EOS賬戶。 摘要 這篇我們會學習如何創(chuàng)建錢包、秘鑰對、主網(wǎng)賬戶,向大家介紹一些實用工具。最重要的是,我們會學習到在EOS里,公鑰和賬戶到底有什么區(qū)別。 ...

    oliverhuang 評論0 收藏0
  • Part3JS一個Blog (node + vue + mongoDB)

    摘要:用寫一個用寫一個上一節(jié)我們把數(shù)據(jù)庫連接成功了,這節(jié)我準備寫關于文章的數(shù)據(jù)接口增刪改查上次說到接口都在文件夾里面寫,打開文件,首先引入文章的模型新增文章新增文章方法保存數(shù)據(jù)到數(shù)據(jù)庫如果出現(xiàn)錯誤,直接把錯誤進的錯誤中樞處理儲存成功后,返回給客戶 【Part1】用JS寫一個Blog (node + vue + mongoDB)【Part2】用JS寫一個Blog (node + vue + m...

    wuyumin 評論0 收藏0
  • Part3JS一個Blog (node + vue + mongoDB)

    摘要:用寫一個用寫一個上一節(jié)我們把數(shù)據(jù)庫連接成功了,這節(jié)我準備寫關于文章的數(shù)據(jù)接口增刪改查上次說到接口都在文件夾里面寫,打開文件,首先引入文章的模型新增文章新增文章方法保存數(shù)據(jù)到數(shù)據(jù)庫如果出現(xiàn)錯誤,直接把錯誤進的錯誤中樞處理儲存成功后,返回給客戶 【Part1】用JS寫一個Blog (node + vue + mongoDB)【Part2】用JS寫一個Blog (node + vue + m...

    CoorChice 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<