總想成為一名寫作技巧高超的作家,卻一不小心成為了碼農。
不知道,大家有沒有看原文作者的一些看法(傳送門)。我們為什麼要學習新的知識,我們應該如何學習新的知識。看過很多書,卻沒有記住多少,有時候覺得自己就像魚一樣,真的只有七秒的記憶。
正如原作者所說的,學習知識最好的方法就是去實踐。這樣才可以將知識掌握。
之前,看過一篇新聞,phpphp,不知道有沒有人記得這個專案,當時他出現時,我想很多人一樣說,這個無聊的專案有什麼使用者,後來才逐漸發現了自己的無知。雖然phphp並未像pypy一樣發展起來,卻給了很多想學習直譯器的同學乙個學習和實踐的途徑。
言歸正傳,這節這個直譯器已經可以完成計算器的很多功能,可以實現多位數連續加減運算。
talk is cheap ,show me the code.
<?php
define('isinteger','isinteger');//定義整數型別描述
define('plus','plus');//定義操作符號型別描述 加法
define('minus','minus');//定義操作符號型別描述 減法
define('whitespace',' ');//定義空格
/**token 用來儲存輸入字元的型別
*/class token
/**通過該方法來獲取類的私有屬性
*/public function __get($name);}
/**用於除錯
*/public function __tostring()
}//直譯器
class interpreter
public function error()
/*步進方法,每操作乙個字元後前進一位
*/public function advance()
else}/*
去除空格
*/public function skip_whitespace()}/*
如果要支援多位的整數,則需要將每位數字儲存起來
*/public function integers()
return intval($result);//將數字字串轉成整數
}//獲取當前字元的token
public function get_next_token()
if (is_numeric($this->current_char))
if ($this->current_char=="+")
if ($this->current_char=="-")
return new token('eof', null);}}
//如果字元型別和判斷的型別一致,則繼續,否則輸入錯誤
public function eat($token_type)
else
}public function term()
//解釋方法
public function expr()
else if ($token->type==minus)
}return $result;
}}dowhile(true);
用PHP寫乙個最簡單的直譯器Part2
之前寫過乙個計算器,採用js實現的,不過當時沒有想到的好的辦法,最終採用了js的eval函式來實現字串的解析和運算。這並不是的好的方法,如果實現的計算器比較複雜,最終會發現程式十分臃腫.接下來部分,在重構 的同時,並實現乙個完整計算器的直譯器 part2 實現功能 define isinteger ...
用最簡單快捷的方法用js寫乙個計算器
在js的全域性方法中有乙個eval 方法,由於平時不怎麼用,所以到關鍵時候就沒想起來它 想寫乙個簡易的計算器,本來以為要不了多久就能寫出來的,誰知道愣是花費了我近兩個小時的時間來寫,但結果還是不能令我滿意。想找乙個更好的方法來寫,不想寫的那麼麻煩,用什麼方法呢?想了乙個遍,後來猛然看到螢幕上有乙個e...
用rust寫乙個玩具直譯器0
假期閒來無事,看了thorsten ball的writing an interpreter in go,他還有一本寫編譯器的暫時沒看,跟著書上的 寫了一遍,想著用rust重寫一遍,現在正在寫eval部分.writing an interpreter in go 我對go的感覺如它宣傳的一般,21世紀...