演示文稿主題怎么設(shè)置?。ㄔ趺磳⒀菔疚母逯黝}設(shè)置)
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ù)重載。
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)容。