ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 如何使用 JavaScript 实现一门编程语言(5) —— AST 在计算机科学中,抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。 之前我们讲过,parser将构建一个忠实地表示程序语义的数据结构。这里的AST节点则是一个普通的JavaScript对象,它具有一个type属性,用于指定它是什么类型的节点,还有一些附加信息,附加信息的值可能因 type 而异。 下面是我们语言所有 AST 节点列表: ``` [ /** * 数字(num) * 比如: 123.5 */ { type: "num", value: 123.5 }, /** * 字符串(str) * 比如: "Hello World!" */ { type: "str", value: "Hello World!" }, /** * 布尔值(bool) * 比如: true、false */ { type: "bool", value: true }, { type: "bool", value: false }, /** * 标识符(var) * 比如: x */ { type: "var", value: "x" }, /** * 函数表达式(lambda or λ) * 比如: lambda (x) 10 或者 λ (x) 10 */ { type: "lambda", vars: ["x"], body: { type: "num", value: 10 } }, /** * 函数调用(call) * 比如:foo(a, 1) */ { type: "call", func: { type: "var", value: "foo" }, args: [ { type: "var", value: "a" }, { type: "num", "value": 1 } ] }, /** * 条件语句(if) * 比如:if foo then bar else baz */ { type: "if", cond: { type: "var", value: "foo" }, then: { type: "var", value: "bar" }, else: { type: "var", value: "baz" } }, // 注:else分支是可选的 // 比如:if foo then bar { type: "if", cond: { type: "var", value: "foo" }, then: { type: "var", value: "bar" } }, /** * 赋值表达式(assign) * 比如:a = 10 */ { type: "assign", operator: "=", left: { type: "var", value: "a" }, right: { type: "num", value: 10 } }, /** * 二元表达式(binary) * 比如:x + y * z */ { type: "binary", operator: "+", left: { type: "var", value: "x" }, right: { type: "binary", operator: "*", left: { type: "var", value: "y" }, right: { type: "var", value: "z" } } }, /** * 表达式序列(prog) * 比如: * { a = 5; b = a * 2; a + b; } */ { type: "prog", prog: [{ type: "assign", operator: "=", left: { type: "var", value: "a" }, right: { type: "num", value: 5 } }, { type: "assign", operator: "=", left: { type: "var", value: "b" }, right: { type: "binary", operator: "*", left: { type: "var", value: "a" }, right: { type: "num", value: 2 } } }, { type: "binary", operator: "+", left: { type: "var", value: "a" }, right: { type: "var", value: "b" } }] } ] ```