官术网_书友最值得收藏!

第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附帶的是letPLUS_SIGN附帶的是+,以此類推。上例中的IDENTIFIERINTEGER也附帶了具體值: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"

不過本書不會在這方面花費精力,不是因為添加這些信息很麻煩,而是因為這會讓詞法單元和詞法分析器變得更加復雜,增加理解難度。

主站蜘蛛池模板: 高清| 湖北省| 宕昌县| 克东县| 城步| 定陶县| 剑河县| 峨山| 明水县| 海南省| 富川| 常山县| 瑞金市| 江西省| 公主岭市| 上杭县| 黄梅县| 洛浦县| 奉化市| 章丘市| 龙游县| 岳普湖县| 和田市| 汉寿县| 德兴市| 湘乡市| 东乌珠穆沁旗| 东明县| 西丰县| 山阴县| 临邑县| 峨眉山市| 临邑县| 包头市| 舞钢市| 江陵县| 思茅市| 丹巴县| 井陉县| 高青县| 怀宁县|