建议基于表的流解析方法

时间:2013-01-23 07:57:47

标签: javascript node.js

我正在尝试解析协议,其中每条消息都是这样的:

[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;
};

然后我将当前状态保持在某个地方,并为与我的状态相对应的解析函数提供字符。

这种方法存在一些问题:

  • 有一些状态,例如上面的“典型”状态,实际的 解析的值会影响解析器。我无法对此进行编码 上面的表格。
  • 我想要一张桌子,不仅要编码如何 解析消息,以及如何序列化新消息。

0 个答案:

没有答案