設(shè)計(jì)一種面向?qū)ο?/a>腳本語(yǔ)言

      網(wǎng)友投稿 727 2022-05-29

      有沒(méi)有感覺(jué)設(shè)計(jì)一門(mén)語(yǔ)言實(shí)在是太有意思了,可以自定義語(yǔ)法規(guī)則,我的“地盤(pán)聽(tīng)我的”。

      腳本語(yǔ)言的功能

      本書(shū)設(shè)計(jì)一門(mén)純粹的面向?qū)ο竽_本語(yǔ)言,任何語(yǔ)言都有個(gè)名詞,這里給這個(gè)語(yǔ)言起個(gè)名字——sparrow(麻雀)。它支持的功能如下。

      1 變量

      支持局部變量和局部變量的定義。

      變量可引用、賦值。

      內(nèi)部復(fù)合數(shù)據(jù)類(lèi)型以大寫(xiě)字符開(kāi)頭,如System.print()

      2 基本數(shù)據(jù)類(lèi)型

      數(shù)值:包括整數(shù)和浮點(diǎn)數(shù)。

      字符串:包括普通字符和unicode。

      list:列表,如Python中的list。

      支持字面量創(chuàng)建,如['a', 'b']和new方法創(chuàng)建。

      元素通過(guò)下標(biāo)list'[索引]'獲得。

      map:哈希數(shù)組,如Python中的字典。支持字面量創(chuàng)建和new創(chuàng)建。字面量創(chuàng)建如:

      {

      'k1':v1

      "k2":v2

      }

      key可以是任何數(shù)據(jù)類(lèi)型。同樣支持new方法創(chuàng)建。

      value通過(guò)下標(biāo)map'[key]'獲得。

      range:用以確定一段整數(shù)范圍,用符號(hào)..表示。range包括from和to兩個(gè)成員,分別表示這段范圍的起和始,用區(qū)間表示[from, to],即包括from和to。如range“2..6”,2就是from,6就是to,“2..6”表示2、3、4、5、6。“..”類(lèi)似于Python中的分片操作符“:”,只不過(guò)我們包括了結(jié)尾的to,而Python不包括,若用區(qū)間表示則to后面的是右小括號(hào)“)”。

      3 運(yùn)算

      數(shù)值:+、?、*、/、%。

      邏輯:>、<、==、!=、||、&&、?:、|、&等。

      位運(yùn)算:>>、<<。

      方法調(diào)用:.。

      索引:[]。

      字符串:+、%(字符串內(nèi)的表達(dá)式)

      4 控制結(jié)構(gòu)

      支持if-else選擇。

      支持while循環(huán)。

      支持for循環(huán)。

      支持break退出循環(huán)。

      支持continue,跳過(guò)本次循環(huán)體后面的部分,繼續(xù)下一輪循環(huán)。

      支持return返回。

      5 函數(shù)

      盡管這是一門(mén)面向?qū)ο笳Z(yǔ)言,但也支持傳統(tǒng)意義上的函數(shù),用關(guān)鍵字fun實(shí)現(xiàn)函數(shù)定義。

      函數(shù)也是用類(lèi)實(shí)現(xiàn)。

      設(shè)計(jì)一種面向?qū)ο竽_本語(yǔ)言

      支持函數(shù)重載。

      6 類(lèi)

      就是傳統(tǒng)意義上的class,包括類(lèi)定義和類(lèi)實(shí)例,靜態(tài)類(lèi)。

      實(shí)現(xiàn)繼承,所有類(lèi)都是object類(lèi)的子類(lèi)。

      類(lèi)成員(也稱(chēng)域,或字段)必須先聲明再引用。

      方法包括method、getter、setter、subscript、subscriptSetter和構(gòu)造函數(shù)。支持塊參數(shù),塊參數(shù)的參數(shù)是用“||”括起來(lái)的參數(shù)列表,以逗號(hào)分隔。

      支持靜態(tài)方法。

      7 線程

      支持線程創(chuàng)建及調(diào)度。

      8 模塊

      支持執(zhí)行模塊和模塊內(nèi)模塊變量的單獨(dú)導(dǎo)入。

      9 注釋

      行注釋?zhuān)?/

      塊注釋?zhuān)?* 塊注釋 */

      以上列舉若有遺漏則以實(shí)際代碼為主。

      關(guān)鍵字

      有以下關(guān)鍵字被提前征用了。

      var:用于變量定義。

      fun:用于函數(shù)定義。

      if:用于條件判斷。

      else:用于條件判斷的else分支。

      true:bool值真。

      false:bool值假。

      while:用于while循環(huán)。

      for:用于for循環(huán)。

      break:用于退出循環(huán)。

      continue:用于結(jié)束本次循環(huán)并進(jìn)入下一輪循環(huán)。

      return:用于從函數(shù)返回。

      null:空值。

      class:用于類(lèi)定義。

      is:用于判斷類(lèi)是否為某類(lèi)的子類(lèi),即“is a”。

      static:用于設(shè)置靜態(tài)文法。

      this:用于指向本實(shí)例。

      super:用于指向父類(lèi)。

      import:用于導(dǎo)入模塊。

      腳本的執(zhí)行方式

      我們采用傳統(tǒng)的虛擬機(jī)作為執(zhí)行方式,即要實(shí)現(xiàn)一個(gè)虛擬機(jī)。編譯器先把源碼編譯為opcode,再讓虛擬機(jī)執(zhí)行opcode。

      opcode即操作碼,是自定義的一套專(zhuān)供虛擬機(jī)執(zhí)行的指令,后面我們?cè)趯?shí)現(xiàn)虛擬機(jī)時(shí)會(huì)詳細(xì)介紹。

      “純手工”的開(kāi)發(fā)環(huán)境

      既然本著教學(xué)的目的我覺(jué)得應(yīng)該拿出教學(xué)的誠(chéng)意,因此這里所說(shuō)的“純手工”是指編碼中不想借助STL或其他類(lèi)似的泛型語(yǔ)言,沒(méi)有第三方庫(kù),一切以最基礎(chǔ)最原始的形式展現(xiàn)語(yǔ)言的奧秘,因此選擇了C語(yǔ)言,確定地說(shuō)是C89,并不是較新的C99標(biāo)準(zhǔn),誠(chéng)意滿(mǎn)滿(mǎn),讓我們純手工去編碼吧。

      基礎(chǔ)開(kāi)發(fā)環(huán)境是:

      宿主系統(tǒng)是Linux,采用CentOS release 6.8 (Final);

      編譯器是gcc,版本是gcc version 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC)。

      定義sparrow語(yǔ)言的文法

      在之前介紹的文法中,我們采用的是大寫(xiě)字母表示非終結(jié)符,小寫(xiě)字母表示終結(jié)符,然而我們也說(shuō)過(guò)了,在現(xiàn)實(shí)中為了便于編程,一般都用正規(guī)文法來(lái)定義語(yǔ)言,正規(guī)文法說(shuō)白了就是用正則表達(dá)式定義的文法,因此本小節(jié)的基礎(chǔ)是正則表達(dá)式,為保證容易看懂,我會(huì)用最簡(jiǎn)單的方式書(shū)寫(xiě)正則表達(dá)式。

      值得注意的是,正規(guī)文法與第0章中介紹的文法有很大的差別,主要是涉及終結(jié)符是用''表示,原因是正規(guī)文法中會(huì)涉及()、[]和{},這些在正規(guī)文法中都是元字符,有其特殊含義:()表示成為一組,[]表示范圍,{}表示重復(fù)。

      但在實(shí)際語(yǔ)言它們只是字符串字面量(即終結(jié)符),比如在語(yǔ)言中()表示函數(shù)名后面的括號(hào),也可表示表達(dá)式中的小括號(hào),[]表示下標(biāo)索引,因此為避免沖突,正規(guī)文法中用單引號(hào)括起的是終結(jié)符。

      其實(shí)語(yǔ)法和傳統(tǒng)語(yǔ)言差不多,只是用文法來(lái)描述就顯得生澀了。注意,正規(guī)文法中的[]與EBNF中的意義不同,在此表示范圍,其中可以用-表示一段連續(xù)的范圍,比如0-9就表示0至9之間(包括0和9)的任何數(shù);a-z同理,表示字母a到字母z之間的任何字母。[]后面一般會(huì)接量詞,當(dāng)然量詞不一定只用在[]之后,但它一定是用在某個(gè)字符之后以表示該字符的數(shù)量,其前不能沒(méi)有字符。

      按照數(shù)量級(jí)別劃分有3種量詞,+表示重復(fù)出現(xiàn)1次以上,*表示重復(fù)出現(xiàn)0次以上,?表示出現(xiàn)0次或1次,比如可用[\t]*表示0個(gè)或多個(gè)空白字符,其中\(zhòng)t是tab。

      注意此處[]中的空白是空格,為了突顯這里有個(gè)空格就寫(xiě)了兩個(gè)。.表示任意字符,包括控制字符比如回車(chē)等,|表示或者、任意其一,比如a|b,表示a和b兩者取其一,注意,|是對(duì)兩邊的整體有效,并不是只對(duì)緊鄰|的有效。

      比如對(duì)于ab|cd的意思是ab或者cd,如果想表達(dá)abd或acd,可以用分組符號(hào)(),就是小括號(hào)對(duì)兒。()表示作為一組考慮,使相應(yīng)的正則符號(hào)應(yīng)用于整個(gè)組成員。

      初次接觸文法的讀者可能對(duì)遞歸定義感到“消化不良”,比如非終結(jié)符exp是用于定義表達(dá)式,exp是由infixExp等非終結(jié)符組成,而infixExp又是由exp組成,看上去有點(diǎn)死循環(huán)出不來(lái)了,但你不要忘了,infixExp只是exp的其中一個(gè)組成部分,exp還可以由num、id等指代,num和id下面再無(wú)遞歸定義,這就是遞歸終止的條件。因此infixExp的組成部分exp也會(huì)是num或id等。

      下面是具體的樣本。

      以下是上述文件的執(zhí)行結(jié)果,其中的spr是最終的腳本解釋器(包括編譯器及虛擬機(jī)),spr是sparrow的縮寫(xiě)。

      以上./spr manager.sp就是執(zhí)行腳本文件manager.sp,這與任何腳本語(yǔ)言的運(yùn)行方法都是一致的,執(zhí)行過(guò)就是腳本的輸出,大家有興趣可以核對(duì)一下結(jié)果,除了System.clock返回的時(shí)間戳是動(dòng)態(tài)變化的外,其他不變。

      《自制編程語(yǔ)言》

      鄭鋼??著

      本書(shū)全面從腳本語(yǔ)言和虛擬機(jī)介紹開(kāi)始,講解了詞法分析的實(shí)現(xiàn)、一些底層數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)、符號(hào)表及類(lèi)的結(jié)構(gòu)符號(hào)表,常量存儲(chǔ),局部變量,模塊變量,方法存儲(chǔ)、虛擬機(jī)原理、運(yùn)行時(shí)棧實(shí)現(xiàn)、編譯的實(shí)現(xiàn)、語(yǔ)法分析和語(yǔ)法制導(dǎo)自頂向下算符優(yōu)先構(gòu)造規(guī)則、調(diào)試、查看指令流、查看運(yùn)行時(shí)棧、給類(lèi)添加更多的方法、垃圾回收實(shí)現(xiàn)、添加命令行支持命令行接口。

      本文轉(zhuǎn)載自異步社區(qū)

      Web應(yīng)用防火墻 WAF

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:Java基礎(chǔ)之網(wǎng)絡(luò)編程
      下一篇:MapReduce初體驗(yàn)——統(tǒng)計(jì)指定文本文件中每一個(gè)單詞出現(xiàn)的總次數(shù)
      相關(guān)文章
      亚洲国产成人久久精品99| 夜色阁亚洲一区二区三区| 亚洲色婷婷六月亚洲婷婷6月| 亚洲国产成人精品无码区二本 | 亚洲AV一二三区成人影片| 久久亚洲精品成人无码网站| 亚洲伦另类中文字幕| 亚洲一本综合久久| 4480yy私人影院亚洲| 亚洲黄色免费观看| 亚洲好看的理论片电影| 亚洲综合视频在线| 亚洲精品视频专区| 亚洲一级毛片免费在线观看| 97se亚洲国产综合自在线| 亚洲中文字幕无码久久| 亚洲欧洲AV无码专区| 亚洲午夜成人精品无码色欲| 亚洲午夜理论片在线观看| 亚洲日本天堂在线| 蜜桃传媒一区二区亚洲AV| 亚洲国产aⅴ综合网| 久久亚洲av无码精品浪潮| 亚洲精品乱码久久久久久久久久久久 | 91亚洲精品视频| 亚洲精品不卡视频| 亚洲国产人成在线观看| 激情综合亚洲色婷婷五月APP| 亚洲综合偷自成人网第页色| 亚洲人成电影网站色www| 亚洲爆乳少妇无码激情| 亚洲AV无码专区日韩| 国产亚洲AV手机在线观看| 亚洲精品你懂的在线观看| 亚洲精品成人av在线| 亚洲一区免费在线观看| 亚洲欧美日韩中文二区| 亚洲狠狠爱综合影院婷婷| 国产亚洲av片在线观看播放 | 久久精品国产亚洲AV天海翼| 亚洲国产aⅴ综合网|