领域特定语言
查看您的阅读历史
- 类别:
- 基础信息化
- 全书共57章,分为六个部分:第一部分介绍了什么是DSL,DSL的用途,如何实现外部DS和内部DSL,如何生成代码,语言工作台的使用方法;第二部分介绍了各种DSL,分别讲述了语义模型、符号表、语境变量、构造型生成器、宏和通知的工作原理和使用场景;第三部分分别揭示分隔符指导翻译、语法指导翻译、BNF、易于正则表达式表的词法分析器、递归下降法词法分析器、解析器组合子、解析器生成器、树的构建、嵌入式语法翻译、内嵌解释器、外加代码等;第四部分介绍了表达式生成器、函数序列、嵌套函数、方法级联、对象范围、闭包、嵌套闭包、标注、解析数操作、类符号表、文本润色、字面量扩展的工作原理和使用场景;第五部分介绍了适应性模型、决策表、依赖网络、产生式规则系统、状态机等计算模型的工作原理和使用场景;第六部分介绍了基于转换器的代码生成、模板化的生成器、嵌入助手、基于模型的代码生成、无视模型的代码生成和代沟等内容。
1第1章 入门例子
落笔之初,我需要快速地解释一下本书的内容,就是解释什么是领域特定语言(Domain–Specific Language,DSL)。为达此目的,我一般都会先展示一个具体的例子,随后再给出抽象的定义。因此,我会从一个例子开始,展示DSL可以采用的不同形式。
2第2章 使用DSL
看过上一章的例子后,即便尚未给出DSL的一般定义,对于何为DSL,你也应该已经有了自己的认识。(第10章中有更多例子。)现在,要开始讨论DSL的定义及其优势与问题。这样就可以为下一章讨论DSL实现提供一些上下文。
3第3章 实现DSL
至此,对于什么是DSL,以及为何要用DSL,我们已经透彻理解。如果要开始构建DSL,那么现在该深入研究所用的技术了。虽然构建内部DSL和外部DSL所用的技术有所不同,但它们还是有一些共通之处的。本章主要关注内部DSL和外部DSL的一些共通问题,而下一章再讨论各自具体的问题。
4第4章 实现内部DSL
- 第一节 4.1连贯API与命令–查询
- 第二节 4.2解析层的需求
- 第三节 4.3使用函数
- 第四节 4.4字面量集合
- 第五节 4.5基于文法选择内部元素
- 第六节 4.6闭包
- 第七节 4.7解析树操作
- 第八节 4.8标注
- 第九节 4.9为字面量提供扩展
- 第一十零节 4.10消除语法噪音
- 第一十一节 4.11动态接收
- 第一十二节 4.12提供类型检查
5第5章 实现外部DSL
- 第一节 5.1语法分析策略
- 第二节 5.2输出生成策略
- 第三节 5.3解析中的概念
- 第四节 5.4混入另一种语言
- 第五节 5.5XML DSL
6第6章 内部DSL vs 外部DSL
- 第一节 6.1学习曲线
- 第二节 6.2创建成本
- 第三节 6.3程序员的熟悉度
- 第四节 6.4与领域专家沟通
- 第五节 6.5与宿主语言混合
- 第六节 6.6强边界
- 第七节 6.7运行时配置
- 第八节 6.8趋于平庸
- 第九节 6.9组合多种
- 第一十零节 6.10总结
7第7章 其他计算模型概述
- 第一节 7.1几种计算模型
8第8章 代码生成
- 第一节 8.1选择生成什么
- 第二节 8.2如何生成
- 第三节 8.3混合生成代码和手写代码
- 第四节 8.4生成可读的代码
- 第五节 8.5解析之前的代码生成
- 第六节 8.6延伸阅读
9第9章 语言工作台
- 第一节 9.1语言工作台之要素
- 第二节 9.2模式定义语言和元模型
- 第三节 9.3源码编辑和投射编辑
- 第四节 9.4说明性编程
- 第五节 9.5工具之旅
- 第六节 9.6语言工作台和CASE工具
- 第七节 9.7我们该使用语言工作台吗
10第10章 各种DSL
- 第一节 10.1Graphviz
- 第二节 10.2JMock
- 第三节 10.3CSS
- 第四节 10.4HQL
- 第五节 10.5XAML
- 第六节 10.6FIT
- 第七节 10.7Make等
11第11章 语义模型
- 第一节 11.1工作原理
- 第二节 11.2使用场景
- 第三节 11.3入门例子(Java)
12第12章 符号表
- 第一节 12.1工作原理
- 第二节 12.2使用场景
- 第三节 12.3参考文献
- 第四节 12.4以外部DSL实现的依赖网络(Java和ANTLR)
- 第五节 12.5在一个内部DSL中使用符号键(Ruby)
- 第六节 12.6用枚举作为静态类型符号(Java)
13第13章 语境变量
- 第一节 13.1工作原理
- 第二节 13.2使用场景
- 第三节 13.3读取INI文件(C#)
14第14章 构造型生成器
- 第一节 14.1工作原理
- 第二节 14.2使用场景
- 第三节 14.3构建简单的航班信息
15第15章 宏
- 第一节 15.1工作原理
- 第二节 15.2使用场景
16第16章 通知
- 第一节 16.1工作原理
- 第二节 16.2使用场景
- 第三节 16.3一个非常简单的通知(C#)
- 第四节 16.4解析中的通知(Java)
17第17章 分隔符指导翻译
- 第一节 17.1工作原理
- 第二节 17.2使用场景
- 第三节 17.3常客记分(C#)
- 第四节 17.4使用格兰特小姐的控制器解析非自治语句(Java)
18第18章 语法指导翻译
- 第一节 18.1工作原理
- 第二节 18.2使用场景
- 第三节 18.3参考文献
19第19章 BNF
- 第一节 19.1工作原理
- 第二节 19.2使用场景
20第20章 基于正则表达式表的词法分析器
- 第一节 20.1工作原理
- 第二节 20.2使用场景
- 第三节 20.3格兰特小姐控制器的词法处理(Java)
21第21章 递归下降法语法解析器
- 第一节 21.1工作原理
- 第二节 21.2使用场景
- 第三节 21.3参考文献
- 第四节 21.4递归下降和格兰特小姐的控制器(Java)
22第22章 解析器组合子
- 第一节 22.1工作原理
- 第二节 22.2使用场景
- 第三节 22.3解析器组合子和格兰特小姐的控制器(Java)
23第23章 解析器生成器
- 第一节 23.1工作原理
- 第二节 23.2使用场景
- 第三节 23.3Hello World(Java和ANTLR)
24第24章 树的构建
- 第一节 24.1工作原理
- 第二节 24.2使用场景
- 第三节 24.3使用ANTLR的树构建语法(Java和ANTLR)
- 第四节 24.4使用代码动作进行树的构建(Java和ANTLR)
25第25章 嵌入式语法翻译
- 第一节 25.1工作原理
- 第二节 25.2使用场景
- 第三节 25.3格兰特小姐的控制器(Java和ANTLR)
26第26章 内嵌解释器
- 第一节 26.1工作原理
- 第二节 26.2使用场景
- 第三节 26.3计算器(ANTLR和Java)
27第27章 外加代码
- 第一节 27.1工作原理
- 第二节 27.2使用场景
- 第三节 27.3嵌入动态代码(ANTLR、Java和JavaScript)
28第28章 可变分词方式
- 第一节 28.1工作原理
- 第二节 28.2使用场景
29第29章 嵌套的运算符表达式
- 第一节 29.1工作原理
- 第二节 29.2使用场景
30第30章 以换行符作为分隔符
- 第一节 30.1工作原理
- 第二节 30.2使用场景
31第31章 外部DSL拾遗
- 第一节 31.1语法缩进
- 第二节 31.2模块化文法
32第32章 表达式生成器
- 第一节 32.1工作原理
- 第二节 32.2使用场景
- 第三节 32.3具有和没有生成器的连贯日历(Java)
- 第四节 32.4对于日历使用多个生成器(Java)
33第33 章函数序列
- 第一节 33.1工作原理
- 第二节 33.2使用场景
- 第三节 33.3简单的计算机配置(Java)
34第34章 嵌套函数
- 第一节 34.1工作原理
- 第二节 34.2使用场景
- 第三节 34.3简单计算机配置范例(Java)
- 第四节 34.4用标记处理多个不同的参数(C#)
- 第五节 34.5针对IDE支持使用子类型标记(Java)
- 第六节 34.6使用对象初始化器(C#)
- 第七节 34.7周期性事件(C#)
35第35章 方法级联
- 第一节 35.1工作原理
- 第二节 35.2使用场景
- 第三节 35.3简单的计算机配置范例(Java)
- 第四节 35.4带有属性的方法级联(C#)
- 第五节 35.5渐进式接口(C#)
36第36章 对象范围
- 第一节 36.1工作原理
- 第二节 36.2使用场景
- 第三节 36.3安全代码(C#)
- 第四节 36.4使用实例求值(Ruby)
- 第五节 36.5使用实例初始化器(Java)
37第37章 闭包
- 第一节 37.1工作原理
- 第二节 37.2使用场景
38第38章 嵌套闭包
- 第一节 38.1工作原理
- 第二节 38.2使用场景
- 第三节 38.3用嵌套闭包来包装函数序列(Ruby)
- 第四节 38.4简单的C#示例(C#)
- 第五节 38.5使用方法级联(Ruby)
- 第六节 38.6带显式闭包参数的函数序列(Ruby)
- 第七节 38.7采用实例级求值(Ruby)
39第39章 列表的字面构造
- 第一节 39.1工作原理
- 第二节 39.2使用场景
40第40章 Literal Map
- 第一节 40.1工作原理
- 第二节 40.2使用场景
- 第三节 40.3使用List和Map表达计算机的配置信息(Ruby)
- 第四节 40.4演化为Greenspun式(Ruby)
41第41章 动态接收
- 第一节 41.1工作原理
- 第二节 41.2使用场景
- 第三节 41.3积分——使用方法名解析(Ruby)
- 第四节 41.4积分——使用方法级联(Ruby)
- 第五节 41.5去掉安全仪表盘控制器中的引用(JRuby)
42第42章 标注
- 第一节 42.1工作原理
- 第二节 42.2使用场景
- 第三节 42.3用于运行时处理的特定语法(Java)
- 第四节 42.4使用类方法(Ruby)
- 第五节 42.5动态代码生成(Ruby)
43第43章 解析树操作
- 第一节 43.1工作原理
- 第二节 43.2使用场景
- 第三节 43.3由C#条件生成IMAP查询(C#)
44第44章 类符号表
- 第一节 44.1 工作原理
- 第二节 44.2使用场景
- 第三节 44.3在静态类型中实现类符号表(Java)
45第45章 文本润色
- 第一节 45.1工作原理
- 第二节 45.2使用场景
- 第三节 45.3使用润色的折扣规则(Ruby)
46第46章 为字面量提供扩展
- 第一节 46.1工作原理
- 第二节 46.2使用场景
- 第三节 46.3食谱配料(C#)
47第47章 适应性模型
- 第一节 47.1工作原理
- 第二节 47.2使用场景
48第48章 决策表
- 第一节 48.1工作原理
- 第二节 48.2使用场景
- 第三节 48.3为一个订单计算费用(C#)
49第49章 依赖网络
- 第一节 49.1工作原理
- 第二节 49.2使用场景
- 第三节 49.3分析饮料(C#)
50第50章 产生式规则系统
- 第一节 50.1工作原理
- 第二节 50.2使用场景
- 第三节 50.3俱乐部会员校验(C#)
- 第四节 50.4适任资格的规则:扩展俱乐部成员(C#)
51第51章 状态机
- 第一节 51.1工作原理
- 第二节 51.2使用场景
- 第三节 51.3安全面板控制器(Java)
52第52章 基于转换器的代码生成
- 第一节 52.1工作原理
- 第二节 52.2使用场景
- 第三节 52.3安全面板控制器(Java生成的C)
53第53章 模板化的生成器
- 第一节 53.1工作原理
- 第二节 53.2使用场景
- 第三节 53.3生成带有嵌套条件的安全控制面板状态机(Velocity和Java生成的C)
54第54章 嵌入助手
- 第一节 54.1工作原理
- 第二节 54.2使用场景
- 第三节 54.3安全控制面板的状态(Java和ANTLR)
- 第四节 54.4助手类应该生成HTML吗(Java和Velocity)
55第55章 基于模型的代码生成
- 第一节 55.1工作原理
- 第二节 55.2使用场景
- 第三节 55.3安全控制面板的状态机(C)
- 第四节 55.4动态载入状态机(C)
56第56章 无视模型的代码生成
- 第一节 56.1工作原理
- 第二节 56.2使用场景
- 第三节 56.3使用嵌套条件的安全面板状态机(C)
57第57章 代沟
- 第一节 57.1工作原理
- 第二节 57.2使用场景
- 第三节 57.3根据数据结构生成类(Java和一些Ruby)