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

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

sproto比较有趣的一点,是可以自描述,用sproto协议本身描述自己:(摘自云风博客)UPDATED:博客的是错误的,正确的在代码注释里:

.type {
.field {
name : string
buildin : integer
type : integer
tag : integer
array : boolean
key : integer # If key exists, array must be true, and it's a map.
}
name : string
fields : *field
}
.protocol {
name : string
tag : integer
request : integer # index
response : integer # index
}
.group {
type : *type
protocol : *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的更多相关文章

  1. servlet(1) - 手写第一个servlet程序 - 小易Java笔记

    声明:如tomcat的安装目录为D:\Java\tomcat6,下面要根据tomcat的安装目录而定 1. 建立程序的文件结构 ==>找到tomcat的安装目录,在webapps目录下新建一个名 ...

  2. 转换器3:手写PHP转Python编译器,词法部分

    上周写了<ThinkPhp模板转Flask.Django模板> 一时技痒,自然而然地想搞个大家伙,把整个PHP程序转成Python.不比模板,可以用正则匹配偷懒,这次非写一个Php编译器不 ...

  3. 人人都可以写的一个Python可视化小程序,带你走进编程的世界

    当年的PHP号称是最好的编程语言,今天的Python就是最简单的编程语言,一个小小的程序,寥寥几行代码,带你体验一下编程的乐趣. 最简单的编程语言 今天要介绍的小工具是Python环境安装好之后,自带 ...

  4. Neeto-Vue:我为了记笔记,手写了一个为知笔记客户端

    构建自托管的笔记系统 这两年各种笔记系统快速井喷,好像谁都能来掺一脚,app store随便搜索一个关键字就会有一大堆的结果,从老牌的印象笔记,Bear,MWeb,有道云笔记再到新星专注笔记之类,从买 ...

  5. 转换器4:手写PHP转Python编译器,语法解析部分

    写完词法部分,又有很多杂事,周末终于有空来实现伟大的语法解析部分了. 撸完代码之后发现,程序太短了,不算上状态机,才186行(含注释),关键代码不到100行.运行调试过后,发现还行.居然可以解析One ...

  6. KNN手写实践:Python基于数据集整体计算以及排序

    1. 距离计算,不要通过遍历每个样本来计算和指定样本距离,而是通过对于指定样本进行广播(复制)成为一个shape和全局一致后,再进行整体计算,这里的广播 / 复制采用的是tile函数来实现的: 2. ...

  7. ajax简单手写了一个猜拳游戏

    使用ajax简单写一个猜拳游戏 HTML代码 <!DOCTYPE HTML> <html lang="en-US"> <head> <me ...

  8. 『练手』手写一个独立Json算法 JsonHelper

    背景: > 一直使用 Newtonsoft.Json.dll 也算挺稳定的. > 但这个框架也挺闹心的: > 1.影响编译失败:https://www.cnblogs.com/zih ...

  9. 利用SpringBoot+Logback手写一个简单的链路追踪

    目录 一.实现原理 二.代码实战 三.测试 最近线上排查问题时候,发现请求太多导致日志错综复杂,没办法把用户在一次或多次请求的日志关联在一起,所以就利用SpringBoot+Logback手写了一个简 ...

随机推荐

  1. umask

    1. 首先我们来思考umask是什么? umask 是系统设置的权限的默认值,在etc/profile里面的shell 脚本有设置规则. 对于root用户和用户而言,不可以直接用的 需要用减法 比如 ...

  2. shell 转义字符的写法

    在链接中,往往会遇到含有‘&'字符的情形,需要转义方能使用. 以下是它的写法样例,错误的写法勿要再犯!! 链接样例: http://my.example.cn/show/details/htd ...

  3. jquery为什么提倡使用.on绑定,.off移除组合代替.live和.die组合呢?

    .live绑定的是固定的Document的节点,在树形节点中,如果节点较多,层级查询影响效率: .on绑定的是$(selector),可自由改变嵌套层级问题,效率高: 列举两种on可以绑定多个事件的方 ...

  4. JAVA字符串的相关练习

    /*String s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";//生成随机验证码 fo ...

  5. layout内容整理

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  6. SEO学习笔记-误区和经验总结

    原文链接:http://www.cnblogs.com/monxue/p/seo_note.html 常见误区和错误: 1.忽视404错误页面的优化,没有及时处理死链导致权重降低 2.做外链优化只链到 ...

  7. 仓储管理系统500bug记录一下mysql 8小时超时解决办法

    HTTP Status 500 - Request processing failed; nested exception is org.springframework.dao.TransientDa ...

  8. Unity3d获取APK签名及公钥的方法

    在Unity3d项目中获取APK包签名公钥的方法,核心思想就是通过JNI调用Android提供的方法.不过Unity3d提供了比JNI更上一层的类AndroidJavaObject以及继承它的Andr ...

  9. C语言深度学习——第一天

    首先声明一下,在我们写的程序中,会使用到一个头文件# include <head.h> 因为,在linux系统编程的时候,会用到很多头文件,为此,我用一个头文件全部包含在一起,头文件内容如 ...

  10. CodeBlocks配置文件位置

    CodeBlock配置混乱,决定重装时,删除程序后,需将配置文件删除. 配置文件位置:C:\Users\Administrator\AppData\Roaming\CodeBlocks