码迷,mamicode.com
首页 > 编程语言 > 详细

为sproto手写了一个python parser

时间:2015-12-13 23:21:26      阅读:402      评论:0      收藏:0      [点我收藏+]

标签:

这是sproto系列文章的第三篇,可以参考前面的《为sproto添加python绑定》、《为python-sproto添加map支持》。

sproto是云风设计的序列化协议,用于高效的打包解包游戏协议数据。有点类似Google推出的protobuf,但是比protobuf要快。结构上有点类似cap‘n Proto,但是没有打算直接使用其作为内存组织结构,因此少了数据对齐的部分。目前使用场景主要是在游戏客户端和服务器端的RPC协议上。

 

sproto比较有趣的一点,是可以自描述,用sproto协议本身描述自己:(摘自云风博客)

.type {
    .field {
        name 0 : string
        type 1 : string
        id 2 : integer
        array 3 : boolean
    }
    name 0 : string
    fields 1 : *field
}

.protocol {
    name 0 : string
    id 1 : integer
    request 2 : string
    response 3 : string
}

.group {
    type 0 : *type
    protocol 1 : *protocol
}

 

这么简单的结构,正好拿来练手写parser。Lua的LPEG库实在太强大,于是先试了一下pypeg2去解决这个问题。尝试的过程参见:https://github.com/spin6lock/sproto_python_parser,最后失败了。回想了一下,PEG文法其实跟上下文无关文法相当类似,只是不存在二义性,能够通过一个token来完全决定接下来的解析树。这个跟递归下降法有点类似了,便顺手撸了一发:https://github.com/spin6lock/yapsp

 

代码主要分成两部分,lexer和parser。lexer辨别的token可以参见常量定义,基本上用正则表达式搞定了,只花了一点点时间。Parser多花了好一段,主要是忘了要封装一些方便的函数出来使用,比如expecting和optional。Parser实现的是一个基于递归下降法的语法分析器,由于sproto的语法特别简单,所以可以透过窥视下一个token,便知晓接下来要解析的是什么结构,然后调用相应的方法解析即可。

为sproto手写了一个python parser

标签:

原文地址:http://www.cnblogs.com/Lifehacker/p/python_sproto_parser.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!