## 如何使用 JavaScript 實現一門編程語言(2) —— 編寫一個解析器
編寫語言解析器是一項適度復雜的任務。實質上,它必須將一段代碼(我們所看到的一堆字符)轉換為“抽象語法樹”(AST)。
AST是程序在內存中一種結構化的表達方式,它是“抽象”的,因為它不關心源代碼是由哪些字符組成的,而是忠實地表示它的語義。我寫了一個單獨的頁面來描述我們的AST。
例如,對于以下程序文本:
```
sum = lambda(a, b) {
a + b;
};
print(sum(1, 2));
```
我們的解析器將生成以下AST,其實也就是一個JavaScript對象:
```
{
type: "prog",
prog: [
// first line:
{
type: "assign",
operator: "=",
left: { type: "var", value: "sum" },
right: {
type: "lambda",
vars: [ "a", "b" ],
body: {
// the body should be a "prog", but because
// it contains a single expression, our parser
// reduces it to the expression itself.
type: "binary",
operator: "+",
left: { type: "var", value: "a" },
right: { type: "var", value: "b" }
}
}
},
// second line:
{
type: "call",
func: { type: "var", value: "print" },
args: [{
type: "call",
func: { type: "var", value: "sum" },
args: [ { type: "num", value: 1 },
{ type: "num", value: 2 } ]
}]
}
]
}
```
編寫解析器的主要困難在于不能正確地組織代碼。解析器是一種更高級的處理字符串的方式。關于如何保持解析器復雜度的可管理性的,我有幾點建議:
- 編寫多個功能模塊并將它們保持較少的邏輯。在每一項功能模塊中中,做好一件事!
- 不要嘗試使用正則表達式進行解析。他們并不能派上用場,雖然正則對詞法分析器有所幫助,但我建議將它們限制在做非常簡單的事情上。
- 不要試圖猜測代碼的意圖。如果不確定如何解析某些內容,請拋出錯誤消息,并確保該消息包含錯誤的位置(行/列)。
為了簡單起見,我將代碼分為三部分,它們又分為許多小函數:[Input stream](http://annn.me/implement-a-programming-language-3)、[Token stream](http://annn.me/implement-a-programming-language-4)、[AST](http://annn.me/implement-a-programming-language-5)
- Web 開發筆記
- 從輸入 URL 到頁面加載完成的過程中都發生了什么事情?
- 從瀏覽器接收url到開啟網絡請求線程
- 開啟網絡線程到發出一個完整的http請求
- 從服務器接收到請求到對應后臺接收到請求
- 后臺和前臺的http交互
- http的緩存
- 解析頁面流程
- HTML解析,構建DOM
- CSS解析,構建CSSOM
- 資源外鏈的下載
- CSS的可視化格式模型
- 包含塊(Containing Block)
- 控制框(Controlling Box)
- BFC(Block Formatting Context)
- IFC(Inline Formatting Context)
- 其它
- JS引擎解析過程
- JS的解釋階段
- JS的預處理階段
- JS的執行階段
- 回收機制
- 參考資料
- JavaScript模塊化編程
- AMD
- requireJS
- CommonJS
- UMD
- ES6模塊
- 參考資料
- 使用 JavaScript 實現一門編程語言
- 如何使用 JavaScript 實現一門編程語言(1) —— 前言
- 如何使用 JavaScript 實現一門編程語言(2) —— 編寫一個解析器
- 如何使用 JavaScript 實現一門編程語言(3) —— Input stream
- 如何使用 JavaScript 實現一門編程語言(4) —— Token stream
- 如何使用 JavaScript 實現一門編程語言(5) —— AST
- 如何使用 JavaScript 實現一門編程語言(6) —— Interpreter
- 完整代碼
- 參考資料
- 前端布局概論
- 參考資料
- Windows 筆記
- 錯誤解決
- win10應用商店無法登錄提示0x80070426解決方法
- 使用技巧
- 設置 Hyper-V 和 VMware 共存
- Powershell
- WSL