用于代码的元语言为ANSI-C和C#Structs生成打包的结构

我正在尝试找到一种“元语言”,可用于定义结构和获取/设置成员的代码。 问题在于结构已经存在于代码中,并且这种“元语言”将用作原始手工编码结构的逐位替换,以允许生成描述结构的头部。 关键是这些结构被用作C#应用程序和嵌入式设备之间的协议的一部分(不是基于Linux,认为更小,更像PIC或CM0那样受限制。)元语言将充当

  • 结构成员的文档
  • 为get / set操作生成C#结构和实现
  • 生成打包的ANSI-C结构和get / set函数

元语言需要支持

  • 枚举定义(指定大小 – 即uint16_t,uint8_t或更小的多位枚举)
  • 位数组(指定大小 – 即48位数组打包成6个字节)
  • 位结构/枚举数组(指定大小 – 即48位索引的2位结构为12个字节)
  • 字节序和位序的规范,
  • 生成二进制结构,可以通过生成的ANSI-C代码或C-sharp代码直接读取,以便通过网络发送。

收到数据时对数据进行有限的validation也是很好的。

到目前为止,我已经看过了

  • BSON
  • 蚀刻
  • Hessian Avro
  • MessagePack
  • 协议缓冲区
  • 节约

所有这些都非常适合文档和构建新协议,但是试图保持与现有协议的兼容性,并且由于数据封送中固有的类型编码而导致这些协议不足。

我还查看了ASN.1的ECN编码,但这似乎太难以理解,导致文档出现问题。

我从C结构看了Generating C#结构,但那里没有一个好的选择。

有什么建议?

你想要的是一个程序转换系统 。

这些工具可以读取任意计算机语言实例,然后将它们转换为其他有效的语言实例,有时使用相同的语言,有时使用不同的语言。 它们是通用的,您可以向它们提供您想要操作的语言的描述,然后它们可以对这些语言进行操作。

这个空间中的好工具允许您根据感兴趣的语言的(“表面”)语法编写代码转换,基本上以“如果你看到 ,用它替换它”的forms。

对于OP的场景,基本的转换是“如果你看到一个结构中的这个槽相应的getter和setter替换它,并且替换目标语言的struct成员

在您的情况下,您需要在3种情况中进行选择:

  • 定义用于指定数据结构的抽象语言,并构建从规范语言映射到C#和C的程序转换。
  • 确定C数据声明是引用,并生成相应的C#代码。
  • 决定C#数据声明是引用,并生成相应的C代码。

然后你必须坐下来,为工具定义语言(如果它们尚未定义),并构建变换。

(完全披露:我建立了这样一个工具。见我的生物)。

Interesting Posts