詞法分析(Lexical Analysis),也稱為掃描(Scanning),是編譯或解釋的第一階段。它將原始碼的字元序列轉換為一系列有意義的標記(Token)。 可以把它想象成把一段文字拆分成一個個單詞和標點符號的過程。
在 JavaScript 中,詞法分析器會讀取 JavaScript 程式碼,並將其分解成一系列的 Token,忽略掉空格、註釋等無關字元。 每個 Token 包含兩部分資訊:
- 型別(Type): 例如關鍵字(
if
,else
,for
)、識別符號(變數名、函式名)、運算子(+
,-
,*
,/
)、字面量(數字、字串、布林值)等等。 - 值(Value): 例如識別符號的名稱、數字的值、字串的內容等等。
JavaScript 詞法分析過程大致如下:
-
輸入: JavaScript 原始碼字串。
-
掃描: 詞法分析器從左到右逐個字元地掃描原始碼。
-
識別: 根據預定義的規則(JavaScript 語法規範),識別出一個個的 Token。例如:
- 遇到字母或下劃線,則認為是一個識別符號或關鍵字的開始,繼續讀取直到遇到非字母數字下劃線的字元。
- 遇到數字,則認為是一個數字字面量的開始,繼續讀取直到遇到非數字的字元。
- 遇到運算子(例如
+
,-
,=
,*
等),則識別為一個運算子 Token。 - 遇到空格、換行符、製表符等空白字元,則忽略它們。
- 遇到
//
或/* ... */
,則識別為註釋,忽略它們。 - 遇到字串字面量(用單引號或雙引號括起來),則讀取直到遇到匹配的引號。
-
生成 Token 流: 將識別出的 Token 按照順序組成一個 Token 流(Token Stream)。
-
輸出: 將 Token 流傳遞給語法分析器(Parser)進行下一步處理。
簡單示例:
假設有如下 JavaScript 程式碼:
let message = "Hello, world!";
經過詞法分析後,會生成如下的 Token 流:
型別 | 值 |
---|---|
關鍵字 | let |
識別符號 | message |
運算子 | = |
字串字面量 | "Hello, world!" |
分號 | ; |
一些更細節的方面:
- 最長匹配原則: 詞法分析器會盡可能匹配最長的 Token。例如,
===
會被識別為一個單獨的 Token,而不是三個=
。 - 自動分號插入 (ASI): JavaScript 引擎會在詞法分析階段嘗試自動插入分號,這可能會導致一些難以除錯的錯誤,因此建議始終手動新增分號。
- Unicode 支援: JavaScript 支援 Unicode 字元,因此識別符號可以使用 Unicode 字元。
- 正規表示式: 詞法分析器也需要處理正規表示式字面量。
總而言之,詞法分析是編譯或解釋的第一步,它將原始碼轉換為一系列 Token,為後續的語法分析奠定了基礎。理解詞法分析的過程對於理解 JavaScript 的工作原理至關重要。