一,詞法分析器的作用
詞法分析是編譯的第一階段。詞法分析器主要任務是讀入源程式的輸入字元、將他們組成詞素,生成並輸出乙個詞法單元序列,每個詞法單元對應於乙個詞素。
分析部分:詞法分析、語法分析(簡化編譯器設計、提高編譯器效率、增強編譯器可移植性)
1)詞法單元:詞法單元名和可選的屬性值組成。關鍵字、操作符……
2)模式:詞法單元詞素可能具有的形式,當詞法單元是關鍵字時,模式就是這個關鍵字的字串行
3)詞素:源程式中的乙個字串行,它和某個詞法單元模式匹配。
二,輸入緩衝
1)我們至少向前看乙個字元,才能判斷當前詞素是否到頭。
2)對付大型源程式,需要處理大量字元。處理往往需要很多時間,我們採用兩個交替讀入的緩衝區。(詳見73)
三,詞法單元的規約
1)我們會不會用完緩衝區?通常對於比較長的字串我們採用 」+「的形式鏈結起來。
2)正規表示式:letter_(letter_ | digit) * 表示字母開頭 0個或多個 字母或數字
3)正規表示式例子
a | b
(a | b) (a | b )
aa | ab | ba | bb
a* 由字母a構成的所有串集
(a | b)* 由a和b構成的所有串集
複雜的例子
( 00 | 11 | ( (01 | 10) (00 | 11) * (01 | 10) ) ) * 01001101000010000010111001
3)正規表示式擴充套件
1>乙個或多個例項 一元字尾算符「+」的意思是「乙個或多個例項」,即正規式a+表示乙個或多個a的所有串的集合。算符+和算符*有同樣的優先順序和結合性。代數恒等式 r* = r+ | 和r+ = rr*表達了這兩個算符之間的關係。
2>零個或乙個例項 一元字尾算符?的意思是「零個或乙個例項」,r?是r | 的縮寫。如果r是正規式,那麼(r)?是表示語言l(r)∪的正規式。使用這兩種縮寫,可以用num digit+ (.digit+)? (e (+ | )? digit+)?來描述無符號數。
3>字元組 [abc](其中a、b和c是字母表的符號)表示正規式a | b | c。縮寫字元組[az]表示正規式a | b | … | z。使用字元組,可以用正規式[azaz][azaz09] *描述識別符號。
四,詞法單元的識別
某些狀態為接受狀態或最終狀態,表明已經找到乙個詞素。
1)關係符轉換圖
2)保留字和識別符號轉換圖
3)無符號樹轉換圖
4)空白轉換圖
五,詞法分析器生成工具 lex
1)lex是unix環境下非常著名的工具,主要功能是生成乙個詞法分析器(scanner)的c原始碼,描述規則採用正規表示式(regular expression)。描述詞法分析器的檔案*.l,經過lex編譯後,生成乙個lex.yy.c 的檔案,然後由c編譯器編譯生成乙個詞法分析器。詞法分析器,簡單來說,其任務就是將輸入的各種符號,轉化成相應的識別符號(token),轉化後的識別符號 很容易被後續階段處理
2)用lex穿件乙個詞法分析器
3)lex衝突解決
總是選擇最長的字首,如果最長字首跟多個模式匹配,總是選擇在lex程式中先唄列出的模式
六,有窮自動機
1)有窮自動機可用作描述在輸入串中識別模式的過程,因此也能用作構造掃瞄程式。當然有窮自動機與正規表示式之間有著很密切的關係
2)有限自動機分成確定的和不確定的兩種情況。「不確定」(nondeterministic finite automata ,nfa)的含義是,存在這樣的狀態,對於某個輸入符號,它存在不只一種轉換。確定的和不確定的有限自動機都正好能識別正規集,也就是它們能識別的語言正好是正規式所能表達的語言。
3)nfa組成
4)轉換表
5)從正規表示式r=(a|b) * abb 到nfa
編譯原理第三章 詞法分析
一 詞法分析器 1 功能 輸入源程式,輸出單詞符號 2 單詞符號常常用二元式來表示 單詞種別,單詞符號的屬性 1 單詞種別 通常用整數編碼來表示 一字一種 關鍵字,運算子,界符 按型別 常數 統歸一種 識別符號 2 單詞符號的屬性值 反映單詞特性或特徵的值 3 詞法分析器運作過程 詞法分析器設計 輸...
編譯原理第三章詞法分析總結
這一章我們將從詞法分析器 正規表示式與有限自動機以及語法分析器的自動產生三方面了解詞法分析,但我理解的這張的重點是正規表示式與有限自動機。首先我們來了解一下詞法分析器是什麼 它是一組把輸入的源程式轉換成單詞符號的程式,而語法分析器的構造方法包括兩方面,一方面是根據詞法直接程式設計序即有限自動機的手工...
編譯原理 第三章詞法分析總結
詞法分析 在詞法分析這一章主要通過學習了詞法分析 正規表示式和有限自動機來了解詞法分析器的構造。詞法分析器是執行詞法分析的程式。將源程式輸入詞法分析器後,詞法分析器從左至右逐個字元的對源程式進行掃瞄,輸出相應的單詞符號,把字串形式的源程式改造成為由單詞符號串組成的程式。輸出的單詞符號一般分為 基本字...