日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【编译原理系列】词法分析与有限自动机

發布時間:2024/3/12 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【编译原理系列】词法分析与有限自动机 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

詞法分析

編譯器中唯一與源程序打交道的部分;規定所有合法輸入+識別合法輸入

任務:

  • 濾掉源程序中的無用成分,如注釋、空格、回車等
  • 處理與具體平臺有關的輸入,如文件結束符的不同表示等
  • 根據模式識別記號,并交給語法分析器【主要任務】
  • 調用符號表管理器出錯處理器,進行相關處理
  • 工作方式:

  • 單獨一遍掃描輸出記號流
  • 作為語法分析器的子程序,通過詞法分析器的調用,然后返回記號
  • 與語法分析器并行工作的模式,以生產/消費的形式并行工作,通過隊列存放已生產的“記號”
  • 詞法

    詞法的雙重含義:

    • 規定單詞形成的規則,也被稱為構詞規則或詞法規則
      • 作用相當于立法,規定什么樣的輸入序列是語言所允許的合法單詞
    • 根據構詞規則識別輸入序列,也被稱為詞法序列
      • 作用相當于執法,根據規則識別出合法的單詞和指出非法的輸入序列

    模式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的子序列XS中去掉0或若干個不一定連續的字符后形成的字符串

    集合操作:

    表示、術語意義
    ?\phi?空集合,即元素個數為0的集合
    {ε}\{ε\}{ε}空串作為唯一元素的集合
    X=L∪MX=L∪MX=LMX是集合L和M的并: $X={s\
    X=L∩MX=L∩MX=LMX是集合L和M的交: $X={s\
    X=LMX=LMX=LMX是集合L和M的連接: $X={st\
    X=L?MX=L-MX=L?MX是集合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=L0L1L2,其中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=L1L2L3

    正規式

    記號=正規式記號=正規式=,讀作:記號定義為正規式或者記號是正規式

    令Σ是一個有限字母表,則Σ上的正規式及其表示的集合遞歸定義如下:

  • ε是正規式,它表示集合L(ε)=εL(ε)={ε}L(ε)=ε
  • 若a是Σ上的字符,則a是正規式,它表示集合L(a)=a{a}a
  • 若正規式r和s分別表示集合L?和L(s),則
    (a) r∣sr|srs是正規式,表示集合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=s∥rr \| s=s \| rrs=sr(rs)t=r(st)(rs)t=r(st)(rs)t=r(st)
    r∥(s∥t)=(r∥s)∥tr \| (s \| t)=(r \| s) \| tr(st)=(rs)tεr=rε=rεr=rε=rεr=rε=r
    r(s∥t)=rs∥rtr(s \| t)=rs \| rtr(st)=rsrtr?=(r+∥ε)r^*=(r^+ \| ε)r?=(r+ε)
    (s∥t)r=sr∥tr(s \| t)r=sr \| tr(st)r=srtrr??=r?r^{**}=r^*r??=r?

    其它:

    • 可缺省,r?=r∣εr?=r|εr?=rε,因為ε不可以用鍵盤直接鍵入,?與*具有相同的運算優先級
    • 字符組[r],有兩種形式
      • 枚舉,如[abc]=a∣b∣c[abc]=a|b|c[abc]=abc
      • 分段,如[0?9a?z][0-9a-z][0?9a?z],注意左邊界小于右邊界
    • 非字符組[[[^r]=∑?L(r)r]=\sum-L(r)r]=?L(r)
    • 串,”r”,用來避免與正規式中運算符的沖突
    • 輔助定義式:名字=正規式,是為復雜的或重復出現的正規式命名,并在以后的使用中用名字代替正規式
    char = [a-zA-Z]digit =[0-9]digits =$digit^+$optional_fraction =(.digits)?optional_exponent =(E(+|-)?digits)?id =char(char|digit)*num =digits optional_fraction optional_exponent

    有限自動機

    所謂有限,是指自動機的狀態數有限的

    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

    總結

    以上是生活随笔為你收集整理的【编译原理系列】词法分析与有限自动机的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。