字元輸入流
在這個部分,我們將建立一個“流物件”來提供從字串讀取字元的能力。“流物件”包含四個方法:
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)
來得到一個流物件
。