词法分析器和lex工具基本学习
詞法分析
lexical analysis,是計(jì)算機(jī)科學(xué)中將字符序列轉(zhuǎn)換為單詞(Token)序列的過程。
進(jìn)行詞法分析的程序或者函數(shù)叫作詞法分析器(Lexical analyzer,簡(jiǎn)稱Lexer),也叫掃描器(Scanner)。
詞法分析器供語法分析器調(diào)用。
詞法分析階段是編譯過程的第一個(gè)階段,是編譯的基礎(chǔ)。
這個(gè)階段的任務(wù)是從左到右一個(gè)字符一個(gè)字符地讀入源程序,即對(duì)構(gòu)成源程序的字符流進(jìn)行掃描然后根據(jù)構(gòu)詞規(guī)則識(shí)別單詞(也稱單詞符號(hào)或符號(hào))。
詞法分析程序可以使用Lex等工具自動(dòng)生成。
編譯程序把一個(gè)源程序翻譯成目標(biāo)程序的工作過程分為五個(gè)階段:詞法分析;語法分析;語義檢查和中間代碼生成;代碼優(yōu)化;目標(biāo)代碼生成。
從輸入字符流中生成單詞的過程叫作單詞化(Tokenization),在這個(gè)過程中,詞法分析器還會(huì)對(duì)單詞進(jìn)行分類。
詞法分析器通常不會(huì)關(guān)心單詞之間的關(guān)系(屬于語法分析的范疇),例如,詞法分析器能夠?qū)⒗ㄌ?hào)識(shí)別為單詞,但并不保證括號(hào)是否匹配。
單詞經(jīng)常使用正則表達(dá)式進(jìn)行定義,像lex一類的詞法分析器生成器就支持使用正則表達(dá)式。
詞法分析的第一階段即掃描器,通常基于有限狀態(tài)自動(dòng)機(jī)。
開發(fā)一個(gè)詞法分析器是在詞法定義的基礎(chǔ)上的,詞法定義需要使用正則表達(dá)式
正則表達(dá)式可以轉(zhuǎn)換為NFA(Non-determinate finite automata 不確定的有窮自動(dòng)機(jī))
NFA可以轉(zhuǎn)換為DFA(determinate finite automata確定的有窮自動(dòng)機(jī))
DFA可以極小化,進(jìn)而使用為開發(fā)詞法分析器的工具
DFA的正式定義
? ? 一個(gè)DFA定義了一個(gè)字符串集合
? ? 每個(gè)字符串是一個(gè)字符的序列,字符屬于∑
? ? 起始狀態(tài)給出生成字符串的起始點(diǎn)
? ? 終端狀態(tài)給出了終點(diǎn)
? ? 轉(zhuǎn)換函數(shù)制定了生成字符串的規(guī)則
Lex 基本
Lex編譯器將輸入的模式轉(zhuǎn)換成一個(gè)狀態(tài)轉(zhuǎn)換圖,并生成相應(yīng)的實(shí)現(xiàn)代碼,并存放到文件lex.yy.c中。
Lex 的常規(guī)表達(dá)式
常規(guī)表達(dá)式是一種使用元語言的模式描述。表達(dá)式由符號(hào)組成。符號(hào)一般是字符和數(shù)字,但是 Lex 中還有一些具有特殊含義的其他標(biāo)記。 下面兩個(gè)表格定義了 Lex 中使用的一些標(biāo)記并給出了幾個(gè)典型的例子。
用 Lex 定義常規(guī)表達(dá)式
字符?? ?含義
A-Z, 0-9, a-z?? ?構(gòu)成了部分模式的字符和數(shù)字。
.?? ?匹配任意字符,除了 \n。
-?? ?用來指定范圍。例如:A-Z 指從 A 到 Z 之間的所有字符。
[ ]?? ?一個(gè)字符集合。匹配括號(hào)內(nèi)的 任意 字符。如果第一個(gè)字符是 ^ 那么它表示否定模式。例如: [abC] 匹配 a, b, 和 C中的任何一個(gè)。
*?? ?匹配 0個(gè)或者多個(gè)上述的模式。
+?? ?匹配 1個(gè)或者多個(gè)上述模式。
??? ?匹配 0個(gè)或1個(gè)上述模式。
$?? ?作為模式的最后一個(gè)字符匹配一行的結(jié)尾。
{ }?? ?指出一個(gè)模式可能出現(xiàn)的次數(shù)。 例如: A{1,3} 表示 A 可能出現(xiàn)1次或3次。
\?? ?用來轉(zhuǎn)義元字符。同樣用來覆蓋字符在此表中定義的特殊意義,只取字符的本意。
^?? ?否定。
|?? ?表達(dá)式間的邏輯或。
"<一些符號(hào)>"?? ?字符的字面含義。元字符具有。
/?? ?向前匹配。如果在匹配的模版中的“/”后跟有后續(xù)表達(dá)式,只匹配模版中“/”前 面的部分。如:如果輸入 A01,那么在模版 A0/1 中的 A0 是匹配的。
( )?? ?將一系列常規(guī)表達(dá)式分組。
常規(guī)表達(dá)式舉例
常規(guī)表達(dá)式?? ?含義
joke[rs]?? ?匹配 jokes 或 joker。
A{1,2}shis+?? ?匹配 AAshis, Ashis, AAshi, Ashi。
(A[b-e])+?? ?匹配在 A 出現(xiàn)位置后跟隨的從 b 到 e 的所有字符中的 0 個(gè)或 1個(gè)。
總結(jié)
以上是生活随笔為你收集整理的词法分析器和lex工具基本学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql三表连接查询 - 使用sqlite
- 下一篇: C++虚函数Demo - Win32 版