通過開發一門類 lisp 的程式語言來理解程式語言的設計思想,本實踐來自著名的《build your own lisp》。
語言主要有兩種型別:編譯型和解釋型。技術上,任何語言都可以被編譯或解釋,但是一種或另一種語言通常對於特定語言更有意義。一般來說,解釋往往更加靈活,而編譯往往具有更高的效能。
當我們希望開發一種解釋型語言,那麼建議使用編譯語言(e.g. c/c ++ 或 swift)進行開發,否則我們開發的解釋型語言的效能損失以及其自身的直譯器將會更加複雜。
互動式直譯器,這種系統也被叫做 repl(read-evaluate-print loop,讀取-求值-輸出-迴圈),這種技術被廣泛地應用在各種程式語言的直譯器中,例如 python 的 shell。我們稱這種模式為互動提示。
在編寫乙個完整的 repl 之前,我們先實現乙個簡單的程式:讀取使用者的輸入,在程式內部進行處理,然後返回一些資訊給使用者。
使用乙個永迴圈等待使用者輸入並列印資訊。
使用 stdio.h 中的 fgets 函式獲取使用者輸入的內容,這個函式可以一直讀取直到遇到換行符為止。
宣告乙個固定大小的陣列緩衝區來儲存使用者的輸入。
一旦獲取到使用者輸入的字串,就可以使用 printf 將它列印到命令列中。
建立乙個 parsing.c 原始檔,意為直譯器:
#include
/* declare a buffer for user input of size 2048.
* 定義了乙個擁有 2048 個字元長度的全域性陣列。這個陣列中儲存的資料可以在程式的任何地方獲取到。
* 我們會把使用者在命令中輸入的語句儲存到這裡面來。
* static 關鍵字標明這個陣列僅在本檔案中可見。
*/static
char input[
2048];
// 2kb
intmain
(int argc,
char
*ar**)
return0;
}
執行:
$ ./parsing
lispy version 0.1
press ctrl+c to exit
lispy> fanguiju
you're a fanguiju
lispy> ^c
上述完成了最基本的互動式功能(輸入、輸出),如果你用的是 mac 或 linux,當你用左右箭頭鍵編輯在程式中的輸入時,你會遇到乙個奇怪的問題:使用箭頭鍵不會前後移動輸入的游標,而是會產生像^[[d
或^[[c
這種奇怪的字元。如下所示。
lispy version 0.0.0.0.3
press ctrl+c to exit
lispy> hel^[[d^[[c
注:在 windows 上則不會有這個現象。
所以,我們還需要完成 shell 具有的一些特性,例如:使用左右箭頭對指令行進行編輯、使用上下箭頭來獲取歷史輸入。這裡,我們使用 gnu readline 庫來進行改造,把 fputs 和 fgets 替換為這個庫提供的相同功能的函式。
安裝 gnu readline 函式庫:
yum install readline-devel -y
檢視:
$ ll /usr/include | grep readline
drwxr-xr-x 2 root root 143 4月 7 18:06 readline
gnu readline 函式庫提供的兩個函式:readline 和 add_history。
add_history 函式:可以紀錄下我們之前輸入過的命令,並執行使用者使用上下箭頭來獲取歷史輸入。
#include
#include
#include
#include
intmain
(int argc,
char
*ar**)
return0;
}
編譯:
gcc -std=c99 -wall parsing.c -o parsing -lreadline
-std:指定 c 語言標準。
執行:
$ ./parsing
lispy version 0.1
press ctrl+c to exit
lispy> fanguiju
you're a fanguiju
lispy> fanguiju # 使用上箭頭獲取歷史輸入記錄
you're a fanguiju
lispy>
用 C 語言開發一門程式語言 異常處理
用 c 語言開發一門程式語言 互動式解析器l 用 c 語言開發一門程式語言 跨平台的可移植性 用 c 語言開發一門程式語言 語法解析器 用 c 語言開發一門程式語言 抽象語法樹 在開發過程中,程式崩潰是很正常的。但我們希望最後發布的產品能夠告訴使用者錯誤出在 而不是簡單粗暴的退出。目前,我們的程式僅...
用 C 語言開發一門程式語言 抽象語法樹
抽象語法樹與行為樹 用 c 語言開發一門程式語言 互動式解析器l 用 c 語言開發一門程式語言 跨平台的可移植性 用 c 語言開發一門程式語言 語法解析器 lispy 5 2 2 regex operator char 1 1 expr number regex 1 3 5 expr char 1 ...
如何開發一門程式語言
首先,你要考慮這是動態語言還是靜態語言,然後去想它面向什麼,如web開發,物件導向的程式設計等。還有它的語法,下面列出了物件導向的程式語言所需要的語句 語句用途 if 表示式1 執行語句1 else 執行語句2 判斷如果表示式1,則執行語句1,否則,執行語句2 cout 輸出cin 輸入int 變數...