- 用Go語言自制解釋器
- (德)索斯藤·鮑爾
- 7字
- 2022-06-17 10:50:30
第1章 詞法分析
1.1 詞法分析
為了跟源代碼打交道,我們需要將其轉換為更易訪問的形式。在編輯器中,源代碼就像純文本那樣易于處理。但是如果在一門編程語言中將字符形式的源代碼作為另一門編程語言來解釋,就沒那么簡單了。
為了解釋源代碼,需要將其轉換成其他易于處理的形式。具體來說,在最終對代碼求值之前,需要兩次轉換源代碼的表示形式,如圖1-1所示。

圖1-1
第一次是用詞法分析器將源代碼轉換為詞法單元,這個過程稱為詞法分析。詞法分析器有時也稱詞法單元生成器(tokenizer)或掃描器(scanner)。有些資料用這些術語表示在行為上有細微差別的程序,但它們在本書中都是一個意思。
詞法單元本身是短小、易于分類的數據結構。它會被傳給語法分析器。在第二次轉換中,語法分析器會將詞法單元轉換成抽象語法樹。
來看一個例子。這是給詞法分析器的輸入:
"let x = 5 + 5;"
其生成的結果如下所示:
[
LET,
IDENTIFIER("x"),
EQUAL_SIGN,
INTEGER(5),
PLUS_SIGN,
INTEGER(5),
SEMICOLON
]
所有這些詞法單元都附帶了對應的源代碼表示形式。LET
附帶的是let
;PLUS_SIGN
附帶的是+
,以此類推。上例中的IDENTIFIER
和INTEGER
也附帶了具體值:INTEGER
附帶的是數值5
(不是字符串"5"
);IDENTIFIER
附帶的是字符串"x"
。不同詞法分析器實現所生成的詞法單元會有所區別。例如,某些詞法分析器在解析階段或更靠后的階段才會將字符串"5"
轉換為整數,而有些是在構造詞法單元的時候就轉換。
這個例子中有一點需要注意,那就是空白字符不會被識別成詞法單元。這完全沒問題,因為在Monkey語言中,空白的長度對代碼含義沒有影響,僅用于充當其他詞法單元的分隔符。來看下面的代碼:
let x = 5;
以下代碼的含義與上面的相同:
let x = 5;
在Python等其他語言中,空白的長度會影響代碼含義。這意味著此時詞法分析器不能直接跳過空白字符和換行符,而必須將其輸出為詞法單元。之后語法分析器會處理這些詞法單元,要么賦予特定的含義,要么在空白字符數量不合要求的時候報錯。
具有完整功能的詞法分析器還可以將行號、列號和文件名附加到詞法單元中。這么做是為了在后面的語法分析階段輸出更有用的報錯消息。例如,相比于"error: expected semicolon token"
,下面這條報錯消息更詳細:
"error: expected semicolon token. line 42, column 23, program.monkey"
不過本書不會在這方面花費精力,不是因為添加這些信息很麻煩,而是因為這會讓詞法單元和詞法分析器變得更加復雜,增加理解難度。
- Java程序設計與開發
- JavaScript高效圖形編程
- Beginning Java Data Structures and Algorithms
- Android Studio Essentials
- Learning Data Mining with Python
- 數據結構(Python語言描述)(第2版)
- Java性能權威指南(第2版)
- INSTANT Mercurial SCM Essentials How-to
- PLC編程及應用實戰
- HTML5 and CSS3 Transition,Transformation,and Animation
- 低代碼平臺開發實踐:基于React
- 微服務從小白到專家:Spring Cloud和Kubernetes實戰
- Python Machine Learning Blueprints:Intuitive data projects you can relate to
- Learning iOS Security
- Mastering Adobe Captivate 7