什麼是詞法分析?請描述下js詞法分析的過程?

王铁柱6發表於2024-11-26

詞法分析(Lexical Analysis),也稱為掃描(Scanning),是編譯或解釋的第一階段。它將原始碼的字元序列轉換為一系列有意義的標記(Token)。 可以把它想象成把一段文字拆分成一個個單詞和標點符號的過程。

在 JavaScript 中,詞法分析器會讀取 JavaScript 程式碼,並將其分解成一系列的 Token,忽略掉空格、註釋等無關字元。 每個 Token 包含兩部分資訊:

  • 型別(Type): 例如關鍵字(if, else, for)、識別符號(變數名、函式名)、運算子(+, -, *, /)、字面量(數字、字串、布林值)等等。
  • 值(Value): 例如識別符號的名稱、數字的值、字串的內容等等。

JavaScript 詞法分析過程大致如下:

  1. 輸入: JavaScript 原始碼字串。

  2. 掃描: 詞法分析器從左到右逐個字元地掃描原始碼。

  3. 識別: 根據預定義的規則(JavaScript 語法規範),識別出一個個的 Token。例如:

    • 遇到字母或下劃線,則認為是一個識別符號或關鍵字的開始,繼續讀取直到遇到非字母數字下劃線的字元。
    • 遇到數字,則認為是一個數字字面量的開始,繼續讀取直到遇到非數字的字元。
    • 遇到運算子(例如 +, -, =, * 等),則識別為一個運算子 Token。
    • 遇到空格、換行符、製表符等空白字元,則忽略它們。
    • 遇到 ///* ... */,則識別為註釋,忽略它們。
    • 遇到字串字面量(用單引號或雙引號括起來),則讀取直到遇到匹配的引號。
  4. 生成 Token 流: 將識別出的 Token 按照順序組成一個 Token 流(Token Stream)。

  5. 輸出: 將 Token 流傳遞給語法分析器(Parser)進行下一步處理。

簡單示例:

假設有如下 JavaScript 程式碼:

let message = "Hello, world!";

經過詞法分析後,會生成如下的 Token 流:

型別
關鍵字 let
識別符號 message
運算子 =
字串字面量 "Hello, world!"
分號 ;

一些更細節的方面:

  • 最長匹配原則: 詞法分析器會盡可能匹配最長的 Token。例如,=== 會被識別為一個單獨的 Token,而不是三個 =
  • 自動分號插入 (ASI): JavaScript 引擎會在詞法分析階段嘗試自動插入分號,這可能會導致一些難以除錯的錯誤,因此建議始終手動新增分號。
  • Unicode 支援: JavaScript 支援 Unicode 字元,因此識別符號可以使用 Unicode 字元。
  • 正規表示式: 詞法分析器也需要處理正規表示式字面量。

總而言之,詞法分析是編譯或解釋的第一步,它將原始碼轉換為一系列 Token,為後續的語法分析奠定了基礎。理解詞法分析的過程對於理解 JavaScript 的工作原理至關重要。

相關文章