用PHP寫乙個最簡單的直譯器Part3

2021-09-13 11:35:46 字數 1570 閱讀 1102

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

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

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

之前,看過一篇新聞,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世紀...