【问题标题】:Generating parsers for binary structured data; metaprogramming or external scripts?为二进制结构化数据生成解析器;元编程还是外部脚本?
【发布时间】:2011-07-29 12:52:03
【问题描述】:

我正在编写一个与专有协议接口的服务器。 目前大部分代码由解析数据包的所有字段的数据包处理程序组成,同时确保可用数据的大小至少是每个字段之后的最小剩余大小。除此之外,数据包处理程序还对接收到的数据进行有效性检查(即必须在某个范围内,或者在一组预定义的值中)。

当然,当您将它与数据包的实际逻辑处理结合起来时,这是很多样板代码,所以我想自动生成解析器并在完全解析的结构上调用处理程序。

现在我看到了两种可以采取的方法:

  • 想出一些元编程框架,让我能够描述数据包结构和最终的数据验证规则,这样我就可以在编译时生成解析代码。我想这与 Boost.Spirit 的意图相似。

  • 编写我自己的数据描述语言和一个可以从中生成 C++ 代码的外部工具。看起来不太难,但肯定会弄乱构建过程,而且我通常不喜欢使用大量工具生成的代码。此外,这也不允许在源代码本身内快速更改数据描述。

元编程方式在理论上似乎更胜一筹,但我还没有想出完美的实现方式。最好声明数据包类似于声明一个类,并且不会充满宏。在我必须引用以前的数据成员的情况下也会出现问题(对于重复可变次数的字段就是这种情况,其中计数是在数据包的前面指定的)。

有没有人有类似框架的经验,你有什么建议?

我知道 Google 协议缓冲区,但它具有侵入性,因为它需要控制协议。

【问题讨论】:

    标签: c++ parsing code-generation metaprogramming struct


    【解决方案1】:

    过去,我曾多次为二进制结构化数据创建自己的语言和工具,但这部分是由于需要从数据定义中支持多种目标语言(当时,C#和 C++);我还创建了第三个目标来根据定义生成 HTML 参考文档。

    我可以看到使用 C++ 模板元编程的主要优势是,如果有用的话,您可以直接与编译时类型系统进行交互。但是,对于典型的二进制结构化数据,我从未发现它有那么大的用处。例如,您需要一种按特定顺序处理相关成员的方法; Boost 序列化通过需要一个序列化方法来指定处理哪些成员以及以什么顺序来实现这一点。

    【讨论】:

      猜你喜欢
      • 2011-04-04
      • 2011-07-15
      • 2012-10-12
      • 1970-01-01
      • 2015-07-26
      • 2010-12-17
      • 2011-11-23
      • 2019-12-10
      • 1970-01-01
      相关资源
      最近更新 更多