1. 程式人生 > >自制指令碼語言(1) 詞法、語法、虛擬機器的設計思路

自制指令碼語言(1) 詞法、語法、虛擬機器的設計思路

摘要:介紹了一種自制的指令碼語言的設計思路,定義第一版語言的詞法與語法,虛擬機器的設計。

編譯器設計,是每個程式設計師通往高階的必修課。從本文開始設計一種指令碼語言及其編譯器。為了方便,不編譯為機器語言而是執行在一個基於棧的虛擬機器上。語言是弱型別動態檢查。虛擬機器主要功能參考JVM。技術上,編譯器選擇Java語言寫,虛擬機器用C++寫。因為Java便於開發,而C++可以管理底層。

第一版指令碼語言,只需要實現一些簡單的功能。變數定義與賦值,四則運算與比較表示式,函式的定義與呼叫,遞迴呼叫,控制檯輸入輸出。

詞法設計:

var表示變數: [a-z A-Z]+ [0-9 a-z A-Z]* 

number表示數字常量,為方便都轉為double型: [0-9]* 或 [0-9]* . [0-9]*

String型別常量:" [.]* "

bool型常量true, false用1,0代替。

opt運算子: { } ( ) + - * / = < > == =!

保留關鍵詞:if else while var function return print input

語法設計:

用LALR(1)語法解析。語法解析器(parser)用生成器(generator)自動生成。主要有以下生成式:

stmt_list -> stmt_list stmt

stmt -> if_stmt | while_stmt | function_stmt | exp | IO_stmt

exp -> bool_exp | four_exp | call_exp | (exp)

虛擬機器設計:

方法區:儲存函式、物件的元資訊

執行棧:區域性變數、上下文

堆:變數的體、函式的體

GC:停頓標記清掃