<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 如何使用 JavaScript 實現一門編程語言(2) —— 編寫一個解析器 編寫語言解析器是一項適度復雜的任務。實質上,它必須將一段代碼(我們所看到的一堆字符)轉換為“抽象語法樹”(AST)。 AST是程序在內存中一種結構化的表達方式,它是“抽象”的,因為它不關心源代碼是由哪些字符組成的,而是忠實地表示它的語義。我寫了一個單獨的頁面來描述我們的AST。 例如,對于以下程序文本: ``` sum = lambda(a, b) { a + b; }; print(sum(1, 2)); ``` 我們的解析器將生成以下AST,其實也就是一個JavaScript對象: ``` { type: "prog", prog: [ // first line: { type: "assign", operator: "=", left: { type: "var", value: "sum" }, right: { type: "lambda", vars: [ "a", "b" ], body: { // the body should be a "prog", but because // it contains a single expression, our parser // reduces it to the expression itself. type: "binary", operator: "+", left: { type: "var", value: "a" }, right: { type: "var", value: "b" } } } }, // second line: { type: "call", func: { type: "var", value: "print" }, args: [{ type: "call", func: { type: "var", value: "sum" }, args: [ { type: "num", value: 1 }, { type: "num", value: 2 } ] }] } ] } ``` 編寫解析器的主要困難在于不能正確地組織代碼。解析器是一種更高級的處理字符串的方式。關于如何保持解析器復雜度的可管理性的,我有幾點建議: - 編寫多個功能模塊并將它們保持較少的邏輯。在每一項功能模塊中中,做好一件事! - 不要嘗試使用正則表達式進行解析。他們并不能派上用場,雖然正則對詞法分析器有所幫助,但我建議將它們限制在做非常簡單的事情上。 - 不要試圖猜測代碼的意圖。如果不確定如何解析某些內容,請拋出錯誤消息,并確保該消息包含錯誤的位置(行/列)。 為了簡單起見,我將代碼分為三部分,它們又分為許多小函數:[Input stream](http://annn.me/implement-a-programming-language-3)、[Token stream](http://annn.me/implement-a-programming-language-4)、[AST](http://annn.me/implement-a-programming-language-5)
                  <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>

                              哎呀哎呀视频在线观看