字符输入流
在这个部分,我们将创建一个“流对象”来提供从字符串读取字符的能力。“流对象”包含四个方法:
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)
来得到一个流对象
。