詞法分析器和lex工具基本學習

2021-10-24 06:28:52 字數 1912 閱讀 2663

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.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 表示 a 可能出現1次或3次。

\    用來轉義元字元。同樣用來覆蓋字元在此表中定義的特殊意義,只取字元的本意。

^    否定。

|    表示式間的邏輯或。

"《一些符號》"    字元的字面含義。元字元具有。

/    向前匹配。如果在匹配的模版中的「/」後跟有後續表示式,只匹配模版中「/」前 面的部分。如:如果輸入 a01,那麼在模版 a0/1 中的 a0 是匹配的。

( )    將一系列常規表示式分組。

常規表示式舉例

常規表示式    含義

joke[rs]    匹配 jokes 或 joker。

ashis+    匹配 aashis, ashis, aashi, ashi。

(a[b-e])+    匹配在 a 出現位置後跟隨的從 b 到 e 的所有字元中的 0 個或 1個。

Lex 詞法分析器的生成器

1.lex是一種詞法分析器的生成器,作用是將正規表示式轉換成dfa。dfa 確定的有限自動機 有限自動機 是一種用來實現 正規表示式指名的詞法單詞 的計算程式。所以lex是將正規表示式轉換成詞法單詞所對應的乙個c程式,然後傳遞給編譯器的下乙個階段。2.lex由詞法規範生成乙個c程式。4.正規表示式是...

詞法分析器

這是我自己的第一篇部落格,就分享一下最近才做完的編譯原理實驗,詞法分析器。本次實驗中我用mysql資料庫儲存自動機狀態表,這樣做的目的只是為了在後續的課設中可以繼續使用現在的 這一段 並不是太完善,發出來只是為了太完善。裡面還有很多問題,比如對字元和字串的識別,不知道為什麼資料庫無法將 和 轉換到我...

詞法分析器

include using namespace std const int maxn 1e3 10 int n 輸入文字的行數 char buffer maxn maxn 緩衝區 int len maxn 輸入文字每行的列數 struct out 輸出格式 out string a,int b re...