我正在使用一项以类似 Lisp 的 S 表达式字符串形式提供数据的服务。这些数据到达的速度又快又厚,我想尽快地处理它,最好是直接在字节流上(它只是单字节字符)而不进行任何回溯。这些字符串可能非常长,我不希望 GC 为整个消息分配字符串而造成麻烦。
我当前的实现使用 CoCo/R 和语法,但它有一些问题。由于回溯,它将整个流分配给一个字符串。对于我的代码的用户来说,如果必须的话进行更改也有点麻烦。我宁愿有一个纯 C# 解决方案。 CoCo/R 也不允许重用解析器/扫描器对象,因此我必须为每条消息重新创建它们。
从概念上讲,数据流可以被视为一系列 S 表达式:
(item 1 apple)(item 2 banana)(item 3 chainsaw)
解析这个序列将创建三个对象。每个对象的类型可以由列表中的第一个值确定,在上面的例子中为“item”。传入流的模式/语法是众所周知的。
在开始编码之前,我想知道是否已经有库可以做到这一点。我确信我不是第一个遇到这个问题的人。
EDIT
这是我想要的更多细节,因为我认为最初的问题可能有点模糊。
给定一些 SExpressions,例如:
(Hear 12.3 HelloWorld)
(HJ LAJ1 -0.42)
(FRP lf (pos 2.3 1.7 0.4))
我想要一个与此等效的对象列表:
{
new HearPerceptorState(12.3, "HelloWorld"),
new HingeJointState("LAJ1", -0.42),
new ForceResistancePerceptorState("lf", new Polar(2.3, 1.7, 0.4))
}
我正在处理的实际数据集是RoboCup 3D 模拟足球联赛中机器人模型的感知器列表。我可能还需要反序列化另一组结构更复杂的相关数据.