使用术语 "Abstract Syntax Tree"
Use of the term "Abstract Syntax Tree"
我正在努力加深对 Scala 的理解,让我感到困惑的一件事是术语 抽象语法树(又名 AST)的使用。
现在我在很多地方看到程序员使用术语 AST 来描述一些代码。以下示例来自 Noel Welsh 和 Dave Gurnell 所著的 "Advanced Scala" 一书中描述类型 Class 模式的部分。
// 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。之所以称为 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字符串的抽象语法树。
I know that the authors are not using the term in the context of the syntax analysis of a compiler
不是编译器,但他们在分析 JSON.
的抽象语法的上下文中使用它
我正在努力加深对 Scala 的理解,让我感到困惑的一件事是术语 抽象语法树(又名 AST)的使用。
现在我在很多地方看到程序员使用术语 AST 来描述一些代码。以下示例来自 Noel Welsh 和 Dave Gurnell 所著的 "Advanced Scala" 一书中描述类型 Class 模式的部分。
// 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。之所以称为 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字符串的抽象语法树。
I know that the authors are not using the term in the context of the syntax analysis of a compiler
不是编译器,但他们在分析 JSON.
的抽象语法的上下文中使用它