领域特定语言的勘误
与任何书籍一样,我都会犯错误。此页面列出了本书中目前已知的错误。如果您发现我这里没有列出的错误,请告诉我。
第二版及以后版本的错误
第 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 reportError
” [已在第二版中更正]s
第 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 指出并告知我这些错误