juggle添加c#版本
此前做过一个c++版的网络层dsl:http://www.cnblogs.com/qianqians/p/4255034.html
现在给这个dsl加入c#的支持,并且对代码的结构做了优化,将语法解析和代码生成做了解耦
语法解析部分
- class func(object):
- def __init__(self):
- self.keyworld = ''
- self.func = []
- self.argvtuple = None
- def clear(self):
- self.keyworld = ''
- self.func = []
- self.argvtuple = None
- def push(self, ch):
- if ch == ' ' or ch == '\0':
- self.keyworld = deleteNoneSpacelstrip(self.keyworld)
- if self.keyworld != '':
- if self.argvtuple is None:
- self.func.append(deleteNoneSpacelstrip(self.keyworld))
- else:
- if self.keyworld in ['table', 'array', 'int', 'string', 'float', 'bool']:
- self.argvtuple.append(deleteNoneSpacelstrip(self.keyworld))
- self.keyworld = ''
- return False
- if ch == ',':
- if self.keyworld != '' and self.keyworld in ['table', 'array', 'int', 'string', 'float', 'bool']:
- self.argvtuple.append(deleteNoneSpacelstrip(self.keyworld))
- self.keyworld = ''
- return False
- if ch == '(':
- self.keyworld = deleteNoneSpacelstrip(self.keyworld)
- if self.keyworld != '':
- self.func.append(deleteNoneSpacelstrip(self.keyworld))
- self.argvtuple = []
- self.keyworld = ''
- return False
- if ch == ')':
- if self.keyworld != '' and self.keyworld in ['table', 'array', 'int', 'string', 'float', 'bool']:
- self.argvtuple.append(deleteNoneSpacelstrip(self.keyworld))
- if self.argvtuple is None:
- self.func.append([])
- else:
- self.func.append(self.argvtuple)
- self.keyworld = ''
- return False
- if ch == ';':
- return True
- self.keyworld += ch
- return False
- class module(object):
- def __init__(self):
- self.keyworld = ''
- self.name = ''
- self.module = []
- self.machine = None
- def push(self, ch):
- if ch == '}':
- self.machine = None
- return True
- if self.machine is not None:
- if self.machine.push(ch):
- self.module.append(self.machine.func)
- self.machine.clear()
- else:
- if ch == '{':
- self.name = deleteNoneSpacelstrip(self.keyworld)
- self.keyworld = ''
- self.machine = func()
- return False
- self.keyworld += ch
- return False
- class statemachine(object):
- def __init__(self):
- self.keyworld = ''
- self.module = {}
- self.machine = None
- def push(self, ch):
- if self.machine is not None:
- if self.machine.push(ch):
- if isinstance(self.machine, module):
- self.module[self.machine.name] = self.machine.module
- self.machine = None
- else:
- if ch == ' ' or ch == '\0':
- if deleteNoneSpacelstrip(self.keyworld) == 'module':
- self.machine = module()
- self.keyworld = ''
- else:
- self.keyworld += ch
- def getmodule(self):
- return self.module
- def syntaxanalysis(self, genfilestr):
- for str in genfilestr:
- for ch in str:
- self.push(ch)
解析采用状态机机制,逐字符读取代码在读取到关键字符则跳转状态,并且保持读取到的关键字。
读取的关键字采用table方式保持
module:[funcinfo, ...]
在代码生成部分,按解析获取的语法table生成module和caller代码,分别是事件的响应和调用端。
- def gencaller(module_name, funcs):
- code = "/*this caller file is codegen by juggle*/\n"
- code += "using System;\n"
- code += "using System.Collections;\n"
- code += "using System.IO;\n"
- code += "using MsgPack;\n"
- code += "using MsgPack.Serialization;\n\n"
- code += "namespace caller\n"
- code += "{\n"
- code += " public class " + module_name + " : Icaller \n"
- code += " {\n"
- code += " public " + module_name + "(Ichannel _ch) : base(_ch)\n"
- code += " {\n"
- code += " module_name = \"" + module_name + "\";\n"
- code += " }\n\n"
- for i in funcs:
- code += " public void " + i[1] + "("
- count = 0
- for item in i[2]:
- code += tools.gentypetocsharp(item) + " argv" + str(count)
- count = count + 1
- if count < len(i[2]):
- code += ","
- code += ")\n"
- code += " {\n"
- code += " ArrayList _argv = new ArrayList();\n"
- for n in range(len(i[2])):
- code += " _argv.Add(argv" + str(n) + ");\n"
- code += " call_module_method(\"" + i[1] + "\", _argv);\n"
- code += " }\n\n"
- code += " }\n"
- code += "}\n"
- return code
- def genmodule(module_name, funcs):
- code = "/*this module file is codegen by juggle*/\n"
- code += "using System;\n"
- code += "using System.Collections;\n\n"
- code += "namespace module\n{\n"
- code += " public class " + module_name + " : Imodule \n {\n"
- code += " public " + module_name + "()\n {\n"
- code += " module_name = \"" + module_name + "\";\n"
- code += " }\n\n"
- for i in funcs:
- code += " public abstract void " + i[1] + "("
- count = 0
- for item in i[2]:
- code += tools.gentypetocsharp(item) + " argv" + str(count)
- count = count + 1
- code += ");\n\n"
- code += " }\n"
- code += "}\n"
- return code
和juggle的上个版本不同,为了简洁的用于开发游戏服务器,这个版本删除了同步调用功能,只保留异步调用,对同步调用感兴趣的 可以阅读darckforce里面的代码:https://github.com/qianqians/darkforce/tree/master/juggle
这个版本的代码地址在:https://github.com/qianqians/abelkhan
我将基于这个版本的juggle开发一个开源的游戏服务器框架,欢迎大家在论坛或博客给我留言提出意见
juggle添加c#版本的更多相关文章
- svn add 添加到版本库
转 svn add-添加到版本库 常用操作1.添加一个文件到工作拷贝:$ svn add foo.c 2.当添加一个目录,svn add缺省的行为方式是递归的:$ svn add testdir 3. ...
- eclipse添加高版本tomcat问题
eclipse添加高版本tomcat会报错,提示无法匹配高版本的容器installation is expected 解决方法: 1.找到tomcat的lib目录下的catalina.jar包,用压缩 ...
- [iOS Xcode8]上传AppStore无法添加构建版本
最近升级到xcode8了,也遇到了一些问题.最近产品需要更新版本,按照以前的流程,我觉得so easy啊,万万没想到啊,这次更新版本差点让我吐血,来来回回不下七次. 首先问题是版本通过xcode上传到 ...
- 3.2. 添加模板版本(Core Data 应用程序实践指南)
为了不像3.1那样崩溃,修改模型之前先创建新的模型版本.添加之后,会生成一个新的xcdatamodel文件,并且跟原来的内容完全一样,这有意思了,但是不要删除原来旧版的模型.旧的模型有助于把原来持久化 ...
- mac sublime切换编辑语言的方法(添加其他版本的python)
在sublime中指定python版本,操作如下: Sublime——tools——build system——new build system 把文件中的内容替换为 { "cmd" ...
- wamp——添加多版本PHP
前言 从下载到部署,手把手教学~ wamp 版本 | 3.0.4 32位 步骤 下载PHP 进入网站https://windows.php.net/download然后选择想要的版本下载 注意点: . ...
- Vs2013中通过Nuget添加不同版本jQuery
vs2013中如果直接更新jQuery则是2X的版本,为了兼容IE浏览器的,一般都是希望使用jQuery1.x版本的jQuery,则可在调出Nuget的控制台,在控制台输入(此例子是下载jQuery ...
- 【添加最新版本的mysql的jdbc连接jar包】java.math.BigInteger cannot be cast to java.lang.Long异常
[问题描述] 从我的电脑把项目拷贝到guo小中的win8电脑,but出现了那个错误,估计他的mysql是最新版本的. [如何下载连接jar包] 链接:https://pan.baidu.com/s/1 ...
- git 忽略已经添加到版本库的文件
第一步: 指令:git rm -r --cached YOUR_PATH YOUR_PATH 即 你的文件,-r 指定了递归所有的子文件夹. 第二步: 修改项目根目录下的 .gitignore 文件, ...
随机推荐
- WARN Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect (org.apache.zookeeper.ClientCnxn)
[2017-05-19 13:32:14,933] INFO Waiting for keeper state SyncConnected (org.I0Itec.zkclient.ZkClient) ...
- SparkMLlib学习分类算法之逻辑回归算法
SparkMLlib学习分类算法之逻辑回归算法 (一),逻辑回归算法的概念(参考网址:http://blog.csdn.net/sinat_33761963/article/details/51693 ...
- JTable常见用法细则+设置某列可编辑+滚动表格
JTable常见用法细则 JTable是Swing编程中很常用的控件,这里总结了一些常用方法以备查阅.欢迎补充,转载请注明作者与出处. 一.创建表格控件的各种方式: 1) 调用无参构造函数. JTa ...
- R语言通过loess去除某个变量对数据的影响
当我们想研究不同sample的某个变量A之间的差异时,往往会因为其它一些变量B对该变量的固有影响,而影响不同sample变量A的比较,这个时候需要对sample变量A进行标准化之后才能进行比较.标 ...
- android 本地数据库sqlite的封装
单机android sqlite数据库的实现,这个数据库可与程序一起生成在安装包中 一.下载sqlite3.exe文件 二.运行 cmd 转到sqlite3.exe 所在目录 运行 sqlite ...
- MSICE界面和功能分析
一.首页 ICE实现的这种界面样式,有可能使用WCF实现的,但是MFC来模仿也是可行的. 包括配置界面,和右下角的细节. 首页的主要功能只有3个,分别为图片拼接.视频拼接和打开拼接文件. 二.输入拼接 ...
- SVN版本控制系统搭建(+结合http服务)
.zise { background: #CCCCFF; color: white; text-align: center } .fense { color: #FFCCCC; text-align: ...
- ios runtime 打印内 内部调用的属性
unsigned int count = 0; // 拷贝出所有的成员变量列表 Ivar *ivars = class_copyIvarList([UITextField class], &c ...
- iOS安全攻防之越狱设备检测
iOS 越狱(iOS Jailbreaking),是用于获取苹果公司便携装置操作系统iOS最高权限的一种技术手段,用户使用这种技术及软件可以获取到 iOS 的最高权限,甚至可能可以进一步解开运营商对手 ...
- javascript基础-表单
图解: 表单只需要知道常用的,其他的了解原理就行.在实际项目中,序列化一般用库(jquery)带的方法.富文本引用组件.