我想了解JS是如何被解析的。但是,我的搜索或者返回一些非常模糊的「解析器/生成器」項目(我甚至不知道這意味着什麼),或者如何使用JS引擎使用神奇的「解析」方法解析JS。我不想掃描一堆代碼,並嘗試一生去理解(儘管我可以,但這需要很長時間)。JavaScript解析器如何工作?
我想知道JS代碼的一個任意字符串是如何變成對象,函數,變量等。我也想知道程序和技術,將字符串變成東西,獲取存儲,引用,執行。
有沒有這方面的任何文件/參考?
我想了解JS是如何被解析的。但是,我的搜索或者返回一些非常模糊的「解析器/生成器」項目(我甚至不知道這意味着什麼),或者如何使用JS引擎使用神奇的「解析」方法解析JS。我不想掃描一堆代碼,並嘗試一生去理解(儘管我可以,但這需要很長時間)。JavaScript解析器如何工作?
我想知道JS代碼的一個任意字符串是如何變成對象,函數,變量等。我也想知道程序和技術,將字符串變成東西,獲取存儲,引用,執行。
有沒有這方面的任何文件/參考?
解析器可能以各種方式工作,但從根本上說,它們首先要經歷一個標記化階段,然後將結果提供給編譯器,如果可以的話,它會將其轉化爲程序。例如,給定:
function foo(a) {
alert(a);
}
解析器將刪除任何前導空格的第一個字符,字母「F」。它將收集字符,直到它獲得不屬於的東西,即指示標記結束的空白。它再次以「foo」的「f」開始,直到它到達「(」,所以它現在有令牌「function」和「foo」。它知道「(」是它自己的一個標記,所以這是3然後得到「a」,然後是「)」,這是另外兩個令牌5,依此類推
唯一需要空白的是標記,否則它們是不明確的(例如,必須有空白或者「function」和「foo」之間的另一個標記)
一旦標記化完成,它將進入編譯器,編譯器將「function」視爲標識符,並將其解釋爲關鍵字「function」。 「foo」是語言語法告訴它的標識符是函數名稱,然後「(」表示開放分組操作符,因此表示形式參數列表的開始,等等。
編譯器可能會一次處理一個令牌,或者可能會以大塊的形式抓取它們,或者做各種奇怪的事情以使它們運行得更快。
您還可以閱讀How do C/C++ parsers work?,它提供了一些線索。或者只是使用Google。
儘管它與真正的JS引擎的工作方式並不完全一致,但您可能有興趣閱讀Douglas Crockford關於Top Down Operator Precedence的文章,其中包括一個小型工作詞法分析器的代碼和用它解析的Javascript子集編寫的解析器。這是非常可讀和簡潔的代碼(附帶很好的解釋),它至少給你一個真正的實現可能如何工作的綱要。
比Crockford的「自上而下運算符優先級」更常見的技術是recursive descent解析,它用於JS中JS的完整實現Narcissus。
正如解析任何其他語言一樣,JavaScript也被解析; http://en.wikipedia.org/wiki/Parsing。該文件與定義的語法進行匹配並分解爲令牌。然後解釋它以便執行。 http://en.wikipedia.org/wiki/Interpreter_(computing) – Matt 2012-04-05 08:38:12