摘要:總想成為一名寫作技巧高超的作家,卻一不小心成為了碼農(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
摘要:最后一步付款和比特幣以及以太坊不一樣的是,在創(chuàng)建賬戶是有成本的,這也就是為什么我們需要一個賬戶才能創(chuàng)建賬戶的原因找個人來買單。 之前我們學習了如何編譯EOS程序,以及如何連接到EOS主網(wǎng),接下來我們要談一談大家最關心的,如何創(chuàng)建自己的EOS賬戶。 摘要 這篇我們會學習如何創(chuàng)建錢包、秘鑰對、主網(wǎng)賬戶,向大家介紹一些實用工具。最重要的是,我們會學習到在EOS里,公鑰和賬戶到底有什么區(qū)別。 ...
摘要:用寫一個用寫一個上一節(jié)我們把數(shù)據(jù)庫連接成功了,這節(jié)我準備寫關于文章的數(shù)據(jù)接口增刪改查上次說到接口都在文件夾里面寫,打開文件,首先引入文章的模型新增文章新增文章方法保存數(shù)據(jù)到數(shù)據(jù)庫如果出現(xiàn)錯誤,直接把錯誤進的錯誤中樞處理儲存成功后,返回給客戶 【Part1】用JS寫一個Blog (node + vue + mongoDB)【Part2】用JS寫一個Blog (node + vue + m...
摘要:用寫一個用寫一個上一節(jié)我們把數(shù)據(jù)庫連接成功了,這節(jié)我準備寫關于文章的數(shù)據(jù)接口增刪改查上次說到接口都在文件夾里面寫,打開文件,首先引入文章的模型新增文章新增文章方法保存數(shù)據(jù)到數(shù)據(jù)庫如果出現(xiàn)錯誤,直接把錯誤進的錯誤中樞處理儲存成功后,返回給客戶 【Part1】用JS寫一個Blog (node + vue + mongoDB)【Part2】用JS寫一個Blog (node + vue + m...
閱讀 3044·2021-11-22 09:34
閱讀 3636·2021-08-31 09:45
閱讀 3836·2019-08-30 13:57
閱讀 1670·2019-08-29 15:11
閱讀 1681·2019-08-28 18:04
閱讀 3218·2019-08-28 17:59
閱讀 1558·2019-08-26 13:35
閱讀 2188·2019-08-26 10:12