【问题标题】:How to choose a proper Python parser generator to parse C struct definitions?如何选择合适的 Python 解析器生成器来解析 C 结构定义?
【发布时间】:2010-10-19 14:19:55
【问题描述】:

我正在开发一个包含两台服务器的项目,一台是用 python 编写的,另一台是用 C 编写的。为了最大限度地提高服务器的容量,我们定义了一个二进制专有协议,通过该协议这两个服务器可以相互通信。

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

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

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


编辑:

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

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

我也不是在寻找一些已经存在的 C 解析器。我问这个问题是因为我正在阅读的一本关于解析器生成器的书启发了我学习如何使用真正的解析器生成器。


再次编辑:

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

然而,并不是每个程序员都能阅读英文文档并愿意尝试新事物,尤其是当他们有丰富的老而简单但有点笨拙的方法的经验时。

【问题讨论】:

  • 所以问题是:(1)推荐一个python解析器生成器来处理C结构定义和(2)给我写代码?只是想弄清楚你想要什么。
  • 请注意,这正是促使 Google 创建协议缓冲区 (code.google.com/p/protobuf) 的用例,它从一开始就有 Python、Java 和 C++ 生成器。我认为现在也有 C 绑定。
  • 我怀疑在 python 中解析二进制格式会“最大化容量”

标签: python parsing


【解决方案1】:

作为一种替代解决方案,它可能从一开始就感觉有点过于雄心勃勃,但从长远来看也可能对您有很好的帮助:

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

【讨论】:

  • 这正是协议缓冲区的作用
【解决方案2】:

我个人会使用 PLY:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      C 结构不太可能移植到足以在机器之间发送。不同的字节序、不同的字长、不同的编译器都会改变结构映射到字节的方式。

      最好使用专为通信设计的可移植的二进制格式。

      【讨论】:

      • 我的同事训练有素,可以编写代码来处理字节序转换、字长填充等。
      • 那么字节序定义的填充定义的二进制格式是你应该编码的。而 C-struct 只是它的一个临时表示。
      猜你喜欢
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多