zoukankan      html  css  js  c++  java
  • [Node.js] DSL in action

    原文地址:http://www.moye.me/2015/05/30/dsl-in-action/

    最近看了本有意思的书,受到了一些启发,在此记录一下:

    DSLs in action

    DSL 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大概分两部分:

    1. 生成AST(抽象句法树
      1. 按优先级(括号)从低到高提取分组,暂存到分组数据
      2. 按(与/或)逻辑门分组支干,生成语法树AST
      3. 由顶向下遍历AST,对之前暂存的分组进行还原替换
      4. 对AST每一级的条件表达式进行解析并原地产生表达式对象
    2. 使用AST
      1. 对数据源进行遍历:根据AST树,进行与或逻辑及条件表达式的解析筛选
      2.  只返回查询语句指定的字段
    DSL in action
     

    实现

    基于如上思路,我用Javascript实现了这个简单的DSL,它能使用SQL的语法查询JSON对象,希望能为您提供一些方便。

    更多文章请移步我的blog新地址: http://www.moye.me/ 

  • 相关阅读:
    inetinfo
    常用的IIS命令
    asp.net
    WAS与w3svc
    服务和进程的关系
    w3svc
    link
    RAC动态资源(DRM)管理介绍
    RMAN内部原理介绍
    在32位的linux平台上为Oracle配置>1.7GB的SGA
  • 原文地址:https://www.cnblogs.com/moye/p/dsl_in_action.html
Copyright © 2011-2022 走看看