文章目录
  1. 1. 工作原理
  2. 2. 使用场景

接下来几篇Blog会和大家介绍一些内部DSL和外部DSL通用的主体,本篇就介绍DSL的核心—语义模型。

工作原理

语义模型是指一种表现形式,比如,内存对象模型,以表示DSL所描述的对象。语义模型就是DSL组装的程序库或框架。

语义模型应该根据DSL的意图设计。事实上,语义模型可以能够脱离DSL单独使用,应该能够通过命令-查询接口构建出来,这就可以保证语义模型完整地描述了主题领域的所有语义,我们可以独立地测试它和解析器。

一般来说,语义模型同语法树有所不同,因为它们的目的不同。语法树对应DSL的结构;语义模型则更多的是用DSL脚本信息能够做些什么。

语义模型可以包含执行本身的代码(解释风格),也可以作为代码生成的基础(编译风格)。

将验证逻辑放入语义模型中是最合适的,因为它包含验证所需的所有信息和结构。

可以将语义模型想象成具有两组不同接口:操作接口—-客户端操作时使用组装好的模型所用的接口;组装接口—-DSL用来创建模型中实例的接口。

使用场景

默认情况下,建议总是使用语义模型。会有如下优点:

  • 有了清晰的语义模型,DSL的语义和解析可以分开测试。
  • 语义模型同时提高了解析和执行的灵活性。
  • 分离了对语义和解析的关注。

不使用语义模型的情况:如果模型不比AST(Abstract Syntax Tree)更丰富。

人们不想用语义模型,最常见的情况是要代码生成的时候。按照这种方式,解析器生成AST,代码生成器直接使用AST。如果AST可以很好地表现出底层语义。而且我不介意代码生成逻辑同AST之间的耦合,那这不失为一种合理的方案。如果不是这样,你会发现,将AST转成语义模型。再根据它做简单的代码生成是一种更为简单的方案。

文章目录
  1. 1. 工作原理
  2. 2. 使用场景