這是我用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等等 儲存內...