Electronic Joint Business

Solution for E-Business

lark

用 Python LARK 开发 DSL 语言

第一次接触 Logo 语言时,你会觉得它像魔法。只需一小段简单命令,就可以在屏幕上画出漂亮又复杂的图形。本文将向你展示如何用 70 行代码来解析并解释一种类 Logo 语言,你可以以此为基础来设计并实现你自己的语言。在这里,我们会用到解析类库 Lark 以及 Python 的 turtle 模块。 1

什么是 DSL?
在编写软件项目时, 有时候你所选择的语言不太适合表达你的信息 — 包括数据、配置、命令列表等。可能缺少某种抽象、语言可能会过于冗长, 或者代码由于缺少适当的验证而容易出错。这时候,创建自己的语言就能以简洁的方式描述信息。这种语言被称为“领域特定语言” 或 DSL。

DSL 往往短小简洁。既有优点, 也有缺点。

DSL 优点:

  • 表达自由 (在其应用范围内)
  • 代码简洁, 更易于阅读、编写和调试
  • 按设计进行验证
  • 动态 — 可在运行时执行动态代码 (evaluated)
  • 可重用 — DSL 可以在不同的语言和平台之间共享,比如正则表达式

DSL 缺点:

>>> 阅读全文

 

, ,

利用 Python 工具和库实现语法解析

想用 Python 来解析编程语言或者文档,一般有三种做法:1

  • 利用现成的库来支持语言的解析,如 XML 类库:对于那些使用广泛的语言如 XML 和 HTML,这是无疑是最好的选择。好的类库通常还会包括创建或修改语言的可编程 API,这要比基础解析器的功能多得多。不过只有最常见的语言才有这种类库。
  • 从头构造一个解析器:有时候你可能要自己构造解析器。比如语言无法用传统的解析器生成器来解析,或者生成器的功能无法满足性能需求或者无法和其他组件深度集成。
  • 利用工具或者库来帮助生成解析器,例如 ANTLR 可以为任何语言生成解析器。

在前两种选项之外的场合,生成器应该是默认的选择,因为它既灵活又可以大大缩短开发时间。这就是为什么本文重点关注此种类库和工具的原因。

用工具创建解析器
在后续的章节中我们会看到:

  • 利用工具来生成 Python 可用(或其他语言可用)的解析器
  • 用来创建解析器的 Python 类库

生成解析器代码的工具称一般为解析器生成器(parser generators)或者编译器的编译器(compiler compiler)。生成解析器的类库则称为解析器组合器(parser combinator)。

不管是生成器还是组合器都不是易上手的工具,你需要花时间学习它们的使用方法。请注意并不是所有生成器都适用于所有的语言。在这里, 我们列出了一些最常见的生成器并对它们逐一进行简单介绍。并且我们的目标语言定为 Python。这意味一般来说这些工具和库自身也是用 Python 编写的。

>>> 阅读全文

 

, , , , , ,