`
summersmile
  • 浏览: 48660 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

如何轻松构建DSL(二)

 
阅读更多

    既然说DSL就如同文字对于人类一样重要,让你的软件能够有自己的DSL绝对是一件很酷的事情,但是在很长一段时间里,开发一个DSL系统不是一个简单的事情,大家的编译原理课程,很多都是过了就过了,而且能够设计和实现一套DSL无疑是让人觉得这觉得是个高级软件工程师才能干的活。

    既然我们要实现这个DSL,那就先来看它是个什么样子,有什么特征。不如这样子看,看输入和输出,先不管中间过程是怎样,大部分DSL都是脚本语言,就是语句直接执行,而不是像编译语言如JAVA,C++那样输出一个可执行程序,所以且先只管脚本语言的情况,那脚本语言的特征是怎样呢,输入是脚本,可能的形式是一行指令也可能是多行指令,反正,都是字符串。对,字符串,然后输出呢,输出就很多种多样了,可能是数值,可能是对系统里数据的更改而不是直接的输出。总而言之,就是对这个软件里的数据产生了影响。

    既然有输入和输出,那中间的黑盒子是怎样呢,它做了什么事情呢?简而言之,字符串首先被解析,成为了AST(abstract synext tree),这样呢,就把无结构的数据,变成了有结构的数据,讲原先只能算长度,连接截取的字符串数据变成了,有上下关系,能单独处理的数据节点树,这个树上的节点,可能是数字,可能是字符串,可能是业务数据对象,总之,成为了可以计算的对象,然后,就可以对数据进行计算了,这是神奇发生的地方,至于怎么计算,就看你的语言怎么设计和业务的需求是怎样了。

分享到:
评论

相关推荐

    Simple-DSL:用Java编写简单的DSL的实用程序

    DSL的其余部分在很大程度上取决于被测系统,但是提供了许多模式,这些模式已被证明可以成功地构建经得起时间考验的DSL。 例子 一个简单的在交易所下订单的测试用例可能看起来像: package ...

    scala-swt-builder:Scala SWT 构建器 DSL

    Scala SWT 构建器 DSL 该项目试图为 SWT GUI 创建 DSL。 版本 该项目正在开发中(尚未准备好使用)。 它目前支持创建大多数 SWT 小部件。 我也想加入事件处理(目前只实现了onSelect )。 安装(SBT 0.13.6+) 在 ...

    awsdsl:用于在AWS上部署和运行应用程序的简单DSL

    就是说,您已经在使用OpsWorks,就可以轻松开始使用AWS DSL。安装目前,我建议使用Bundler安装和管理AWS DSL。 只需将其添加到您的Gemfile中即可使用开发版本gem 'awsdsl' , git : '...

    dsl4xml:通过镜像文档结构的DSL轻松快速地将XML和JSON编组为Java对象

    轻松快速地将XML(和JSON)解组到Java DOM解析倾向于使代码易于读取和编写,但是非常慢,占用大量内存并生成大量垃圾。 SAX和“拉”式解析往往非常快,内存需求显着降低,并且通常产生更少的垃圾,但是可能导致...

    ElasticsearchDSL:查询Elasticsearch的DSL库

    您可以轻松构建任何Elasticsearch查询并将其转换为数组。 如果您需要任何帮助,则是询问ONGR支持问题的首选和推荐方法。 如果您喜欢这个图书馆,请帮我买一杯咖啡来开发它版本矩阵Elasticsearch版本...

    DiagramDSL:方便的DSL构建图

    图DSL 允许您轻松创建图的DSL(现在仅是类图)。语法计划:: = [声明] * STATEMENT::= [CLASSDEC METHODDEC *] + CLASSDEC ::= [class | 抽象类| 界面]? CLASSNAME [RELATION]? 关系::= [扩展CLASSNAME | ...

    mirage:Web DSL和命令行工具,可轻松编写简单的HTTP服务器

    Web DSL轻松创建简单的HTTP服务器 特征 DSL语法:人类可读的语法,让我们更加直观地编写我们需要提供的HTTP服务器。 Data Faker:添加来生成模拟数据,例如名称,地址和电话号码。 开箱即用:简单安装后,无需...

    julia_builder:使用灵活的DSL轻松将查询导出到csv

    Julia可以帮助您创建灵活的构建器,以轻松地将您的查询导出到csv(目前)。 安装 将此行添加到您的应用程序的Gemfile中: gem 'julia_builder' 然后执行: $ bundle 或将其自己安装为: $ gem install julia_...

    bodybuilder:Elasticsearch查询主体构建器

    使用简单,可预测的api轻松构建用于Elasticsearch的复杂查询。文献资料查看以获取详细信息和示例。 使用来测试您的构造。Elasticsearch兼容性当前旨在支持所有版本的完整Elasticsearch查询DSL。 通过调用build函数...

    prolly:用 DSL 来表达和查询代码中的概率

    Prolly 是一种领域特定语言 (DSL),用于在代码中表达概率。 就像数据库具有查询语言 (SQL) 一样,这是一种查询语言,专门用于根据您之前看到的样本回答有关事件概率的问题。 因此,您不必自己计算所有事件,而只需...

    cfhighlander:Cloudformation DSL和组件库

    允许轻松发现和使用不同来源的组件(git存储库,文件系统,S3存储桶) 与指导方法相比,允许组件开发人员和消费者采用使用DSL的更具描述性的方法。 安装 gem install cfhighlander 例子 必须手动完成将输出值从一...

    angularjs-gsTimelines:创建动画 DSL 以使用动画时间线构建复杂的 UX 转换

    设计一个 AngularJS 动画 DSL概括目标是为 AngularJS 开发下一代动画层,具有轻松开发复杂、丰富的用户体验的功能和能力。 基于对现实世界动画设计样本的实验和探索,将衍生出新的动画时间线API 和易于使用的DSL ; ...

    GraphQLicious:具有DSL的快速组件,用于声明GraphQL查询并从中获取字符串表示形式

    GraphQLicious GraphQLicious是一个快速组件,它提供了一种直观且方便的方法来构建GraphQL查询并将其轻松转换为String表示形式。 [![iOS 8]( )]()内容安装迦太基GraphQLicious支持Carthage。 要安装它,只需将...

    easy_search:提供了一个很好且简单的 DSL 来搜索 ActiveRecord 模型

    因为为一件简单的事情构建DSL接口很有趣。 这实际上很有趣。 另外,我认为这是开始创建更大的东西的一个合理的地方。 总的来说,这个插件或多或少是我玩弄 Ruby 活力的结果:-) 安装 您可以将其安装为 Rails 插件。 ...

    dagr:基于Scala的DSL和框架,用于将生物信息学管道作为有向非循环GRaph进行编写和执行

    轻松将管道组合成更大的管道 提供安全且一致的方式来在执行期间动态更改图形 向管道作者提供scala的全部功能和表达能力 在单个机器/实例的约束下并发高效地执行任务 它是工作数据科学家,程序员和生物信息学家的工具...

    rumrunner:基于Rake的实用程序,用于构建多阶段Dockerfile

    rum可执行文件使用户可以轻松地调用构建,将外壳装入特定的调试阶段以及从构建的容器中导出工件。 Rum Runner具有以下功能: 与Rake完全兼容 类似于Rake的DSL / CLI,可对构建进行简单注释和执行 Rumfiles是完全...

    poncho, 轻松创建 REST api.zip

    poncho, 轻松创建 REST api 披风Poncho是构建API的API,换句话说,就是一个构建REST接口的DSL 。它将验证输入和输出,强制值,并且易于扩展自定义数据类型。它与任何基于机架的框架兼容,如 Rails 或者 Sinatra 。...

    什么是gradle,及其的作用.md

    它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,也增加了基于Kotlin语言的kotlin-based DSL,抛弃了基于XML的各种繁琐配置,主要面向Java应用。然而,Gradle并不局限于Java,当前其支持的语言还包括C++...

    rubydns:用于构建有趣的高性能DNS服务器的DSL

    RubyDNS是一种高性能DNS服务器,可以轻松集成到其他项目中或用作独立的守护程序。 默认情况下,它使用基于规则的模式匹配。 可以根据需要对结果进行硬编码,计算,从远程DNS服务器获取或从本地缓存获取。 安装 将...

    deuterium:用于Rust的全类型SQL查询构建器[不建议使用]

    它旨在提供DSL,从而以安全和类型化的方式轻松构建SQL查询。 与Rust一样,氘仍处于开发的早期阶段,因此,如果API发生更改并且出现问题,请不要感到惊讶。 如果有任何问题,请提出问题或提交拉取请求! # Cargo....

Global site tag (gtag.js) - Google Analytics