摘要:偶然間在朋友圈發(fā)現(xiàn)有人在看一本兩周自制腳本語(yǔ)言,覺(jué)得寫(xiě)個(gè)腳本語(yǔ)言挺不錯(cuò)的,方便自己對(duì)語(yǔ)言本身進(jìn)一步了解。,不過(guò)同樣,該教程采用的也不是。在這里寫(xiě)出代碼方便自己查找,同時(shí)也希望一些對(duì)解釋器感興趣的朋友一同學(xué)習(xí)。
偶然間在朋友圈發(fā)現(xiàn)有人在看一本《兩周自制腳本語(yǔ)言》,覺(jué)得寫(xiě)個(gè)腳本語(yǔ)言挺不錯(cuò)的,方便自己對(duì)語(yǔ)言本身進(jìn)一步了解。于是乎,買(mǎi)了下來(lái)看了看,寫(xiě)的挺通俗易懂,但是不便的是,采用的語(yǔ)言是Java,PHP才是最好的語(yǔ)言么!為什么要采用Java。
這幾日,我也在網(wǎng)上搜索了一些資料,發(fā)現(xiàn)這個(gè)不錯(cuò)。https://github.com/rspivak/ls...,不過(guò)同樣,該教程采用的也不是PHP。正如作者所言,選什么語(yǔ)言由你,解釋器并不依賴(lài)語(yǔ)言特性。
于是乎,我用PHP重寫(xiě)了part1的部分,并在以后幾日,將會(huì)采用PHP重寫(xiě)所有部分。
在這里寫(xiě)出代碼方便自己查找,同時(shí)也希望一些對(duì)解釋器感興趣的朋友一同學(xué)習(xí)。
type=$type; $this->value=$value; } public function __get($name) { return $this->{$name}; } public function __toString() { return "type:".$this->type." value:".$this->value; } } class Interpreter{ private $current_char ; private $current_token ; private $text; private $pos=0; public function __construct($text){ $this->text=trim($text); } public function error() { throw new Exception("Lexer eroor"); } public function get_next_token() { $text=$this->text; if ($this->pos > strlen($text)-1){ return new Token("EOF", null); } $this->current_char = $text[$this->pos]; if (is_numeric($this->current_char)){ $token=new Token("INTEGER",intval($this->current_char)); $this->pos++; return $token; } if ($this->current_char=="+"){ $token = new Token("PLUS", $this->current_char); $this->pos ++; return $token; } $this->error(); } public function eat($token_type) { if ($this->current_token->type==$token_type){ $this->current_token=$this->get_next_token(); }else{ $this->error(); } } public function expr() { $this->current_token=$this->get_next_token(); $left=$this->current_token; $this->eat("INTEGER"); $op=$this->current_token; $this->eat("PLUS"); $right=$this->current_token; $this->eat("INTEGER"); $result=$left->value+$right->value; return $result; } } do{ fwrite(STDOUT,"xav>");; $input=fgets(STDIN); $Interpreter=new Interpreter($input); echo $Interpreter->expr(); unset($Interpreter); }while(true);
目前僅支持個(gè)位整數(shù)相加
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/29004.html
摘要:總的來(lái)說(shuō)就是開(kāi)發(fā)博客系統(tǒng),探索前端走向全棧之路。我會(huì)記錄下來(lái)整個(gè)過(guò)程在我的專(zhuān)欄,有興趣的可以關(guān)注一下,一起學(xué)習(xí),歡迎討論。話不多說(shuō),先進(jìn)行前后端項(xiàng)目的初始化。安裝完成后,輸入命令切換到項(xiàng)目文件夾后輸入命令訪問(wèn)一下項(xiàng)目初始化完成。 學(xué)習(xí)JS也有一段時(shí)間了,準(zhǔn)備試著寫(xiě)一個(gè)博客項(xiàng)目,前后端分離開(kāi)發(fā),后端用node只提供數(shù)據(jù)接口,前端用vue-cli腳手架搭建,路由也由前端控制,數(shù)據(jù)異步交互用...
摘要:總的來(lái)說(shuō)就是開(kāi)發(fā)博客系統(tǒng),探索前端走向全棧之路。我會(huì)記錄下來(lái)整個(gè)過(guò)程在我的專(zhuān)欄,有興趣的可以關(guān)注一下,一起學(xué)習(xí),歡迎討論。話不多說(shuō),先進(jìn)行前后端項(xiàng)目的初始化。安裝完成后,輸入命令切換到項(xiàng)目文件夾后輸入命令訪問(wèn)一下項(xiàng)目初始化完成。 學(xué)習(xí)JS也有一段時(shí)間了,準(zhǔn)備試著寫(xiě)一個(gè)博客項(xiàng)目,前后端分離開(kāi)發(fā),后端用node只提供數(shù)據(jù)接口,前端用vue-cli腳手架搭建,路由也由前端控制,數(shù)據(jù)異步交互用...
摘要:測(cè)試光譜光譜的一端單元測(cè)試顧名思義,代碼以單元為單位進(jìn)行測(cè)試。這個(gè)系列文章整體如下測(cè)試你的前端代碼單元測(cè)試測(cè)試你的前端代碼端到端測(cè)試測(cè)試你的前端代碼集成測(cè)試。 showImg(https://segmentfault.com/img/remote/1460000008812278?w=998&h=354); 本文作者:Gil Tayar 編譯:胡子大哈 翻譯原文:http://hu...
摘要:測(cè)試光譜光譜的一端單元測(cè)試顧名思義,代碼以單元為單位進(jìn)行測(cè)試。這個(gè)系列文章整體如下測(cè)試你的前端代碼單元測(cè)試測(cè)試你的前端代碼端到端測(cè)試測(cè)試你的前端代碼集成測(cè)試。 showImg(https://segmentfault.com/img/remote/1460000008812278?w=998&h=354); 本文作者:Gil Tayar 編譯:胡子大哈 翻譯原文:http://hu...
摘要:我記得大三參加騰訊的校招面試時(shí)只準(zhǔn)備了幾種常見(jiàn)的排序算法就足以應(yīng)對(duì)了,然而今年包括今日頭條在內(nèi)的多家大廠的前端筆試題目中都出現(xiàn)了貪心算法動(dòng)態(tài)規(guī)劃分治算法等進(jìn)階性的算法題目。本篇博客參考今日頭條銀國(guó)徽老師的《js版數(shù)據(jù)結(jié)構(gòu)與算法》Part1改編自《漫畫(huà)算法》原作者:程序員小灰前言眾所周知,與后臺(tái)開(kāi)發(fā)人員相比,算法是我們前端開(kāi)發(fā)人員的一個(gè)弱項(xiàng)。而近兩年隨著互聯(lián)網(wǎng)行業(yè)競(jìng)爭(zhēng)愈發(fā)激烈,市場(chǎng)上對(duì)前端崗位...
閱讀 2022·2021-10-25 09:48
閱讀 2888·2021-09-22 14:59
閱讀 1818·2019-08-29 16:52
閱讀 931·2019-08-29 16:07
閱讀 2377·2019-08-29 12:38
閱讀 1846·2019-08-26 13:23
閱讀 937·2019-08-26 11:49
閱讀 3350·2019-08-26 10:56