## 如何使用 JavaScript 實現一門編程語言(3) —— Input stream
這是最簡單的部分。我們將創建一個“流對象”,它提供了從字符串中讀取字符的操作。其中4個方法:
- peek() - 返回下一個值,但不從流中移除它。
- next() - 返回下一個值,并將其從流中丟棄。
- eof() - 當且僅當流中沒有更多值時才返回true。
- croak(msg) - throw new Error(msg)
之所以包括最后一個,是因為流可以很容易地跟蹤當前位置(即行/列),這對于顯示錯誤消息很重要。
您可以根據您的需求隨意添加更多的方法在流對象中,但對于我的教程這些就足夠了。
因為流對象主要用來處理字符,所以 next()/ peek() 方法返回的值也是字符(JS沒有char類型,它們是包含一個單一字符的字符串)。
這里是這個對象的完整代碼,我將稱之為“InputStream”。它足夠簡單,理解起來很容易:
```
function InputStream(input) {
var pos = 0, line = 1, col = 0;
return {
next : next,
peek : peek,
eof : eof,
croak : croak,
};
function next() {
var ch = input.charAt(pos++);
if (ch == "\n") line++, col = 0; else col++;
return ch;
}
function peek() {
return input.charAt(pos);
}
function eof() {
return peek() == "";
}
function croak(msg) {
throw new Error(msg + " (" + line + ":" + col + ")");
}
}
```
請注意,它不是標準的通過類創建的對象(通過 new 關鍵字調用)。您只需要通過?`var stream = InputStream(string)`?即可得到流對象。
接下來,我們將在這個對象之上編寫另一個抽象:?[tokenizer](http://annn.me/implement-a-programming-language-4)?。
- 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