標籤: 暫無標籤

1簡介

詞法分析(英語:lexical analysis)是計算機科學中將字元序列轉換為單詞(Token)序列的過程。進行詞法分析的程序或者函數叫作詞法分析器(Lexical analyzer,簡稱Lexer),也叫掃描器(Scanner)。詞法分析器一般以函數的形式存在,供語法分析器調用。
詞法分析階段是編譯過程的第一個階段,是編譯的基礎。這個階段的任務是從左到右一個字元一個字元地讀入源程序,即對構成源程序的字元流進行掃描然後根據構詞規則識別單詞(也稱單詞符號或符號)。詞法分析程序實現這個任務。詞法分析程序可以使用Lex等工具自動生成。

2單詞

這裡的單詞是一個字元串,是構成源代碼的最小單位。從輸入字元流中生成單詞的過程叫作單詞化(Tokenization),在這個過程中,詞法分析器還會對單詞進行分類。
詞法分析器通常不會關心單詞之間的關係(屬於語法分析的範疇),舉例來說:詞法分析器能夠將括弧識別為單詞,但並不保證括弧是否匹配。
針對如下C語言表達式:
sum=3+2;將其單詞化后可以得到下表內容:
語素
單詞類型
sum
標識符
=
賦值操作符
3
數字
+
加法操作符
2
數字
;
語句結束
單詞經常使用正則表達式進行定義,像lex一類的詞法分析器生成器就支持使用正則表達式。語法分析器讀取輸入字元流、從中識別出語素、最後生成不同類型的單詞。其間一旦發現無效單詞,便會報錯。

3掃描器

掃描器
詞法分析的第一階段即掃描器,通常基於有限狀態自動機。掃描器能夠識別其所能處理的單詞中可能包含的所有字元序列(單個這樣的字元序列即前面所說的「語素」)。例如「整數」單詞可以包含所有數字字元序列。很多情況下,根據第一個非空白字元便可以推導出該單詞的類型,於是便可逐個處理之後的字元,直到出現不屬於該類型單詞字符集中的字元(即最長一致原則)。

4單詞生成器

單詞生成器
單詞化(Tokenization)即將輸入字元串分割為單詞、進而將單詞進行分類的過程。生成的單詞隨後便被用來進行語法分析。
例如對於如下字元串: The quick brown fox jumps over the lazy dog
計算機並不知道這是以空格分隔的九個英語單詞,只知道這是普通的43個字元構成的字元串。可以通過一定的方法(這裡即使用空格作為分隔符)將語素(這裡即英語單詞)從輸入字元串中分割出來。分割后的結果用XML可以表示如下:
<sentence><word>The</word>
<word>quick</word>
<word>brown</word>
<word>fox</word>
<word>jumps</word>
<word>over</word>
<word>the</word>
<word>lazy</word>
<word>dog</word></sentence>
然而,語素只是一類字元構成的字元串(字元序列),要構建單詞,語法分析器需要第二階段的評估器(Evaluator)。評估器根據語素中的字元序列生成一個「值」,這個「值」和語素的類型便構成了可以送入語法分析器的單詞。一些諸如括弧的語素並沒有「值」,評估器函數便可以什麼都不返回。整數、標識符、字元串的評估器則要複雜的多。評估器有時會抑制語素,被抑制的語素(例如空白語素和註釋語素)隨後不會被送入語法分析器。
例如對於某程序設計語言的源程序片段:
net_worth_future = (assets - liabilities);
在進行語法分析后可能生成以下單詞流(空格被抑制):
NAME "net_worth_future"EQUALS
OPEN_PARENTHESIS
NAME "assets"
MINUS
NAME "liabilities"
CLOSE_PARENTHESIS
SEMICOLON
儘管在某些情況下需要手工編寫詞法分析器,一般情況下詞法分析器都用自動化工具生成。
上一篇[語法分析]    下一篇 [目標文件]

相關評論

同義詞:暫無同義詞