【发布时间】:2018-03-18 17:53:09
【问题描述】:
我正在努力加深对 Scala 的理解,让我感到困惑的一件事是使用术语 抽象语法树(又名 AST)。
现在我在很多地方看到程序员使用术语 AST 来描述一些代码。以下示例来自 Noel Welsh 和 Dave Gurnell 所著的“Advanced Scala”一书,在描述类型类模式的部分中。
// Define a very simple JSON AST
sealed trait Json
final case class JsObject(get: Map[String, Json]) extends Json
final case class JsString(get: String) extends Json
final case class JsNumber(get: Double) extends Json
我猜上面是一棵树,虽然很浅。
Json
|
+-----------+-+-----------+
| | |
JsObject JsString JsNumber
我对 AST 的理解通常是在编译器的上下文中,它从代表代码的具体语法树(代码语法分析 -> 具体语法树 -> 抽象语法树)创建 AST。
为什么上面是 AST?
我知道作者并没有在编译器语法分析的上下文中使用该术语,但由于 AST 通常用于表示代码的抽象表示,为什么有人会使用该术语来描述一些实际代码?
【问题讨论】:
-
上面写的是 AST 还是 ADT(代数数据类型)?
-
如果您将 JSON 视为一种语言,那么解析其语法将生成 AST。从定义上看,JSON 是一种数据交换协议,但术语语言相当模糊,因此您可以根据自己的喜好这样称呼它。
-
AST。点了,干杯。
标签: scala data-structures functional-programming abstract-syntax-tree