用JavaScript实现一门编程语言 3-2 (解析器之InputStream)

字符输入流

在这个部分,咱们将建立一个“流对象”来提供从字符串读取字符的能力。“流对象”包含四个方法:bash

  • peek() — 返回下一个值,但不会从流中移除。ui

  • next() — 返回下一个值,而且从流中移除。spa

  • eof() — 若是流里面没有值了,返回true.net

  • croak(msg) — 处理 throw new Error(msg).code

这让咱们能跟踪当前位置(好比哪一行代码,第几列),对展现错误信息很是有用。对象

根据你的须要,还能够再加一些方法,但目前来看已经足够了。ip

字符输入流处理字符,因此next() / peek()方法会返回chars(由于JavaScript没有char类型,因此以字符串的形式展现)。字符串

如下是这个对象的所有代码,命名为“InputStream”。代码不多很容易理解:get

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) 来获得一个流对象input

原文:lisperator.net/pltut/

相关文章
相关标签/搜索