譯者序
前言
第一部分 敘 述
第1章入門例子2
1.1 哥特式建築安全係統2
1.2 狀態機模型4
1.3 為格蘭特小姐的控製器編寫程序7
1.4 語言和語義模型13
1.5使用代碼生成15
1.6 使用語言工作颱17
1.7 可視化20
第2章 使用DSL21
2.1定義DSL21
2.1.1DSL的邊界22
2.1.2片段DSL和獨立DSL25
2.2為何需要DSL25
2.2.1 提高開發效率26
2.2.2與領域專傢的溝通26
2.2.3執行環境的改變27
2.2.4其他計算模型28
2.3DSL的問題28
2.3.1語言噪音29
2.3.2構建成本29
2.3.3集中營語言30
2.3.4 “一葉障目”的抽象30
2.4廣義的語言處理31
2.5DSL的生命周期31
2.6設計優良的DSL從何而來32
第3章實現DSL34
3.1DSL處理之架構34
3.2解析器的工作方式37
3.3文法、語法和語義39
3.4解析中的數據39
3.5宏41
3.6測試DSL42
3.6.1語義模型的測試42
3.6.2解析器的測試45
3.6.3腳本的測試49
3.7錯誤處理50
3.8DSL遷移51
第4章實現內部DSL54
4.1連貫API與命令–查詢API54
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章實現外部DSL72
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.5XML DSL82
第6章內部DSL vs 外部DSL84
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組閤多種DSL88
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
第二部分 通 用 主 題
第10章各種DSL116
10.1Graphviz116
10.2JMock117
10.3CSS118
10.4HQL119
10.5XAML120
10.6FIT122
10.7Make等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主題
第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章BNF183
19.1工作原理183
19.1.1多重性符號(Kleene運算符)184
19.1.2其他一些有用的運算符186
19.1.3解析錶達式文法186
19.1.4將EBNF轉換為基礎BNF187
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.3Hello 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主題
第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.2DSL296
第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.2DSL313
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 Map336
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
第五部分 其他計算模型
第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演進DSL414
50.4適任資格的規則:擴展俱樂部成員(C#)416
50.4.1模型417
50.4.2解析器419
第51章狀態機421
51.1工作原理421
51.2使用場景423
51.3安全麵闆控製器(Java)423
第六部分 代 碼 生 成
第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
· · · · · · (
收起)