領域特定語言勘誤表
與任何書籍一樣,我也會犯錯。此頁面列出書中目前已知的錯誤。如果您發現我未在此處列出的錯誤,請告知我。
第 2 版及後續版本中的錯誤
第 122 頁 §8.1:在圖 8.1 中,我將事件標籤標錯了。從開啟轉換為關閉的事件應標記為 switchDown。(我將此歸咎於在英國長大,現在住在美國。)
第 1 版中的錯誤
第 9 頁 §1.2:在狀態機類別的程式碼中,我未顯示開始狀態的 getter 宣告:public State getStart() {return start;}
[已在第 2 版中修正]
第 20 頁 §1.5:在兩個圖表中,我使用「eligable」,但應使用「eligible」。[已在第 2 版中修正]
第 27 頁 §2.1:第二個項目符號。「the way they can by composed」應標記為「the way they can be composed」[已在第 2 版中修正]
第 32 頁 §2.1.2:在第一個參考中,我所指的範例位於第 1.3 節,第 12 頁 [已在第 2 版中修正]
第 61 頁 §3.6.3:在該節的第一段中,「using too different mechanisms」應標記為「using two different mechanisms」[已在第 2 版中修正]
第 73 頁 §4.3:在該頁的第三段中,「Consider the calls to diskSize
」應標記為「Consider the calls to size
」[已在第 2 版中修正]
第 98 頁 §5.3.4:在最後一段中,「It similarly recognizes the second line of input」應標記為「It similarly recognizes the third line of input」[已在第 2 版中修正]
第 119 頁 §7.1.3:在圖 7.3 中,收集和已付款狀態之間兩個轉換的箭頭應反轉。[已在第 2 版中修正]
第 122 頁 §8.1:在圖 8.1 中,我將事件標籤標錯了。從開啟轉換為關閉的事件應標記為 switchDown。(我將此歸咎於在英國長大,現在住在美國。)
第 131 頁 §9.2:第 5 段。「from the active state to the waiting-for-light state」應標記為「from the active state to the waiting-for-drawer state」。圖表也應標記「drawer」而非「draw」。[已在第 2 版中修正]
第 140 頁 §9.5:該節的第四段。「MetaEdit from from MetaCase」應標記為「MetaEdit from from MetaCase」[已在第 2 版中修正]
第 143 頁 §9.7:最後一段:「they are worth experimenting experimenting with」只需要一個「experimenting」。[已在第 2 版中修正]
第 152 頁 §10.4:在該節的最後一段中,「constraints of a syntax tree usually help more than they hinder」應標記為「constraints of a syntax tree usually hinder more than they help」[已在第 2 版中修正]
第 205 頁 §17.3.1:在 UML 圖表中,從地點規格到飯店的多重性為 *:1,但應為 *:*。[已在第 2 版中修正]
第 206 頁 §17.3.1:文字中提到 Offer 類別,但遺漏了程式碼。以下是程式碼。
class Offer... public int Score(Activity a) { return Location.IsSatisfiedBy(a) && Activity.isSatisfiedBy(a) ? Reward.Score(a) : 0; } public Reward Reward { get; set; } public LocationSpecification Location { get; set; } public ActivitySpecification Activity { get; set; }[已在第 2 版中修正]
第 215 頁 §17.4:頁面的倒數第二段落「primeState
方法」應改為「primeMachine
方法」。IntelliJ 的重新命名重構很好,但沒那麼好。[已在第二次印刷中更正]
第 221 頁 §18.1.1:在第一個區塊中,令牌定義應大寫,因此區塊應改為
Event-keyword: 'events'; Command-keyword: 'commands'; End-keyword: 'end'; Identifier: [a-zA-Z0-9]*;[已在第 2 版中修正]
第 221 頁 §18.1.1:第一個程式碼片段。程式碼行 identifier: [a-z A-Z 0-9]*;
應改為 identifier: [a-zA-Z0-9]*;
(移除字元類別中的空格)。[已在第二次印刷中更正]
第 222 頁 §18.1.1:程式碼行位於頁面底部。code: [A-Z 0-9]{4}
應改為 code: [A-Z0-9]{4}
(移除字元類別中的空格)。[已在第二次印刷中更正]
第 226 頁 §18.1.2:頁面上的第一個段落。「傾向於將解析器視為活動」應改為「傾向於將「解析」視為活動」[已在第二次印刷中更正]
第 228 頁 §29.1.1:在最後一段落中,「%prec UNMINUS
」應改為「%prec UMINUS
」[已在第二次印刷中更正]
第 264 頁 §22.3:第一個段落第 3 行。「產生的動作值」應改為「產生的比對值」。[已在第二次印刷中更正]
第 267 頁 §22.3:第 3 個程式碼片段。eventDecList: eventDec+
應改為 eventDecList: eventDec*
[已在第二次印刷中更正]
第 268 頁 §22.3:第 2 個程式碼片段。eventDec: identifier identifier
應改為 eventDec: IDENTIFIER IDENTIFIER
以與規則的先前陳述一致。[已在第二次印刷中更正]
第 276 頁 §23.3.3:頁面上的最後一段落,「將其新增到語法中作為載入器」應改為「將其新增到語法中作為輔助程式」[已在第二次印刷中更正]
第 279 頁 §23.3.4:第 279 頁頂端「我不再需要覆寫 reportErrors
」應改為「我不再需要覆寫 reportError
」[已在第二次印刷中更正]s
第 301 頁 §25.3:在第一個程式碼區塊後,程式碼行「語法的頂層定義了狀態機檔案。」應改為「語法的頂層定義了狀態機檔案。」[已在第二次印刷中更正]
第 303 頁 §25.3:頁面底部的最後一段程式碼 addResetEvent
不必要地重複了前面剛出現過的內容。[已於第二次印刷中修正]
第 306 頁 §26.3:本節的第四段落:「包裝 ANTLR 語法檔案」應改為「包裝 ANTLR 產生的解析器」[已於第二次印刷中修正]
第 307 頁 §26.3
計算器其餘部分的程式碼範例缺少 mult_exp
的子句
mult_exp returns [double result] : a=power_exp {$result = $a.result;} ( '*' b = power_exp {$result *= $b.result;} | '/' b = power_exp {$result /= $b.result;} )* ;[已在第 2 版中修正]
第 322 頁 §28.1.2:頁面最後一段落「Flex,lex 的 GNU 版本」應改為「Flex,lex 的開源版本」。由於 Flex 通常與 Bison 搭配使用,而 Bison 是 GNU 專案,因此我陷入了一個常見的陷阱,以為 Flex 也是 GNU。[已於第二次印刷中修正]
第 353 頁 §33.3:頁面最後一段落。「建立一個用於收集的值」應改為「建立一個用於收集的子項建立器」[已於第二次印刷中修正]
第 358 頁 §34.1:第三段落。「父函式可以明確定義子函式中所需的引數」應改為「父函式可以明確定義使用子函式的所需引數」[已於第二次印刷中修正]
第 374 頁 §35.1:第三個程式碼片段,private HardDrive speed (int arg) {
應改為 public HardDrive speed (int arg) {
,以便正確使用 [已於第二次印刷中修正]
第 382 頁 §35.4:第三個程式碼片段 private HardDriveBuilder SATA {
應改為 public HardDriveBuilder SATA {
[已於第二次印刷中修正]
第 387 頁 §36.3:DSL 腳本的最後四行未在範例中描述或使用,因此應予以移除。[已於第二次印刷中修正]
第 387 頁 §36.3.2:DSL 腳本的最後四行未在範例中描述或使用,因此應予以移除。[已於第二次印刷中修正]
第 392 頁 §36.4:DSL 腳本的最後五行未在範例中描述或使用,因此應予以移除。[已於第二次印刷中修正]
第 411 頁 §38.6:本節的第二段落。「不一定會適合」應改為「不一定會很好地適合」[已於第二次印刷中修正]
第 420 頁 §40.1:頁面第二行。程式碼 processor("cores", 2, "type" "i386")
最後兩個參數之間缺少逗號。[已在第二次印刷中修正]
第 431 頁 §41.3.1:從「促銷是一組規則」開頭的段落之後,程式碼 class Itinerary
應改為 class Promotion
[已在第二次印刷中修正]
第 432 頁 §41.3.1:從最上方的段落(從「此處的方法」開頭)之後,程式碼 class Itinerary
應改為 class Promotion
[已在第二次印刷中修正]
第 434 頁 §41.3.2:以「建立適當的規則」結尾的段落應改為「填入適當的規則s」。[已在第二次印刷中修正]
第 434 頁 §41.3.2:程式碼範例未提供在 PromotionBuilder 類別中定義的 add_condition
方法內容。此方法的本體為:@rules.last.add_condition arg
。[已在第二次印刷中修正]
第 436 頁 §41.4.2:此節中各處的類別 ConditionAtributeNameBuilder
缺少「t」,應改為 ConditionAttributeNameBuilder
[已在第二次印刷中修正]
第 436 頁 §41.4.2:從「建立條件」開頭的段落中,句子「有三個部分:名稱、運算子及條件」應改為「有三個部分:名稱、運算子及值」[已在第二次印刷中修正]
第 437 頁 §41.4.2:程式碼行 attr_reader :condition_class
為無效程式碼,應予移除。[已在第二次印刷中修正]
第 448 頁 §42.1.2:最後一段的第一個句子,「處理可以在多個地方進行,並有多個處理定義。」應改為「處理可以在多個地方進行,而沒有多個處理定義。」[已在第二次印刷中修正]
第 451 頁 §42.4:在第一個程式碼片段中,Domain Object
應改為 DomainObject
(無空格)。[已在第二次印刷中修正]
第 451 頁 §42.3:在程式碼範例中,class ValidRangeFieldValidator
應改為 class ValidRangeFieldValidator implements FieldValidator
,以釐清實作關係。[已在第二次印刷中修正]
第 468 頁 §44.1:此節的第四段。「將程式碼放入建構函式中以填入欄位」應改為「將程式碼放入初始化方法中以填入欄位」。建構函式是此方法的有效初始化方法,但您也可以使用其他方法,就像我在以下範例中所做的一樣 [已在第二次印刷中修正]
第 479 頁 §45.3:在第三個文字段落中,程式碼 builder_has_rule?
應改為 builder.has_rule?
(點取代底線)。[已在第二次印刷中修正]
第 499 頁 §48.3:頁面上第一個程式碼範例(content
欄位和建構函式)是 ConditionBlock
類別的一部分 [已在第 2 版中更正]
第 500 頁 §48.3:頁面上第二個程式碼範例(Matches
方法)是 ConditionBlock
類別的一部分 [已在第 2 版中更正]
第 510 頁 §49.3.1:倒數第二行「特別是對小貓」應改為「特別是對倉鼠」(本書製作過程中沒有傷害任何小貓。)[已在第 2 版中更正]
第 519 頁 §50.3.2:缺少 ValidationRuleBuilder
的程式碼。它應為
class ValidationRuleBuilder : WithParser { readonly string description; readonly ValidationEngine engine; public ValidationRuleBuilder(string description, ValidationEngine engine) { this.description = description; this.engine = engine; } public void With(Predicate<Person> condition) { engine.AddRule(condition, description); } }[已在第 2 版中修正]
第 519 頁 §50.3.1:段落中的最後一行。engine.Run(john) 應改為 engine.Run(tim) [已在第 2 版中更正]
第 523 頁 §50.4:第一行「Productive Solider」應改為「Productive Soldier」[已在第 2 版中更正]
第 528 頁 §51.1:在圖 51.1 中,收款和已付狀態之間兩個轉換的箭頭應反轉。[已在第 2 版中更正]
第 540 頁 §53.1:頁面上的第二段:「範本是原始文字」應改為「範本是原始文字」[已在第 2 版中更正]
第 554 頁
此頁面為空白,但應包含以下文字
「(例如)假設 HTML 設計師想要在連結輸出中加入樣式類別;如果嵌入式輔助程式產生該連結,則設計師必須與程式設計師協調才能進行變更。當然,只有當不同檔案由不同人員處理時,這才會造成問題;在為 DSL 產生程式碼時,通常不會發生這種情況。」
[已在第 2 版中修正]第 556 頁 §55.1:區段最後一段,倒數第二句:「執行程式碼產生程序」應改為「不執行程式碼產生程序」[已在第 2 版中更正]
第 558 頁 §55.3:從底部數起第 9 行。「我將狀態機器和控制器宣告為靜態變數」應改為「我將狀態機器和控制器宣告為靜態全域變數」[已在第 2 版中更正]
第 566 頁 §55.4:第一個程式碼片段後方。「呼叫靜態宣告函式」應改為「呼叫靜態宣告函式」[已在第 2 版中更正]
第 580 頁:標題為「使用 Java 5 設計安全且嵌入式 DSL」的論文應改為「使用 Java 5 設計安全且彈性嵌入式 DSL」[已在第 2 版中更正]
非常感謝大友步美、坂本直樹、大塚康史、平澤明、艾哈邁德·辛迪、高橋優和尼可拉斯·拉德克利夫發現並告訴我這些錯誤