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

时间:2016-04-21 14:40:50

标签: c# data-structures protocols code-generation ansi-c

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

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

元语言需要支持

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

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

到目前为止,我已经看了

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

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

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

我看过Generating C# structure from C structure,但那里没有一个不错的选择。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

你想要的是Program Transformation System

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

这个空间中的好工具让您可以根据感兴趣的语言的(" surface")语法编写代码转换,基本上以&#34的形式编写代码转换;如果您看到这个,用 "。

替换它

对于OP的场景,必要的转换是"如果你看到结构中的这个插槽相应的getter和setter替换它,以及替换的struct成员目标语言。

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

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

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

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