03 | 词法分析程序与有穷自动机
03 | 詞法分析程序與有窮自動機
- 詞法分析程序概述
- 正規式與正規集
- 正規文法與正規式
- 正規式與有窮自動機
- 確定有窮自動機(DFA)
- 非確定有窮自動機(NFA)
- 二者對比
- 正規式構造有窮自動機
- 有窮自動機轉換為正規式
- 正規文法與有窮自動機
- 右線性正規文法轉換為有窮自動機
- 左線性正規文法轉換為有窮自動機
- 有窮自動機轉換為正規文法
- 詞法分析程序的編寫方法
詞法分析程序概述
詞法分析: 詞法分析的任務是對字符串表示的源程序從左到右地進行掃描和分解,根據語言的詞法規則識別出一個一個具有獨立意義的單詞符號。
詞法分析器(掃描器): 執行詞法分析的程序。
- 輸入:字符串形式的源程序
- 輸出:單詞符號或單詞符號表示的源程序。單詞符號通常表示成 二元式(單詞種別,單詞自身的值)。
語言的單詞符號: 語言中具有獨立意義的最小語法單位,即單詞符號是程序語言的基本語法單位。
程序的單詞符號一般包括:關鍵字(基本字)、標識符、常數、運算符、界符。
單詞種別:
單詞種別表示單詞的種類,它是語法分析需要的信息,一個語言的單詞符號如何劃分種類、分成幾個種類、怎樣編碼,這是一個技術性的問題,它主要取決于處理上的方便。
通常的方法是讓每種單詞對應一個整數碼,其目的是最大限度地把各個單詞區別開來。基本字可將其全體視為一種,也可以一字一種。采用一字一種的分法處理起來較為方便。標識符一般統歸為一種。常數可統歸為一種,也可按類型(整型、實型、布爾型等)分種。運算符和界符可采用一符一種的分法,也可以統歸為一種。
單詞自身的值:
單詞自身的值是編譯中其他階段所需要的信息??刹捎孟旅娴姆椒▉泶_定它的值。
- 如果一個種別只含一個單詞符號,那么對于這個單詞符號,種別編碼就完全代表它自身的值。
- 如果一個種別含有多個單詞符號,那么對于它的每個單詞符號,除了給出種別編碼之外,還應給出單詞符號的自身值,以便把同一種類的單詞區別開來。標識符自身值是標識符自身的字符串;常數自身值是常數本身的二進制數值。我們也可用指向某類表格中一個特定項目的指針值來區分同類中不同的單詞。
例如,對于標識符,用它在符號表的入口指針作為它自身值;常數用它在常數表的入口指針作為它的自身值。
通常將詞法分析程序設置為語法分析程序的子程序。每當語法分析程序需要一個單詞符號時,就向詞法分析程序發出“取下一個單詞符號”的調用命令(GetNextToken / Scanner)。詞法分析程序就從輸入字符串中,識別出一個具有獨立意義的單詞符號。
如下圖所示:
一個例子:
正規式與正規集
正規集,簡單來說就是程序語言的合法單詞的集合。
正規式中包含3種運算符:連接“.”(一般可省略不寫)、或“|”、閉包“*”。三者均為左結合,優先級為:閉包 > 連接 >或。
正規式與正規集的定義如下:
舉例如下:
如果兩個正規表達式 R1、R2 描述的正規集相同,則稱這兩個正規式等價,記作 R1 = R2。
如:
正規式的性質:
除了兩非空正規式不滿足交換律、結合律、分配律,其余運算的性質如下:
正規文法與正規式
正規文法與正規式都是描述正規集的工具。
對任一個正規文法,存在定義同一語言的正規式;對任一正規式存在一個生成同一語言的正規文法。
正規文法到正規式的轉換:
(1)將正規文法中的每個非終結符表示成關于它的一個正規式方程,獲得一個聯立方程組(用 “+” 代替 “ | ”);
(2)盡量將要求的式子轉換成求解規則:
- 若 x=αx | β(或x=αx+β),則解為x=α*β;
- 若 x=xα | β(或x=xα+β),則解為x=βα*;
再根據正規式的分配律、交換律和結合律求關于文法開始符號的正規式方程組的解。這個解是關于該文法開始符號S的一個正規式,表示了由該正規文法所描述的語言。注意最后將 “+” 換回 “ | ” 。(有時可以在求出一個非終結符的正規式后將其代入另一個非終結符的式子,即可得到相應語言的正規式)。
正規式到正規文法的轉換:
一個例子:
正規式與有窮自動機
有窮自動機包括 “確定的” 與 “非確定的” 兩種,二者都能準確地識別正規集。
確定有窮自動機(DFA)
Deterministric Finite Automata
一個確定的有窮自動機 M 是一個五元組 M=(Q,∑,f,S,Z) :
- Q: 有窮狀態集合,每個元素為一個狀態
- ∑:有窮輸入字母表,每個元素為一個輸入字符
- S:唯一的初態,S∈Q
- Z:終態的集合,可以有多個終態,也可為空,Z?Q
- f :從 Q×∑ 到 Q 的單值映射,f(qi,a)= qj,qi,、 qj∈Q,a∈∑,a不允許為空串(?待確認)(當前狀態qi,輸入a時,轉換到下一狀態qj),qj為qi的一個后繼狀態。
為單值函數,f(qi,a)唯一確定下一個要轉移的狀態,每個狀態的所有輸入邊上標記的輸入字符不同。
狀態轉換矩陣(轉換表):
用一個矩陣表示一個DFA,行為狀態,列為輸入符號,矩陣元素表示 f(q,a)的值。
狀態轉換圖:
初態用 ? 指向表示,終態用雙圓圈表示。DFA只有一個初態,可以有若干個終態。
一個例子:
這個狀態圖里的狀態q1其實是一個多余狀態,因為它無法指向終態,一旦進入狀態q1就相當于陷入了死循環。
可識別的語言:
非確定有窮自動機(NFA)
Nondeterministric Finite Automata
一個非確定的有窮自動機 M 是一個五元組 M=(Q,∑,f,S,Z) ,狀態集Q、輸入表∑、終態集Z的含義與DFA相同,此處不再贅述,下述意義不同的兩項:
- S 為非空初態集,即允許有多個初態(不同于DFA,DFA只允許有一個初態),S?Q
- 狀態轉換函數 f 是多值函數,而非單值函數,允許同一狀態對同一輸入字符有不同的輸出邊:
NFA的狀態轉換矩陣、狀態轉換圖與上述DFA類似,此處不再贅述,一個例子:
可識別的語言:
二者對比
正規式構造有窮自動機
Step1 由正規式構造NFA:
Step2 NFA確定為DFA:
子集法: DFA的每一個狀態代表NFA狀態集合的某個子集,DFA使用它的狀態去記錄在NFA讀入輸入符號之后可能到達的所有狀態的集合。
理解子集法:
構造DFA:
說明一點,在確定DFA的終態時,凡是包含原來NFA終態的集合均為終態。
Step3 DFA的化簡:
對于一個NFA,將其確定化之后可能得到多個DFA,但是我們需要一個最簡的DFA,它的狀態數目最少。這樣在計算機實現時也會更優。
首先明確兩個概念:
多余狀態: 有窮自動機的多余狀態是指從該自動機的開始狀態出發,任何可識別的輸入串都不能到達的狀態。(此處注意區分,一些狀態可能無論經過怎樣的輸入都無法到達終態,此時對于該自動機識別的語言來說,這些狀態是多余的,但是這些狀態并不是 多余狀態)。
等價狀態: 對于兩個狀態,無論輸入什么,總能進入完全一樣的下一個狀態,這樣的兩個狀態為等價狀態:
而一個DFA M 的化簡就是尋找一個狀態數比M 少的 DFA M’,使得 L(M)=L(M’),化簡了的 DFA M’ 滿足兩個條件:
- 沒有多余狀態
- 狀態集中沒有兩個狀態是相互等價的
化簡方法:
有窮自動機轉換為正規式
對于∑上的NFA M,構造∑上的一個正規表達式 R,使得 L(M)=L?。
具體方法:
正規文法與有窮自動機
右線性正規文法轉換為有窮自動機
左線性正規文法轉換為有窮自動機
有窮自動機轉換為正規文法
詞法分析程序的編寫方法
Page 51(待補充)
總結
以上是生活随笔為你收集整理的03 | 词法分析程序与有穷自动机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PC偏振控制器、锁模激光器技术、AOM声
- 下一篇: Hive正则表达式案例总结