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开发一个开源的游戏服务器框架,欢迎大家在论坛或博客给我留言提出意见

时间: 2024-12-16 07:53:18

juggle添加c#版本的相关文章

Vs2013中通过Nuget添加不同版本jQuery

vs2013中如果直接更新jQuery则是2X的版本,为了兼容IE浏览器的,一般都是希望使用jQuery1.x版本的jQuery,则可在调出Nuget的控制台,在控制台输入(此例子是下载jQuery 1.11.0): Install-Package jQuery -Version 1.11.0   Vs2013中通过Nuget添加不同版本jQuery,布布扣,bubuko.com

如何为自己的博客文章自动添加移动版本(目前仅支持博客园)

前言 从2005年开始撰写第一篇技术博客,我也算是国内最早的一批技术博客作者之一了.其中中断过一段时间,但2008年重新启用之后,这个习惯一直保留到现在,目前已经累积的文章数量已经达到1226篇.这些文章绝大部分都是原创的,转载的有特别注明,文章内容大多是自己实际工作中遇到的问题和解决方案,或者我为企业做顾问服务.培训服务时解决的问题,我尤其喜欢在解决问题后做一点总结,并整理成一篇博客文章分享出来,一来是对思路的重新梳理,同时也希望也许日后能对其他人也有所帮助. 这些年随着移动互联网逐渐占据主流

svn add 添加到版本库

转 svn add-添加到版本库 add: 把文件和目录纳入版本控制,通过调度加到版本库.它们会在下一次提交时加入. 用法: add 路径... 有效选项: --targets ARG : 传递文件 ARG 内容为附件参数 -N [--non-recursive] : 过时:尝试 --depth=files 或 --depth=immediates --depth ARG : 受深度参数 ARG(“empty”,“files”,“immediates”,或“infinity”) 约束的操作 -q

Qt Creator 添加arm版本的qmake时的问题

  好吧,吐血搞了三天,终于把这个问题解决了,菜鸟上不起呀! 问题:当QT Creator安装好后,它的qmake只能生产在X86下的Makefile,这方便我们在电脑上调试,看效果.但当我们需要将编译好的QT程序下载到开发板上运行时,这个生成的目标文件是无法在板子上执行的,因此我们需要添加arm版本的qmake,但当我用FriendlyARM提供的 target-qte-4.8.5-to-hostpc.tgz  解压到根目录下时,得到的qmake居然不是X86下可执行的程序(这应该是arm架构

3.2. 添加模板版本(Core Data 应用程序实践指南)

为了不像3.1那样崩溃,修改模型之前先创建新的模型版本.添加之后,会生成一个新的xcdatamodel文件,并且跟原来的内容完全一样,这有意思了,但是不要删除原来旧版的模型.旧的模型有助于把原来持久化存储区迁移到当前的模型版本. 修改程序: 选中Model.xcdatamodeld 点击Editor > Add Model Version... 点击Finish,默认将Model 2用作版本名称 如图: 注意,我们要修改新的模板,慢慢进入正题了: 注意备份程序 选择Model 2.xcdatam

mac sublime切换编辑语言的方法(添加其他版本的python)

在sublime中指定python版本,操作如下: Sublime--tools--build system--new build system 把文件中的内容替换为 { "cmd": ["/usr/local/bin/python3", "-u", "$file"], "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)&qu

k8s的 Job/CronJob资源对象及添加api版本

Job资源对象 服务类的Pod容器:RC.RS.DS.Deployment 工作类的Pod容器:Job--->执行一次,或者批量执行处理程序,完成之后退出容器. 注意: 如果容器内执行任务有误,会根据容器的重启策略操作容器,不过这里的容器重启策略只能是: Never和 OnFailure. 概念 在有些场景下,是想要运行一些容器执行某种特定的任务,任务一旦执行完成,容器也就没有存在的必要了.在这种场景下,创建pod就显得不那么合适.于是就是了Job,Job指的就是那些一次性任务.通过Job运行一

git 忽略已经添加到版本库的文件

第一步: 指令:git rm -r --cached YOUR_PATH YOUR_PATH 即 你的文件,-r 指定了递归所有的子文件夹. 第二步: 修改项目根目录下的 .gitignore 文件,回车一个空行,写上忽略的目录或路径 指令: vi .gitignore 第三步: 提交 : git commit

Git学习笔记(一)创建版本库并添加文件

最近从廖雪峰老师的个人网站上学习git,做点笔记. ★★★★★ 先注册自己的username和email,否则会报如下错误: 注册:git config --global user.name "XXX"    -------这是注册username git config --global  user.email "[email protected]"   -------这是注册email git config  --list    -------这是查看config