0

我正在尝试解析每个消息看起来像这样的协议:

[01001ACP01010100]

也就是说,每条消息都有一个起始字符([)和结束字符(]),一个 5 字节的序列号,一个类型(本例中为 ACP)。中间的数据由类型决定。

我正在寻找的是一种在一个或多个表中声明所有有效消息的结构的方法,然后制作一个利用该表的解析器。

我还想要一个可以处理 node.js 流和部分传输消息的解决方案。

我的第一次尝试看起来像这样:

var sub_parsers = {
    "beg" : make_parser(function (char) {return char === "<"}, 1), // start character
    "end" : make_parser(function (char) {return char === ">"}, 1), // end character
    "seq" : make_parser(isnum, 5), // sequence number
    "typ" : make_parser(isupper, 3), // type (must be all uppercase)
};

var order = ["beg", "seq", "typ"];

var make_parser = function (valid, length) {
    var buf, ret;

    buf = "";

    return function (char) {

        buf += char;

        if (valid(char)) {
            if (buf.length === length) {
                ret = buf.slice(0);
                buf = "";
                return ret;
            }
        } else {
            buf = "";
            return null;
        }
        return undefined;
    };

    return f;
};

然后我将当前状态保存在某个地方,并将字符泵送到与我的状态相对应的解析函数中。

这种方法有几个问题:

  • 有一些状态,例如上面的“typ”状态,解析的实际值会影响解析器。我无法在上表中对此进行编码。
  • 我想要一个表,它不仅编码如何解析消息,还编码如何序列化新消息。
4

0 回答 0