《领域特定语言》PDF下载

  • 购买积分:15 如何计算积分?
  • 作  者:(英)MartinFowler著;ThoughtWorks中国译
  • 出 版 社:北京:机械工业出版社
  • 出版年份:2013
  • ISBN:9787111413059
  • 页数:464 页
图书介绍:本书全面介绍各种DSL以及它们的构造方式,揭示一些与编程语言无关的通用原则和模式。本书共分六部分,第一部分介绍了什么是DSL,DSL的用途,如何实现外部DS和内部DSL,如何生成代码,语言工作台的使用方法。第二部分介绍了各种DSL,分别讲述了语义模型、符号表、语境变量和通知的工作原理和使用场景;第三部分分别揭示分隔符指导翻译、语法指导翻译、BNF、解析器组合子等;第四部分介绍了表达式生成器、函数序列、嵌套函数、方法级联、对象范围、闭包的工作原理和使用场景;第五部分介绍了适应性模型、决策表、依赖网络等计算模型的工作原理和使用场景;第六部分介绍了基于转换器的代码生成、模板化的生成器、嵌入助手和代沟等内容。

第一部分 叙述 2

第1章 入门例子 2

1.1 哥特式建筑安全系统 2

1.2 状态机模型 4

1.3 为格兰特小姐的控制器编写程序 7

1.4 语言和语义模型 13

1.5 使用代码生成 15

1.6 使用语言工作台 17

1.7 可视化 20

第2章 使用DSL 21

2.1 定义DSL 21

2.1.1 DSL的边界 22

2.1.2 片段DSL和独立DSL 25

2.2 为何需要DSL 25

2.2.1 提高开发效率 26

2.2.2 与领域专家的沟通 26

2.2.3 执行环境的改变 27

2.2.4 其他计算模型 28

2.3 DSL的问题 28

2.3.1 语言噪音 29

2.3.2 构建成本 29

2.3.3 集中营语言 30

2.3.4 “一叶障目”的抽象 30

2.4 广义的语言处理 31

2.5 DSL的生命周期 31

2.6 设计优良的DSL从何而来 32

第3章 实现DSL 34

3.1 DSL处理之架构 34

3.2 解析器的工作方式 37

3.3 文法、语法和语义 39

3.4 解析中的数据 39

3.5 宏 41

3.6 测试DSL 42

3.6.1 语义模型的测试 42

3.6.2 解析器的测试 45

3.6.3 脚本的测试 49

3.7 错误处理 50

3.8 DSL迁移 51

第4章 实现内部DSL 54

4.1 连贯API与命令-查询API 54

4.2 解析层的需求 57

4.3 使用函数 58

4.4 字面量集合 61

4.5 基于文法选择内部元素 63

4.6 闭包 64

4.7 解析树操作 66

4.8 标注 67

4.9 为字面量提供扩展 69

4.10 消除语法噪音 69

4.11 动态接收 69

4.12 提供类型检查 70

第5章 实现外部DSL 72

5.1 语法分析策略 72

5.2 输出生成策略 74

5.3 解析中的概念 76

5.3.1 单独的词法分析 76

5.3.2 文法和语言 77

5.3.3 正则文法、上下文无关文法和上下文相关文法 77

5.3.4 自顶向下解析和自底向上解析 79

5.4 混入另一种语言 81

5.5 XML DSL 82

第6章 内部DSL vs外部DSL 84

6.1 学习曲线 84

6.2 创建成本 85

6.3 程序员的熟悉度 85

6.4 与领域专家沟通 86

6.5 与宿主语言混合 86

6.6 强边界 87

6.7 运行时配置 87

6.8 趋于平庸 88

6.9 组合多种DSL 88

6.10 总结 89

第7章 其他计算模型概述 90

7.1 几种计算模型 92

7.1.1 决策表 92

7.1.2 产生式规则系统 93

7.1.3 状态机 94

7.1.4 依赖网络 95

7.1.5 选择模型 95

第8章 代码生成 96

8.1 选择生成什么 96

8.2 如何生成 99

8.3 混合生成代码和手写代码 100

8.4 生成可读的代码 101

8.5 解析之前的代码生成 101

8.6 延伸阅读 101

第9章 语言工作台 102

9.1 语言工作台之要素 102

9.2 模式定义语言和元模型 103

9.3 源码编辑和投射编辑 107

9.4 说明性编程 109

9.5 工具之旅 110

9.6 语言工作台和CASE工具 112

9.7 我们该使用语言工作台吗 112

第二部分 通用主题 116

第10章 各种DSL 116

10.1 Graphviz 116

10.2 JMock 117

10.3 CSS 118

10.4 HQL 119

10.5 XAML 120

10.6 FIT 122

10.7 Make等 123

第11章 语义模型 125

11.1 工作原理 125

11.2 使用场景 127

11.3 入门例子(Java) 128

第12章 符号表 129

12.1 工作原理 129

12.2 使用场景 131

12.3 参考文献 131

12.4 以外部DSL实现的依赖网络(Java和ANTLR) 131

12.5 在一个内部DSL中使用符号键(Ruby) 133

12.6 用枚举作为静态类型符号(Java) 134

第13章 语境变量 137

13.1 工作原理 137

13.2 使用场景 137

13.3 读取INI文件(C#) 138

第14章 构造型生成器 141

14.1 工作原理 141

14.2 使用场景 142

14.3 构建简单的航班信息(C#) 142

第15章 宏 144

15.1 工作原理 144

15.1.1 文本宏 145

15.1.2 语法宏 148

15.2 使用场景 151

第16章 通知 153

16.1 工作原理 153

16.2 使用场景 154

16.3 一个非常简单的通知(C#) 154

16.4 解析中的通知(Java) 155

第三部分 外部DSL主题 160

第17章 分隔符指导翻译 160

17.1 工作原理 160

17.2 使用场景 162

17.3 常客记分(C#) 163

17.3.1 语义模型 163

17.3.2 解析器 165

17.4 使用格兰特小姐的控制器解析非自治语句(Java) 168

第18章 语法指导翻译 175

18.1 工作原理 175

18.1.1 词法分析器 176

18.1.2 语法分析器 179

18.1.3 产生输出 181

18.1.4 语义预测 181

18.2 使用场景 182

18.3 参考文献 182

第19章 BNF 183

19.1 工作原理 183

19.1.1 多重性符号(Kleene运算符) 184

19.1.2 其他一些有用的运算符 186

19.1.3 解析表达式文法 186

19.1.4 将EBNF转换为基础BNF 187

19.1.5 行为代码 189

19.2 使用场景 191

第20章 基于正则表达式表的词法分析器 192

20.1 工作原理 192

20.2 使用场景 193

20.3 格兰特小姐控制器的词法处理(Java) 194

第21章 递归下降法语法解析器 197

21.1 工作原理 197

21.2 使用场景 200

21.3 参考文献 200

21.4 递归下降和格兰特小姐的控制器(Java) 201

第22章 解析器组合子 205

22.1 工作原理 206

22.1.1 处理动作 208

22.1.2 函数式风格的组合子 209

22.2 使用场景 209

22.3 解析器组合子和格兰特小姐的控制器(Java) 210

第23章 解析器生成器 217

23.1 工作原理 217

23.2 使用场景 219

23.3 Hello World(Java和ANTLR) 219

23.3.1 编写基本的文法 220

23.3.2 构建语法分析器 221

23.3.3 为文法添加代码动作 223

23.3.4 使用代沟 225

第24章 树的构建 227

24.1 工作原理 227

24.2 使用场景 229

24.3 使用ANTLR的树构建语法(Java和ANTLR) 230

24.3.1 标记解释 230

24.3.2 解析 231

24.3.3 组装语义模型 233

24.4 使用代码动作进行树的构建(Java和ANTLR) 236

第25章 嵌入式语法翻译 242

25.1 工作原理 242

25.2 使用场景 243

25.3 格兰特小姐的控制器(Java和ANTLR) 243

第26章 内嵌解释器 247

26.1 工作原理 247

26.2 使用场景 247

26.3 计算器(ANTLR和Java) 247

第27章 外加代码 250

27.1 工作原理 250

27.2 使用场景 251

27.3 嵌入动态代码(ANTLR、Java和JavaScript) 252

27.3.1 语义模型 252

27.3.2 语法分析器 254

第28章 可变分词方式 258

28.1 工作原理 258

28.1.1 字符引用 259

28.1.2 词法状态 261

28.1.3 修改标记类型 262

28.1.4 忽略标记类型 263

28.2 使用场景 264

第29章 嵌套的运算符表达式 265

29.1 工作原理 265

29.1.1 使用自底向上的语法分析器 265

29.1.2 自顶向下的语法分析器 266

29.2 使用场景 268

第30章 以换行符作为分隔符 269

30.1 工作原理 269

30.2 使用场景 271

第31章 外部DSL拾遗 272

31.1 语法缩进 272

31.2 模块化文法 274

第四部分 内部DSL主题 276

第32章 表达式生成器 276

32.1 工作原理 276

32.2 使用场景 277

32.3 具有和没有生成器的连贯日历(Java) 278

32.4 对于日历使用多个生成器(Java) 280

第33章 函数序列 282

33.1 工作原理 282

33.2 使用场景 283

33.3 简单的计算机配置(Java) 283

第34章 嵌套函数 286

34.1 工作原理 286

34.2 使用场景 287

34.3 简单计算机配置范例(Java) 288

34.4 用标记处理多个不同的参数(C#) 289

34.5 针对IDE支持使用子类型标记(Java) 291

34.6 使用对象初始化器(C#) 292

34.7 周期性事件(C#) 293

34.7.1 语义模型 294

34.7.2 DSL 296

第35章 方法级联 299

35.1 工作原理 299

35.1.1 生成器还是值 300

35.1.2 收尾问题 301

35.1.3 分层结构 301

35.1.4 渐进式接口 302

35.2 使用场景 303

35.3 简单的计算机配置范例(Java) 303

35.4 带有属性的方法级联(C#) 306

35.5 渐进式接口(C#) 307

第36章 对象范围 309

36.1 工作原理 309

36.2 使用场景 310

36.3 安全代码(C#) 310

36.3.1 语义模型 311

36.3.2 DSL 313

36.4 使用实例求值(Ruby) 315

36.5 使用实例初始化器(Java) 317

第37章 闭包 319

37.1 工作原理 319

37.2 使用场景 323

第38章 嵌套闭包 324

38.1 工作原理 324

38.2 使用场景 325

38.3 用嵌套闭包来包装函数序列(Ruby) 326

38.4 简单的C#示例(C#) 327

38.5 使用方法级联(Ruby) 328

38.6 带显式闭包参数的函数序列(Ruby) 330

38.7 采用实例级求值(Ruby) 332

第39章 列表的字面构造 335

39.1 工作原理 335

39.2 使用场景 335

第40章 Literal Map 336

40.1 工作原理 336

40.2 使用场景 336

40.3 使用List和Map表达计算机的配置信息(Ruby) 337

40.4 演化为Greenspun式(Ruby) 338

第41章 动态接收 342

41.1 工作原理 342

41.2 使用场景 343

41.3 积分——使用方法名解析(Ruby) 344

41.3.1 模型 345

41.3.2 生成器 347

41.4 积分——使用方法级联(Ruby) 348

41.4.1 模型 349

41.4.2 生成器 349

41.5 去掉安全仪表盘控制器中的引用(JRuby) 351

第42章 标注 357

42.1 工作原理 357

42.1.1 定义标注 358

42.1.2 处理标注 359

42.2 使用场景 360

42.3 用于运行时处理的特定语法(Java) 360

42.4 使用类方法(Ruby) 362

42.5 动态代码生成(Ruby) 363

第43章 解析树操作 365

43.1 工作原理 365

43.2 使用场景 366

43.3 由C#条件生成IMAP查询(C#) 367

43.3.1 语义模型 367

43.3.2 以C#构建 369

43.3.3 退后一步 373

第44章 类符号表 375

44.1 工作原理 375

44.2 使用场景 376

44.3 在静态类型中实现类符号表(Java) 377

第45章 文本润色 383

45.1 工作原理 383

45.2 使用场景 383

45.3 使用润色的折扣规则(Ruby) 384

第46章 为字面量提供扩展 386

46.1 工作原理 386

46.2 使用场景 387

46.3 食谱配料(C#) 387

第五部分 其他计算模型 390

第47章 适应性模型 390

47.1 工作原理 390

47.1.1 在适应性模型中使用命令式代码 391

47.1.2 工具 393

47.2 使用场景 394

第48章 决策表 395

48.1 工作原理 395

48.2 使用场景 396

48.3 为一个订单计算费用(C#) 396

48.3.1 模型 397

48.3.2 解析器 400

第49章 依赖网络 403

49.1 工作原理 403

49.2 使用场景 405

49.3 分析饮料(C#) 405

49.3.1 语义模型 406

49.3.2 解析器 407

第50章 产生式规则系统 409

50.1 工作原理 409

50.1.1 链式操作 410

50.1.2 矛盾推导 411

50.1.3 规则结构里的模式 412

50.2 使用场景 412

50.3 俱乐部会员校验(C#) 412

50.3.1 模型 413

50.3.2 解析器 414

50.3.3 演进DSL 414

50.4 适任资格的规则:扩展俱乐部成员(C#) 416

50.4.1 模型 417

50.4.2 解析器 419

第51章 状态机 421

51.1 工作原理 421

51.2 使用场景 423

51.3 安全面板控制器(Java) 423

第六部分 代码生成 426

第52章 基于转换器的代码生成 426

52.1 工作原理 426

52.2 使用场景 427

52.3 安全面板控制器(Java生成的C) 427

第53章 模板化的生成器 431

53.1 工作原理 431

53.2 使用场景 432

53.3 生成带有嵌套条件的安全控制面板状态机(Velocity和Java 生成的C) 432

第54章 嵌入助手 438

54.1 工作原理 438

54.2 使用场景 439

54.3 安全控制面板的状态(Java和ANTLR) 439

54.4 助手类应该生成HTML吗(Java和Velocity) 442

第55章 基于模型的代码生成 444

55.1 工作原理 444

55.2 使用场景 445

55.3 安全控制面板的状态机(C) 445

55.4 动态载入状态机(C) 451

第56章 无视模型的代码生成 454

56.1 工作原理 454

56.2 使用场景 455

56.3 使用嵌套条件的安全面板状态机(C) 455

第57章 代沟 457

57.1 工作原理 457

57.2 使用场景 458

57.3 根据数据结构生成类(Java和一些Ruby) 459

参考文献 463