【编译原理系列】词法分析与有限自动机
詞法分析
編譯器中唯一與源程序打交道的部分;規定所有合法輸入+識別合法輸入
任務:
工作方式:
詞法
詞法的雙重含義:
- 規定單詞形成的規則,也被稱為構詞規則或詞法規則
- 作用相當于立法,規定什么樣的輸入序列是語言所允許的合法單詞
- 根據構詞規則識別輸入序列,也被稱為詞法序列
- 作用相當于執法,根據規則識別出合法的單詞和指出非法的輸入序列
模式pattern:
- 產生和識別元素的規則
記號token:
- 按照某個模式(或規則)識別出的元素(一組),包含記號的類別和記號的值
單詞lexeme:
- 被識別出的元素自身的值(一個),也稱為詞值
字典:
- 預先定義且內容不變的記號表
基本分類
- 關鍵字/保留字kw(key word/reserved word)
- 標識符id(identifier)
- 字面量literal
- 常數字面量
- 整型、實型、枚舉
- 字符串字面量
- 常數字面量
- 特殊符號ks(key symbol/special symbol)
- 運算符
- 分隔符,例如",'
模式的形式化描述
語言L是有限字母表∑上有限長度字符串的集合
字符串
基本概念:
| $\ | S\ |
| εεε | $\ |
| S1S2 | 字符串的連接 |
| SnS^nSn | 連續n個S的連接 |
| S的前綴X | “abc”的前綴可以是:ε,a,ab,abcε, a, ab, abcε,a,ab,abc |
| S的后綴X | “abc”的后綴可以是:ε,c,bc,abcε, c, bc, abcε,c,bc,abc |
| S的子串X | “abc”的子串可以是:ε,a,b,c,…ε, a, b, c, …ε,a,b,c,… |
| S的真前綴 | X是S的前綴,并且具有性質:$X!=S\ and\ \ |
| S的真后綴 | X是S的后綴,并且具有性質:$X!=S\ and\ \ |
| S的真子串 | X是S的真子串,并且具有性質:$X!=S\ and\ \ |
| S的子序列X | S中去掉0或若干個不一定連續的字符后形成的字符串 |
集合操作:
| ?\phi? | 空集合,即元素個數為0的集合 |
| {ε}\{ε\}{ε} | 空串作為唯一元素的集合 |
| X=L∪MX=L∪MX=L∪M | X是集合L和M的并: $X={s\ |
| X=L∩MX=L∩MX=L∩M | X是集合L和M的交: $X={s\ |
| X=LMX=LMX=LM | X是集合L和M的連接: $X={st\ |
| X=L?MX=L-MX=L?M | X是集合L和M的差: $X={s\ |
| X=L?X=L^*X=L? | X是集合L和M的(星)閉包: X=L0∪L1∪L2∪…X=L^0∪L^1∪L^2∪…X=L0∪L1∪L2∪…,其中L0={ε}L^0=\{ε\}L0={ε} |
| X=L+X=L^+X=L+ | X是集合L和M的正閉包: X=L1∪L2∪L3∪…X=L^1∪L^2∪L^3∪…X=L1∪L2∪L3∪… |
正規式
記號=正規式記號=正規式記號=正規式,讀作:記號定義為正規式或者記號是正規式
令Σ是一個有限字母表,則Σ上的正規式及其表示的集合遞歸定義如下:
(a) r∣sr|sr∣s是正規式,表示集合L(r)∪L(s)L(r)∪L(s)L(r)∪L(s)
(b) rsrsrs是正規式,表示集合L(r)L(s)L(r)L(s)L(r)L(s)
(c) r?r^*r?是正規式,表示集合(L(r))?(L(r))^*(L(r))?,
(d)(r)(r)(r)是正規式,表示的集合仍然是L(r)L(r)L(r)【加括弧改變優先級、結合性】
可用正規式描述的語言稱為正規語言或正規集
優先級
- (從高到低順序排列為)閉包運算、連接運算、或運算
結合性
- 三種運算均具有左結合性質
正規集是一個集合,而正規式是表示正規集的一種方法
-
不同正規式也可以表示同一個正規集,即正規式與正規集之間是多對一的關系
-
若正規式P和Q表示了同一個正規集,則稱P和Q是等價的,記為P=Q
代數性質:
| r∥(s∥t)=(r∥s)∥tr \| (s \| t)=(r \| s) \| tr∥(s∥t)=(r∥s)∥t | εr=rε=rεr=rε=rεr=rε=r |
| r(s∥t)=rs∥rtr(s \| t)=rs \| rtr(s∥t)=rs∥rt | r?=(r+∥ε)r^*=(r^+ \| ε)r?=(r+∥ε) |
| (s∥t)r=sr∥tr(s \| t)r=sr \| tr(s∥t)r=sr∥tr | r??=r?r^{**}=r^*r??=r? |
其它:
- 可缺省,r?=r∣εr?=r|εr?=r∣ε,因為ε不可以用鍵盤直接鍵入,?與*具有相同的運算優先級
- 字符組[r],有兩種形式
- 枚舉,如[abc]=a∣b∣c[abc]=a|b|c[abc]=a∣b∣c
- 分段,如[0?9a?z][0-9a-z][0?9a?z],注意左邊界小于右邊界
- 非字符組[[[^r]=∑?L(r)r]=\sum-L(r)r]=∑?L(r)
- 串,”r”,用來避免與正規式中運算符的沖突
- 輔助定義式:名字=正規式,是為復雜的或重復出現的正規式命名,并在以后的使用中用名字代替正規式
有限自動機
所謂有限,是指自動機的狀態數是有限的
NFA
- NFA: Nondeterministic Finite Automaton不確定的有限自動機
NFA是一個五元組(5-tuple):M =(S,∑,move,s0s_0s0?,F),其中
- (1) S是有限個狀態(state)的集合;
- (2) ∑是有限個輸入字符(包括ε)的集合;
- (3) move是一個狀態轉移函數,move(sis_isi?,ch)=sjs_jsj?表示,當前狀態sis_isi?下若遇到輸入字符ch,則轉移到狀態sjs_jsj?;
- (4)s0s_0s0?是唯一的初態(也稱開始狀態);
- (5) F是終態集(也稱接受狀態集),它是S的子集,包含了所有的終態
表示方式
狀態轉換圖
用一個有向圖來直觀表示NFA
- NFA中的每個狀態,對應轉換圖中的一個節點
- NFA中的每個move(si, a)=sj,對應轉換圖中的一條有向邊
- 需滿足最長匹配原則
初態:除去環后沒有前驅的節點
狀態轉換矩陣
用一個矩陣來直觀表示NFA
-
矩陣中,狀態對應行,字符對應列
-
一般矩陣第一行所對應的狀態為初態,而終態需要特別指出
識別記號的特點
具有不確定性,即在當前狀態下對同一字符有多于一個的下一狀態轉移
具體體現:
- (定義)move函數是1對多的
- (狀態轉移圖)同一狀態有多于一條邊標記相同字符轉移到不同的狀態
- (狀態轉移矩陣)M[si, a]是一個狀態的集合
方法與問題
方法:反復試探所有路徑,直到到達終態,或者到達不了終態
問題:
DFA
- DFA: Deterministic Finite Automaton確定的有限自動機
DFA是NFA的一個特例,其中:
-
(1)沒有狀態具有ε狀態轉移(ε_transition),即狀態轉換圖中沒有標記ε的邊;
-
(2)對每個狀態s和每個字符a,最多有一個下一狀態。
識別記號的特點
具有確定性
- 即在當前狀態下對同一字符最多只有一個的下一狀態轉移
具體體現:
- (定義)move函數是1對1的
- (狀態轉移圖)從一個節點出發的邊上標記均不相同
- (狀態轉移矩陣)M[si, a]是一個狀態
- 且字母表不包括ε\varepsilonε
將在DFA上識別輸入序列的過程形式化為算法,該算法被稱為模擬器(模擬DFA的行為)或驅動器(用DFA的數據驅動分析動作);
算法與DFA一起,即構成識別記號的詞法分析器的核心。它的最大特點是算法與模式無關,僅DFA與模式相關。
有限自動機的等價
若有限自動機M和M’識別同一正規集,則稱M和M’是等價的,記為M=M’。
模擬DFA
s:=s0; ch:=nextchar; -- 初值 while ch≠eof -- 循環loop s:=move(s,ch); ch:=nextchar; end loop; if s is in F then return “yes”; -- 返回 else return “no”; end if;NFA與DFA
NFA:與正規式有對應關系,易于構造,狀態數少
DFA:確定性便于記號識別,不易構造,狀態數可能多
對于任何一個NFA,均可以找到一個與它等價的DFA
總結
以上是生活随笔為你收集整理的【编译原理系列】词法分析与有限自动机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle字符串连接的方法
- 下一篇: springboot crm客户关系管理