领域特定语言的勘误

与任何书籍一样,我都会犯错误。此页面列出了本书中目前已知的错误。如果您发现我这里没有列出的错误,请告诉我。

第二版及以后版本的错误

第 122 页 §8.1: 在图 8.1 中,我将事件标签弄反了。从 on 到 off 的转换上的事件应显示为 switchDown。(我将此归咎于我在英国长大,现在住在美国。)

第一版的错误

第 9 页 §1.2: 在状态机类的代码中,我没有显示 start 状态的 getter 声明:public State getStart() {return start;} [已在第二版中更正]

第 20 页 §1.5: 在两个图中,我使用了“eligable”,而应该使用“eligible”。[已在第二版中更正]

第 27 页 §2.1: 第二个要点。“the way they can by composed” 应改为“the way they can be composed” [已在第二版中更正]

第 32 页 §2.1.2: 在第一次引用中,我提到的示例位于第 12 页的第 1.3 节中。[已在第二版中更正]

第 61 页 §3.6.3: 在本节的第一段中,“using too different mechanisms” 应改为“using two different mechanisms” [已在第二版中更正]

第 73 页 §4.3: 在本页的第三段中,“Consider the calls to diskSize” 应改为“Consider the calls to size” [已在第二版中更正]

第 98 页 §5.3.4: 在倒数第二段中,“It similarly recognizes the second line of input” 应改为“It similarly recognizes the third line of input” [已在第二版中更正]

第 119 页 §7.1.3: 在图 7.3 中,收集状态和已支付状态之间两个转换的箭头方向应反转。[已在第二版中更正]

第 122 页 §8.1: 在图 8.1 中,我将事件标签弄反了。从 on 到 off 的转换上的事件应显示为 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”。[已在第二版中更正]

第 140 页 §9.5: 本节中的第四段。“MetaEdit from from MetaCase” 应改为“MetaEdit fromfromMetaCase” [已在第二版中更正]

第 143 页 §9.7: 最后一段:“they are worth experimenting experimenting with” 只需要一个“experimenting”。[已在第二版中更正]

第 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” [已在第二版中更正]

第 205 页 §17.3.1: 在 UML 图中,从 Location Specification 到 Hotel 的多重性为 *:1,但应为 *:*。[已在第二版中更正]

第 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; }
[已在第二版中更正]

第 215 页 §17.4: 本页倒数第二段,“the primeState method” 应改为“the primeMachine method”。IntelliJ 的重命名重构很好,但没有那么好。[已在第二版中更正]

第 221 页 §18.1.1: 在第一个代码块中,令牌定义应大写,因此代码块应改为

Event-keyword: 'events';
Command-keyword: 'commands';
End-keyword: 'end';
Identifier: [a-zA-Z0-9]*;
[已在第二版中更正]

第 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: 本页的第一段。“tend to refer to the parser as the activity” 应改为“tend to refer to "parse" as the activity” [已在第二版中更正]

第 228 页 §29.1.1: 在最后一段中,“%prec UNMINUS” 应改为“%prec UMINUS” [已在第二版中更正]

第 264 页 §22.3: 第一段的第 3 行。“the resulting action value” 应改为“the resulting match value”。[已在第二版中更正]

第 267 页 §22.3: 第 3 个代码段。eventDecList: eventDec+ 应改为 eventDecList: eventDec* [已在第二版中更正]

第 268 页 §22.3: 第 2 个代码段。eventDec: identifier identifier 应改为 eventDec: IDENTIFIER IDENTIFIER,以与之前的规则陈述保持一致。[已在第二版中更正]

第 276 页 §23.3.3: 本页的最后一段,“add it into the grammar as a loader” 应改为“add it into the grammar as a helper” [已在第二版中更正]

第 279 页 §23.3.4: 第 279 页顶部,“I no longer need to override reportErrors” 应改为“I no longer need to override reportErrors” [已在第二版中更正]

第 301 页 §25.3: 在第一个代码块之后,行“The top level of the grammar defines the state machine file.” 应改为“The top level of the grammar defines the state machinefile.” [已在第二版中更正]

第 303 页 §25.3: 本页底部的最后一个代码段 addResetEvent 不必要地重复了之前的代码。[已在第二版中更正]

第 306 页 §26.3: 本节中的第四段:“that wraps the ANTLR grammar file” 应改为“that wraps the ANTLR generated parser” [已在第二版中更正]

第 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;}
   	  )*
   	;
      
[已在第二版中更正]

第 322 页 §28.1.2: 本页的最后一段,“Flex, the GNU version of lex” 应改为“Flex, the open source version of lex”。由于 Flex 通常与 Bison 一起提供,而 Bison 是一个 GNU 项目,因此我陷入了普遍的误区,以为 Flex 也是 GNU 项目。[已在第二版中更正]

第 353 页 §33.3: 本页的最后一段。“create a value for collecting” 应改为“create a child builder for collecting” [已在第二版中更正]

第 358 页 §34.1: 第 3 段。“A parent function can define exactly the arguments required in the child functions” 应改为“A parent function can define exactly the arguments required using child functions” [已在第二版中更正]

第 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: 本节的第二段。“doesn't necessarily fit will” 应改为“doesn't necessarily fit well” [已在第二版中更正]

第 420 页 §40.1: 本页的第二行。代码 processor("cores", 2, "type" "i386") 缺少最后两个参数之间的逗号。[已在第二版中更正]

第 431 页 §41.3.1: 在以“promotions are a set of rules” 开头的段落之后,代码 class Itinerary 应改为 class Promotion [已在第二版中更正]

第 432 页 §41.3.1: 在顶部段落(以“The approach here” 开头)之后,代码 class Itinerary 应改为 class Promotion [已在第二版中更正]

第 434 页 §41.3.2: 以“creates the appropriate rules” 结尾的段落应改为“populates the appropriate rules”。[已在第二版中更正]

第 434 页 §41.3.2: 代码示例没有给出 add_condition 方法的内容,该方法是在 PromotionBuilder 类上定义的。此方法的主体为:@rules.last.add_condition arg。[已在第二版中更正]

第 436 页 §41.4.2: 本节中各个地方的类 ConditionAtributeNameBuilder 缺少一个“t”,应改为 ConditionAttributeNameBuilder [已在第二版中更正]

第 436 页 §41.4.2: 在以“To build the condition” 开头的段落中,短语“has three parts: name, operator, and condition” 应改为“has three parts: name, operator, and value” [已在第二版中更正]

第 437 页 §41.4.2: 代码行 attr_reader :condition_class 是死代码,应删除。[已在第二版中更正]

第 448 页 §42.1.2: 最后一段的第一句话,“Processing can occur in multiple places with multiple definitions of the processing.” 应改为 Processing can occur in multiple places without multiple definitions of the processing. [已在第二版中更正]

第 451 页 §42.4: 在第一个代码片段中,Domain Object 应改为 DomainObject(无空格)。[已在第二版中更正]

第 451 页 §42.3: 在代码示例中,class ValidRangeFieldValidator 应改为 class ValidRangeFieldValidator implements FieldValidator,以阐明实现关系。[已在第二版中更正]

第 468 页 §44.1: 本节中的第四段。“put code in the constructor to populate the fields” 应改为“put code in an initializer method to populate the fields”。构造函数是此方法的有效初始化方法,但您也可以使用其他方法 - 正如我在以下示例中所做的那样。[已在第二版中更正]

第 479 页 §45.3: 在第三个文本段落中,代码 builder_has_rule? 应改为 builder.has_rule?(点替换下划线)。[已在第二版中更正]

第 499 页 §48.3: 本页上的第一个代码示例(content 字段和构造函数)是 ConditionBlock 类的一部分。[已在第二版中更正]

第 500 页 §48.3: 本页上的第二个代码示例(Matches 方法)是 ConditionBlock 类的一部分。[已在第二版中更正]

第 510 页 §49.3.1: 倒数第二行“particularly to the kittens” 应改为“particularly to the hamsters”(在本书制作过程中,没有小猫受到伤害。)[已在第二版中更正]

第 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);
    }
  }

 
[已在第二版中更正]

第 519 页 §50.3.1: 段落的最后一行。engine.Run(john) 应改为 engine.Run(tim) [已在第二版中更正]

第 523 页 §50.4: 在第一行,“Productive Solider” 应改为“Productive Soldier” [已在第二版中更正]

第 528 页 §51.1: 在图 51.1 中,收集状态和已支付状态之间两个转换的箭头方向应反转。[已在第二版中更正]

第 540 页 §53.1: 本页的第二段:“The template is is the source text” 应改为“The template isisthe source text” [已在第二版中更正]

第 554 页

此页为空白,但应包含以下文本

"(For) instance, suppose the HTML designer wants to add a style class to the link output; if the Embedment Helper generates that link, then the designer has to coordinate with a programmer to make that change. Of course, this is only a problem if you have different people working on the different files; when generating code for a DSL, this is usually not the case."

[已在第二版中更正]

第 556 页 §55.1: 本节的最后一段,倒数第二句话:“with running the code-generation process” 应改为“without running the code-generation process” [已在第二版中更正]

第 558 页 §55.3: 从底部数第 9 行。“I declare the state machine and the controller as static variables” 应改为“I declare the state machine and the controller as static global variables” [已在第二版中更正]

第 566 页 §55.4: 在第一个代码片段之后。“calls the static declare functions” 应改为“calls thestaticdeclare functions” [已在第二版中更正]

第 580 页: 标题为“使用 Java 5 设计安全嵌入式 DSL”的论文应更名为“使用 Java 5 设计安全且灵活的嵌入式 DSL”[已在第二版中更正]


非常感谢 Ayumi Otomo、Naoki Sakamoto、Yasushi Ohtsuka、Akira Hirasawa、Ahmad Hindi、Yuzuru Takahashi 和 Nicholas Radcliffe 指出并告知我这些错误