【问题标题】:Use of the term "Abstract Syntax Tree"使用术语“抽象语法树”
【发布时间】: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


【解决方案1】:

由于继承树,它不被称为 AST。之所以称为 AST,是因为它是一个树形结构,并且代表 JSON 的语法。

要查看它是如何成为树结构的,请考虑以下示例:

{"a": 42, "b": {"x": "y"}}

这将被解析为以下对象:

JsObject(Map(
    "a" -> JsInt(42),
    "b" -> JsObject(Map(
      "x" -> JsString("y")
    ))
))

代表以下树:

         Object
    "a" /      \ "b"
      Int    Object
       |        | "x"
       42    String
                |
               "y"

这是上述 JSON 字符串的抽象语法树。

我知道作者没有在编译器语法分析的上下文中使用该术语

不是编译器,但他们在分析 JSON 的抽象语法的上下文中使用它。

【讨论】:

  • 它在定义中说JsObject(get: Map[String, Json]),我不认为JsString 属于箭头的左侧。 String-valued 标签属于,它们描述了树的结构:这就是半结构化数据的全部意义所在。但这也取决于您希望您的“抽象语法树”如何“抽象”,没有什么能阻止任何人拥有多个不同抽象级别的 AST...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
相关资源
最近更新 更多