如何选择合适的Python解析器生成器来解析C结构定义?
我正在做一个项目,这个项目有两个服务器,一个是用Python写的,另一个是用C语言写的。为了让这两个服务器能够高效地沟通,我们定义了一种二进制的专有协议。
这个协议的定义在一个C语言的头文件里,使用了C语言的结构体。通常情况下,我会用VIM这个编辑器来做一些替换,把这个文件转换成Python代码。但是每次协议修改后,我都得手动去做这个转换,实在是太麻烦了。
所以,我觉得写一个可以解析C头文件的解析器会更好。不过,市面上至少有十几种Python解析器生成器,我不知道哪一个更适合我的需求。
有没有什么建议呢?非常感谢。
编辑:
当然,我不是让任何人帮我写代码……
代码其实已经完成了。我把头文件转换成了Python代码,这样就可以构建一个Python库,能够解析二进制数据并识别它。
我也不是在寻找一些已经存在的C解析器。我提这个问题是因为我在看一本书,书里提到了一些关于解析器生成器的内容,激发了我想学习如何使用真正的解析器生成器。
再次编辑:
在我们设计这个系统的时候,我建议使用Google协议缓冲区、ZeroC ICE,或者其他多语言的网络编程中间件,这样就可以省去实现协议的麻烦。
不过,并不是每个程序员都能读懂英文文档,也不愿意尝试新东西,尤其是当他们已经习惯用老旧而简单但有点笨拙的方式来做事情时。
4 个回答
如果我是你,我会用IDL作为结构定义语言。用C语言的结构体会遇到一个主要问题,那就是C语言有指针,特别是用来处理字符串的char*。使用IDL可以限制数据类型,并且给数据定义一些规则。
这样你就可以随心所欲地做其他事情了。大多数解析器生成器都会把IDL作为示例语法。
我个人会选择使用 PLY:
而且已经有一个用 PLY 写的 C 语言解析器:
有一个可能一开始看起来有点过于雄心勃勃的替代方案,但从长远来看可能会对你非常有帮助,具体是:
- 用一种更高级的语言重新定义协议,比如自定义的XML格式。
- 从同一个源文件生成C语言的结构定义和所需的Python版本。