我正在尝试解析协议,其中每条消息都是这样的:
[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;
};
然后我将当前状态保持在某个地方,并为与我的状态相对应的解析函数提供字符。
这种方法存在一些问题: