自己動手寫指令碼語言

2021-06-18 06:57:26 字數 2757 閱讀 5258

這是我用c++寫的乙個簡單的指令碼語言,非常簡短,不到3000行**

sil語言(****** interpretative lanuage)是乙個簡單的指令碼語言,只是乙個玩具,目的是演示用簡短的**去建立乙個可用的指令碼語言

這樣乙個玩具會是怎麼樣的呢?

sil的設計目標:

1 . 非常容易將sil直譯器嵌入到c++**中

2 . 非常容易用c++**來擴充套件sil的函式呼叫,使得c++和sil指令碼非常容易互動

3 . 成為乙個有簡潔語法的動態語言,有容易使用的語法

4 . 擁有乙個語言一般都應當擁有的語法

sil語法的完整定義可參考《sil語法說明》。

sil語言是動態型別的,編譯時不會檢查函式的引數個數,引數型別是否合適,甚至不會檢查函式定義是否存在,只有到了執行時才會查詢函式,檢查引數個數是否匹配。

對於內建函式還會檢查引數型別是否匹配,如果不匹配會試著進行引數型別轉換

對於使用者定義函式,不會進行引數型別匹配的檢查

第一節 語法:

1. 型別:

sil暫時支援整形,浮點型,字串三種資料型別,暫時不支援陣列,也不支援自定義型別(這兩點是比較嚴重的缺點)

sil是弱型別的,變數不會和型別繫結

變數定義像是這樣的:

var vi=1; //定義乙個值為整數1的變數vi

var vf=1.0;//定義乙個值為浮點數1.0的變數vf

var vs="1.0";//定義乙個值為字串"1.0"的字串vs

2. 函式

sil是弱型別的,所以定義函式時不需要宣告形參的型別,支援return語句

函式像這樣定義: 

function myfun(str)

函式像這樣呼叫:myfun("hello sil");

3. 分支

sil支援if else 語句,

像這樣:

var i=read(); 

if(i==1) print("a");

else if(i==2) 

else print("c");

4. 迴圈

sil支援while和for迴圈,支援continue,break語句

while像這樣:

var i=1;

while(true)

for迴圈像這樣

for(var i=0;i<5;i=i+1) print(i+"\n");

5. 基本運算子

比較運算支援 == != > <

算術運算支援 + - * / % ,還支援一元 -

邏輯運算支援 !  && ||

支援括號 ( ) 改變求值順序

算符優先順序和c中一樣

5. 內建函式

sil類內建函式是非常少的,詳見函式說明,以下列出兩個比較重要的。

eval 可對乙個字串形式的sil**求值

例如 eval("for(var i=0;i<5;i=i+1)print(i);");

load 可以載入乙個sil**檔案,**檔案中亦可遞迴呼叫load函式

6. c++嵌入和擴充套件

寥寥數行**即可將sil嵌入到c++中

乙個c函式只要形參和返回值型別是int float string,簡單呼叫乙個register_function即可將函式註冊到sil中,指令碼即可方便的呼叫這些擴充套件函式

extern工程中的**示例了如何對sil提供檔案讀寫函式的支援

第二節 源**

這是乙個用vs2008建立的工程,由於使用了shared_ptr,如果給vs2005引入shared_ptr的支援亦可在vs2005下編譯通過

src目錄下是sil語言用c++實現的核心

consle目錄下是sil語言的命令列直譯器

extern目錄下是乙個例子,演示了如何擴充套件sil的內建函式

lib目錄下是用sil寫的庫**和一些測試**,但是現在只有簡單的測試**(裡面有乙個開平方根和求圓周率的有意思的例子)

doc目錄下是文件

bin目錄下是可執行檔案

第三節 函式說明

to_int 將乙個值轉換為int型別,例如:to_int("123");

to_float 將乙個值轉換為float型別,例如:to_float(2);

to_string 將乙個值轉換為string型別,例如:to_string(254);

strlen 求字串的長度,例如:strlen("hello");

substr 擷取字串的的一部分,例如:substr("hello",1,3);

eval 可以求值乙個字串形式的表示式,例如:  var code="1+2*3";eval(code);

load 可以載入並執行乙個sil**的檔案,例如: load("../lib/math_test.sil");

exit 終止指令碼的執行,例如:print("hello");exit();print("world");

print 列印乙個值,例如:print("hello world"+3);

read 可以從控制台讀取乙個字串,例如:var tmp=read();print(tmp);

bat 可以執行乙個windows命令,例如:bat("dir");

list_function 列印已經定義的內建函式和指令碼函式,例如:list_funciton();

list_asm_code 列印編譯出的**,例如:list_asm_code();

set_sil 可以設定直譯器的一些開關,例如:set_sil("",0);

help 顯示幫助資訊,例如:help();

自己動手寫指令碼語言

這是我用c 寫的乙個簡單的指令碼語言,非常簡短,不到3000行 sil語言 interpretative lanuage 是乙個簡單的指令碼語言,只是乙個玩具,目的是演示用簡短的 去建立乙個可用的指令碼語言 這樣乙個玩具會是怎麼樣的呢?sil的設計目標 1 非常容易將sil直譯器嵌入到c 中 2 非...

自己動手寫bootloader

原始出處 作者資訊和本宣告。否則將追究法律責任。為了寫乙個bootloader讓板子跑起來,首先我們要知道bootloader是個什麼東東才行。簡單的說,bootloader就是乙個引導核心啟動的一段小 也就是說當啟動完核心之後,它的使命就已經結束。bootloader生命週期 初始化硬體 設定啟動...

自己動手寫CMS

簡易的cms外掛程式,可供借鑑或者擴充套件 流程 定義內容 分類與組織內容 儲存內容 操作控制內容 定義內容 制定目標 確定需要的內容型別 目標使用者定位 確定目標使用者需要何種技術 分類與組織內容 按內容所屬的邏輯層級關係來劃分 按內容的種類來劃分,比如video text audio等等 儲存內...