自制指令碼語言(1) 詞法、語法、虛擬機器的設計思路
阿新 • • 發佈:2019-01-30
摘要:介紹了一種自制的指令碼語言的設計思路,定義第一版語言的詞法與語法,虛擬機器的設計。
編譯器設計,是每個程式設計師通往高階的必修課。從本文開始設計一種指令碼語言及其編譯器。為了方便,不編譯為機器語言而是執行在一個基於棧的虛擬機器上。語言是弱型別動態檢查。虛擬機器主要功能參考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:停頓標記清掃