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

字符输入流

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

  • 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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值