我正在努力进一步理解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通常用于表示代码的抽象表示,为什么有人会使用该术语来描述一些实际的代码? / p>
答案 0 :(得分:2)
由于继承树,它不被称为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的抽象语法的上下文中使用它。