領域特定語言勘誤表

與任何書籍一樣,我也會犯錯。此頁面列出書中目前已知的錯誤。如果您發現我未在此處列出的錯誤,請告知我。

第 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」應改為「我不再需要覆寫 reportErrors」[已在第二次印刷中更正]

第 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 版中更正]


非常感謝大友步美、坂本直樹、大塚康史、平澤明、艾哈邁德·辛迪、高橋優和尼可拉斯·拉德克利夫發現並告訴我這些錯誤