Engineering a Compiler讀書筆記(2)

在這裏插入圖片描述


詞法分析器

簡介
|| 詞法分析流程:
讀取字符流,,並應用一組規則來判斷每個單詞在源語言中是否合法,如果單詞判斷爲有效,則會給它分配一個詞類,將其聚合形成單詞流。

|| 手工編寫的詞法分析器因爲避免了很多不必要的開銷,故比生成的詞法分析器,帶來極大的性能優勢的好處,往往超出了自動生成語法分析器的便利性帶來的好處

|| 程序設計語言的詞法結構(微語法):規定了如何將字符組合爲單詞
(注意:語法是對單詞進行分類,組成句子)

|| 什麼是有效標識符:大部分語言中標識符爲 始於一個字母字符,後接上0個或多個字母/數字字符,結束於第一個非字母或數字的字符
eg:有效的標識符:dd55d88dd,fffff。無效的標識符:12fff

|| 關鍵字(保留字):有特殊含義的有效標識符,詞法分析器會自動將其歸類到另一個語法範疇中去 eg:static,while,if

|| 對於識別一個單詞的FA來說,單詞對應的實際文本稱爲*“詞素”*


識別單詞

|| 識別器的轉移圖:每個圓圈都代表計算中的一個抽象狀態
s0是初始狀態,s5是接受狀態(以雙層圓圈繪製),通常神略目標爲錯誤狀態的轉移
以下爲關鍵字“while”的識別示例:
在這裏插入圖片描述
以下爲new和not的識別器:
在這裏插入圖片描述
合併識別器:
在這裏插入圖片描述

|| 識別器的形式化: 有限自動機
(對於一個識別器(識別單詞程序),我們將其轉換圖用五元組進行數學表示,則稱該五元組爲有限自動機,描述了識別器的規格)
完整解釋:對於需要實現轉移圖的代碼,轉移圖就是這些代碼的抽象。我們將這些轉移圖看作形式化的數學對象時,稱其爲有限自動機(FA),它定義了識別器的規格。在形式上有限狀態機是一個五元組(S, Σ, δ, s0,SA),各分量的含義如下:

  • S是識別器中的有限狀態集,以及一個錯誤狀態se
  • Σ是識別器使用的有限字母表。通常,Σ即轉移圖中邊的標籤合集
  • δ(s,c)是識別器的轉移函數,它將每個狀態的s∈S和每個字符每個字符c∈Σ的組合(s, c)映射到下一個狀態。例如在狀態si遇到輸入字符c,FA將採用轉移si —> δ(si, c)
  • s0 是S中指定的起始狀態
  • SA 是S中的接受狀態集合

因此上面轉化圖的FA形式如下:
在這裏插入圖片描述
|| 因此FA接受字符串s = x1x2x3, …, xn的充要條件爲:
在這裏插入圖片描述

|| 注意事項:

  1. 對於FA有兩種錯誤:
    第一種是詞法錯誤,某個字符將FA莊轉移到了錯誤狀態se
    第二種是前綴問題,FA耗盡了輸出流(即遍歷了字符串所有字符後),停留在了se之外的非接受狀態。(這說明是前綴)
  2. FA對於每個輸入字符都會進行一次狀態轉移,直至耗盡輸入流,因此高效實現的FA,識別器的運行時間於輸入字符串的長度成正比

|| 識別一類單詞的FA:有環轉移圖的形式化
以下爲所有正整數的識別器轉移圖:
在這裏插入圖片描述
以下爲其有環簡化:
在這裏插入圖片描述
由上圖可以看出,該識別器可以識別一類字符串(無符號整數),因此這個FA是在語法範疇上(識別出一個詞類)進行識別。

|| 表示一類的FA,其分量δ可以用表格來高效定義:
在這裏插入圖片描述


正則表達式

|| 正則語言的定義:
在有限自動機FA中所接受的單詞的集合,形成了一種語言。我們還可以用正則表達式(RE)的符號表示法來更簡潔地表述該語言。通過RE描述的語言叫做正則語言

|| 正則表達式基本的語法規則
在這裏插入圖片描述
在這裏插入圖片描述
|| 優先級:括號>求補>閉包>連接>選擇

|| 一些特殊的閉包
在這裏插入圖片描述

|| 小插話:

  1. 很多語言中的通配符 --”*“,其實就是RE Σ*的簡寫
  2. 字符串的RE: “(^ ") *
    註釋的RE:在這裏插入圖片描述或者在這裏插入圖片描述

從正則表達式到詞法分析器

|| 區分非確定性FA和確定性FA
NFA(非確定性有限自動機):允許在空串∈(RE空集)轉移的FA
DFA(確定性有限自動機):不允許在空串∈(RE空集)轉移的FA

|| 空串∈轉移在RE轉換爲FA時的作用:
在RE轉換爲FA時,空串的作用就是生成∈轉移,合併兩個FA。
這樣一來在某一階段中,狀態有多種轉換的路徑,因此在狀態轉移的每一步都需要檢查當前字符(隱含上下文),背離了順序算法的行爲觀念
在這裏插入圖片描述

|| NFA的工作模型:(工作原理)
每次NFA必須進行非確定性選擇時,NFA都會克隆自身,以追蹤每個可能的轉移。因此對於一個輸入的字符來說,其NFA其實時一個特定的狀態集合,每個狀態都由某個克隆來匹配。
NFA進行非確定性選擇時,併發活動狀態下克隆出來的集合稱爲NFA的配置。
當NFA到達一個配置,此時已經耗盡了輸出流,且有一個或者多個克隆的副本處於某個接收狀態,則NFA接受(識別)該字符串

|| DFA與NFA之間的關係

  • 等價性:兩者在表現上等價,任何的DFA都是NFA的一個特例
  • 包含性:NFA其實是有限個的配置,一個NFA可能有很多很多個等價的DFA

|| 我們將使用如下構造法,以便將RE轉換爲適合於直接實現的FA

在這裏插入圖片描述

|| 從正則表達式到NFA的構造法:Thompson構造法
Thompson構造法的本質:1,構建了對應於單字母RE的NFA 2,使用NFA上的∈轉換,模擬連接RE選擇閉包等操作
在這裏插入圖片描述
|| Thompson構造法的代碼實現:
構造一棵樹,以表示內部的優先級,使用後序遍歷
在這裏插入圖片描述

|| 從NFA到DFA:子集構造法

|| 目的NFA(N, Σ, δN, n0,NA)爲輸入,生成一個DFA(D, Σ, δD, d0,DA)

|| 流程
首先:運行構造法,構造出一個目標DFA的模型
在這裏插入圖片描述
然後:如果qi包含NFA某個接收狀態,即說明表示它的狀態di是DFA的接收狀態之一。通過qi到di的映射,獲得轉移函數。最後通過構造函數q0成爲di,獲得DFA的初始狀態

|| 不動點算法。(子集構造法是不動點計算的一個例子)
該算法的特點是:對某個結構已知的域中的集羣,重複運用一個單調函數。當計算達到某一狀態時,如果進一步的迭代之得出已有的結果,則計算終止。相當於在連續的迭代空間中觸碰到了一個"不動點"。

|| 離線計算 ∈-closure
在這裏插入圖片描述
ps:具有問題完全信息前提下(即所有輸入數據已知) 設計出的算法稱爲離線算法( off line algorithms)

|| 從DFA到最小DFA:Hopcroft算法
爲了減少識別器在內存中佔用的空間,即通過減少計算機訪問內存的耗時,增加計算速度

|| 算法的核心其實就是檢測兩個狀態是否是等價的:
在這裏插入圖片描述

|| 爲了解決RE重義問題,需要給RE分配優先級


實現詞法分析器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章