用JavaScript實現一門程式語言 3-2 (解析器之InputStream)

繆宇發表於2017-10-31

字元輸入流

在這個部分,我們將建立一個“流物件”來提供從字串讀取字元的能力。“流物件”包含四個方法:

  • peek() — 返回下一個值,但不會從流中移除。

  • next() — 返回下一個值,並且從流中移除。

  • eof() — 如果流裡面沒有值了,返回true

  • croak(msg) — 處理 throw new Error(msg).

這讓我們能跟蹤當前位置(比如哪一行程式碼,第幾列),對展示錯誤資訊非常有用。

根據你的需要,還可以再加一些方法,但目前來看已經足夠了。

字元輸入流處理字元,所以next() / peek()方法會返回chars(因為JavaScript沒有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) 來得到一個流物件

原文:lisperator.net/pltut/

相關文章