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

資訊專欄INFORMATION COLUMN

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

Ajian / 646人閱讀

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

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

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

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

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

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

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 需要進(jìn)行解釋的字符串
    */
    public function __construct($text){
        //去除前后可能存在的空格 這些空格是無效的
        $this->text=trim($text);
        //初始化 獲取第一個(gè)字符
        $this->current_char = $this->text[$this->pos];
    }
    
    public function error()
    {
        throw new Exception("Lexer eroor");
    }
    
    /*
    步進(jìn)方法,每操作一個(gè)字符后前進(jìn)一位
    */
    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ù)字存儲(chǔ)起來
    */
    public function integers()
    {
        $result="";//用于存儲(chǔ)數(shù)字
        while($this->current_char!=null&&is_numeric($this->current_char)){//只要當(dāng)前字符是數(shù)字就一直循環(huán)并將數(shù)字存儲(chǔ)于$result
            $result.=$this->current_char;
            $this->advance();//步進(jìn)方法,每操作一個(gè)字符后前進(jìn)一位
        }
        return intval($result);//將數(shù)字字符串轉(zhuǎn)成整數(shù)
    }
    
    //獲取當(dāng)前字符的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ù),否則輸入錯(cuò)誤
    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);


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

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/29019.html

相關(guān)文章

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

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

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

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

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

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

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

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

0條評(píng)論

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