文章目录
  1. 1. 工作原理
    1. 1.1. 静态数据符号
  2. 2. 使用场景
  3. 3. 实例

很多语言都需要在代码的不同地方应用对象。如果我们有一种语言,可以定义任务的配置及其依赖关系。就需要一种方式,在一个任务定义中,引用其依赖的任务。

为了达到这个目的,我们要对每个任务都定义某种形式的符号:当处理DSL脚本时,这些符号都放到符号表中,通过这张表,可以由符号关系到持有期完整信息的底层对象。

本章就和大家继续介绍通用主题—符号表。

工作原理

符号表的根本目的是,建立DSL脚本中表示对象的符号与符号所指对象之间的映射关系。

需要考虑的一个问题就是,在符号表中,用做键的对象应该是何种类型。对于很多语言来说,字符串是最显而易见的选择,因为DSL文本就是字符串。不过有些语言不使用字符串,因为它们支持符号数据类型。

从结构上说,二者很想—基本上看,符号就是字符序列—但通常来说,二者在行为有所不同。符号主要用于查找,符号一般都是这样设计的。所以,两个字符串“foo”和“foo”可能不是同一个对象,还要比较器内容,而两个符号foo和foo总是指向同一个对象,所以比较相等性会快很多。

性能是一个号的理由,让符号数据类型优于字符串,但对于小型DSL而言,差别就没多大了。首选符号数据类型还有一个更大的理由,使用它能够更好地表达我们的意图。

符号表中的值可以是最终的模型对象,也可以是处于中间状态的生成器(builder)。

有些语言要引用不同类型的数据,使用多张map分别对应不同的类型会比较好。

某些情况下,对象在定义之前就引用了—前向引用。通常来说,DSL不支持前向引用。要支持前向引用的话,当引用一个符号时,如果符号表中没有对应的项,就会组装它。

如果符号无须显示声明,我们就需要非常小心拼写错误的符号。

静态数据符号

如果使用C#或者Java这样的静态类型语言实现内部DSL,可以使用哈希表作为符号表,以字符串为键。

同时我们可以用一些静态数据符号来避免字符串的弊端。枚举就是一个简单直挂的选择。

使用场景

对于任何的语言处理而言,符号表都是通用的,所以我们尽可能使用它。

实例

具体例子可以参考原书。

文章目录
  1. 1. 工作原理
    1. 1.1. 静态数据符号
  2. 2. 使用场景
  3. 3. 实例