簡體   English   中英

JavaScript 解析器如何工作?

[英]How does a JavaScript parser work?

我試圖了解 JS 的實際解析方式。 但是我的搜索要么返回一些非常模糊的“解析器/生成器”項目(我什至不知道那是什么意思),要么返回如何使用神奇的“解析”方法使用 JS 引擎解析 JS。 我不想瀏覽一堆代碼並用我的一生去理解(雖然我可以,但這會花太長時間)。

我想知道 JS 代碼的任意字符串實際上是如何變成對象、函數、變量等的。我還想知道將字符串變成東西、存儲、引用、執行的過程和技術。

是否有任何文檔/參考資料?

解析器可能以各種方式工作,但從根本上講,它們首先 go 通過標記化階段,然后將結果提供給編譯器,如果可以的話,編譯器將其轉換為程序。 例如,給定:

function foo(a) {
  alert(a);
}

解析器將刪除第一個字符(字母“f”)的所有前導空格。 它會收集字符,直到它得到不屬於的東西,即表示令牌結束的空白。 它再次從“foo”的“f”開始,直到它到達“(”,所以它現在有標記“function”和“foo”。它知道“(”本身就是一個標記,所以它是 3令牌。然后它得到“a”,后跟“)”,這是另外兩個令牌,可以組成 5,依此類推。

唯一需要空格的是在其他方面有歧義的標記之間(例如,“function”和“foo”之間必須有空格或另一個標記)。

標記化完成后,它會進入編譯器,編譯器將“函數”視為標識符,並將其解釋為關鍵字“函數”。 然后它得到“foo”,語言語法告訴它的標識符是 function 名稱。 然后“(”表示開始分組運算符,因此表示形式參數列表的開始,依此類推。

編譯器可能一次只處理一個標記,或者分塊抓取它們,或者做各種奇怪的事情來讓它們運行得更快。

您還可以閱讀C/C++ 解析器如何工作? ,這提供了更多線索。 或者只是使用谷歌。

雖然它與真正的 JS 引擎的工作方式並不緊密對應,但您可能有興趣閱讀 Douglas Crockford 關於自上而下運算符優先級的文章,其中包括在它解析的 Javascript 子集中編寫的小型工作詞法分析器和解析器的代碼。 它是非常可讀和簡潔的代碼(附帶很好的解釋),至少可以讓您大致了解實際實現的工作方式。

比 Crockford 的“Top Down Operator Precedence”更常見的技術是遞歸下降解析, Narcissus中使用了它,這是 JS 中 JS 的完整實現。

也許esprima會幫助你理解 JS 是如何解析語法的。 它在線

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM