我正在努力加深对Scala的理解,而让我困惑的是抽象语法树(又名AST)这一术语的使用。
在很多地方,我已经看到程序员使用AST这个词来描述一些代码。下面的示例来自Noel和Dave在描述Type模式的章节中的"Advanced“一书。
// 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通常被用来表示代码的抽象表示,为什么有人会用这个术语来描述一些实际的代码呢?
发布于 2018-03-18 18:13:38
它不是因为继承树而被称为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的抽象语法时使用它。
https://stackoverflow.com/questions/49351127
复制相似问题