[Node.js] DSL in action
原文地址:http://www.moye.me/2015/05/30/dsl-in-action/
最近看了本有意思的书,受到了一些启发,在此记录一下:
DSLs in action

DSL是什么
即 domain-specific language ,是指和业务域模型相关的语言,粗糙的说法:行(业黑)话。关于什么是DSL,见仁见智,比如我认为SQL是一种DSL,有人却认为不是。
用途
对于“然并卵”一族来说,世界上大多数事情对他们来说都没什么用,DSL也不例外;于我而言,用DSL的一套理论能实现一个查询JSON对象的库,类SQL的语法,几百行就能搞定,使用起来像是这样的:
var result = Query(dataSource, '*.name, *.sex where who.sex=MALE && who.name=CRAP');
dataSource是类似这样的数据源:
var dataSource = {
'1': {
who: {name: 'CRAP', sex: 'MALE'}
},
'2': {
who: {name: 'HOLY', sex: 'FEMALE'}
},
'3': {
who: {name: 'WEIRD', sex: 'FEMALE'}
}
};
怎么做
书中提到了LR,我确信自己没有理解这个概念,但是受到了启发,决定用它提到的Bottom-up(自底向上)的方式试试。所以我的DSL大概分两部分:
- 生成AST(抽象句法树
- 按优先级(括号)从低到高提取分组,暂存到分组数据
- 按(与/或)逻辑门分组支干,生成语法树AST
- 由顶向下遍历AST,对之前暂存的分组进行还原替换
- 对AST每一级的条件表达式进行解析并原地产生表达式对象
- 使用AST
- 对数据源进行遍历:根据AST树,进行与或逻辑及条件表达式的解析筛选
- 只返回查询语句指定的字段

实现
基于如上思路,我用Javascript实现了这个简单的DSL,它能使用SQL的语法查询JSON对象,希望能为您提供一些方便。
更多文章请移步我的blog新地址: http://www.moye.me/
[Node.js] DSL in action的更多相关文章
- Node.js NPM Tutorial: Create, Publish, Extend & Manage
A module in Node.js is a logical encapsulation of code in a single unit. It's always a good programm ...
- 《Node.js In Action》笔记之流程控制
转向Javascript后,开始学习了node.js,选择的第一本书是<Node.js in Action> 将近一个月时间,断断续续看完,选几个点做下笔记 1.实现串行化流程控制 var ...
- 【win7下安装node.js错误:roling back action】与【"grunt" 不是内部或外部命令】 解决方法
[win7下安装node.js错误:roling back action] 解决方法: Node.js 服务器端的JavaScript Node.js 是一个基于Chrome JavaScript 运 ...
- Node.js高级编程读书笔记 - 4 构建Web应用程序
Outline 5 构建Web应用程序 5.1 构建和使用HTTP中间件 5.2 用Express.js创建Web应用程序 5.3 使用Socket.IO创建通用的实时Web应用程序 5 构建Web应 ...
- Node.js之网游服务器实践
此文已由作者尧飘海授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 随着Node.js的不断发展与壮大,应用范围也越来越广泛,从传统的企业应用,到互联网使用,再到云计算的发展, ...
- Node.js学习笔记——Node.js开发Web后台服务
一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...
- 使用Node.js+Socket.IO搭建WebSocket实时应用
Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. W ...
- (翻译)《Hands-on Node.js》—— Introduction
今天开始会和大熊君{{bb}}一起着手翻译node的系列外文书籍,大熊负责翻译<Node.js IN ACTION>一书,而我暂时负责翻译这本<Hands-on Node.js> ...
- Node.js、express、mongodb 入门(基于easyui datagrid增删改查)
前言 从在本机(win8.1)环境安装相关环境到做完这个demo大概不到两周时间,刚开始只是在本机安装环境并没有敲个Demo,从周末开始断断续续的想写一个,按照惯性思维就写一个增删改查吧,一方面是体验 ...
随机推荐
- android wifi SWOL低功耗模式
1 睡眠模式RX代码流程 ar_wal_rx_patch.c::patch_rx_process_recv_status//调用rx_ctxt->data_ind_handler -> d ...
- HashSet和HapMap取distinct value
public class TestHashSetAndHashMap { private final int setNum=5000; @Test public void doTest(){ List ...
- highcharts 当Y轴全部没有数据的时候 数据标签显示最下面 而不是居中显示
yAxis: {min: 0,minRange: 1}
- 关于公司内部的Nuget服务
简介 公司内部搭建的Nuget服务,私有安全,局域网,速度快. 使用方法 VS -> 工具 -> 库程序包管理器 -> 程序包管理器设置 -> 程序包源 -> 新增以下配 ...
- Java虚拟机10:类加载器
类与类加载器 虚拟机设计团队把类加载阶段张的"通过一个类的全限定名来获取此类的二进制字节流"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这 ...
- Newtonsoft.Json中的时间格式详解.
Newtonsoft.json是一款不错的序列化反序列化第三方组件,具体如何使用属于基础知识,此处不再讲解.看以下代码: public class OutgameEntity { public str ...
- 实现tip浮层
实现简单的tip浮层: html代码: <!doctype html> <html> <head> <meta charset="utf-8&quo ...
- 虚拟化平台cloudstack(7)——新版本的调试
调试环境 ubuntu 12.04 JDK1.7 apache-maven-3.10 eclipse 4.2 Juno mysql 5 源码下载及调试 上面的几个软件在上一篇中已经介绍了. 在新的版本 ...
- .NetCore~框架版本号不同引起dotnet不能run它
对于.netCore来说,今年已经推出了正式版,这要求使用vs2015的开发者需要升级到beta3版,而如果使用老版VS开始的.netCore应用程序,它的架构版本将为是测试版"versio ...
- Lua字符串库(整理)
Lua字符串库小集 1. 基础字符串函数: 字符串库中有一些函数非常简单,如: 1). string.len(s) 返回字符串s的长度: 2). string.rep(s,n) 返回 ...