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