如何选择合适的Python解析器生成器来解析C结构定义?

时间:2010-10-19 14:19:56

标签: python parsing

我正在开发一个包含两个服务器的项目,一个用python编写,另一个用C语言编写。为了最大化服务器的容量,我们定义了一个二进制专有协议,通过这个协议,这两个服务器可以相互通信。 / p>

协议在C头文件中以C struct 的形式定义。通常,我会使用VIM进行一些替换以将此文件转换为Python代码。但这意味着我必须在每次修改协议时手动执行此操作。

因此,我认为可以解析C头文件的解析器是更好的选择。但是,至少有a dozen of Python parser generator。所以我不知道哪一个更适合我的特定任务。

有什么建议吗?非常感谢。


编辑:

当然我要求任何人给我写代码....

代码已经完成。我将头文件转换为构造形式的Python代码,一个可以解析二进制数据的python库,可以识别。

我也不是在找一些已经存在的C解析器。我问的是这个问题,因为我正在阅读的一本书谈论解析器生成器,这让我学会了如何使用真正的解析器生成器。


再次编辑:

当我们进行系统设计时,我建议使用Google Protocol Buffer,ZeroC ICE或任何多语言网络编程中间件来消除实现协议的任务。

然而,并非每个程序员都能阅读英文文档,并且想尝试新事物,特别是当他们有很多经验时,可以用古老而简单的来做一些笨拙的事情。

4 个答案:

答案 0 :(得分:3)

作为一种替代解决方案,从一开始就可能感觉有点过于雄心勃勃,但也可能长期为您服务,是:

  • 使用某种更高级别的语言重新定义协议,例如某些自定义XML
  • 从同一来源生成两者 C结构定义任何所需的Python版本。

答案 1 :(得分:1)

我个人会使用PLY:

http://www.dabeaz.com/ply/

并且已经有一个用PLY编写的C解析器:

http://code.google.com/p/pycparser/

答案 2 :(得分:1)

如果我这样做,我会使用IDL作为结构定义语言。使用C结构时遇到的主要问题是C有指针,特别是字符串的char *。使用IDL会限制数据类型并强加一些语义。

然后你可以做任何你想做的事。大多数解析器生成器都将IDL作为示例语法。

答案 3 :(得分:0)

C结构不太可能足够便携,无法在计算机之间发送。不同的字节序,不同的字大小,不同的编译器都会改变结构映射到字节的方式。

最好使用专为通信设计的适当的便携式二进制格式。