<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## 如何使用 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" } }] } ] ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看