1. 程式人生 > >編譯原理-詞法分析總結

編譯原理-詞法分析總結

課程總結

第三章詞法分析我認為是比較難理解的一章。本文主要介紹在詞法分析過程中需要用到的一些基本概念,包括詞法單元、模式和詞素以及三者之間的關係,理解這些內容對學習詞法分析過程十分重要。

首先要了解詞法分析的任務。詞法分析的任務:從左至右逐個字元的對源程式進行掃描,產生一個個的單詞符號,把作為字串的源程式改造成為由單詞符號串組成的程式。那麼以詞法分析為功能,詞法分析器是將一個字母作為分析目標,根據該字母的下一個字母來判斷是否應該判定該字母所屬型別。它的輸入是源程式,輸出是單詞符號。


如何識別單詞符號呢?根據讀來的第一個字元的種類分別轉到各種子程式處理。這些子程式功能就是識別以相應字元開頭的各種單詞。分析的過程是這樣的:通過判斷下一個語句字元是否已經讀過來,如果已經讀過來,判斷是字母、數字或者其他的,進入不同的子程式;如果沒有讀進來這個字元,就要讀下一個字元。

什麼是狀態轉換圖?狀態轉換圖是一張有限方向圖,它的功能是識別或者接受一定的符號串或者說單詞。有三個部分:結點、箭弧、箭弧上的標記。一個完整的狀態轉換圖是有n個狀態的,其中有一個狀態,至少有一個終態。

關於正規表示式和有限自動機。把具有相同特徵的字放在一起組成一個集合,即所謂的正規集
然後使用一種形式化的方法來表示正規集,即所謂的正規式。正規式是描述單詞結構的一種形式;

正規集是該類單詞的全集。

對於符號集合∑={a,b},有: 
- 正則表示式a表示語言{a}; 
- 正則表示式a|b表示語言{a,b}; 
- 正則表示式(a|b)(a|b)表示語言{aa,ab,ba,bb}; 
- 正則表示式a*表示語言{ε,a,aa,aaa,…}; 


- 正則表示式(a|b)*表示語言{ε,a,b,aa,ab,ba,bb,aaa,…}; 

- 正則表示式a|a*b表示語言{a,b,ab,aab,aaab,…}。

什麼時候兩個正規式相等?若兩個正規式U和V所表示的正規集相同,則認為二者等價,記為:U = V。證明:b(ab)* = (ba)*b

證明:因為,L(b(ab)*)=L(b)L((ab)*) 
    ={b} · {ε,ab, abab, …}
    ={b, bab, babab, …}
又因為, L((ba)*b)=L((ba)*) L(b)
={ε, ba, baba, …} · {b}
={b, bab, babab, …}
因此, L(b(ab)*)= L((ba)*b)
所以, b(ab)*=(ba)*b
正規式的性質:設U,V,W是上的∑正規式,則
(1) U | V = V | U或的交換律
(2) U | ( V|W ) = ( U|V ) | W或的結合律
(3) U ( VW ) = ( UV ) W連線積的結合律
(4) U ( V | W ) = ( UV ) | ( UW )分配律
     ( V | W ) U = VU | WU

(5) εU = Uε = U

把狀態轉換圖再形式化一下就是有限自動機(確定的有限自動機,非確定的有限自動機)。需要注意的是,所謂的自動機不是指一臺實際的機器,而是一種數學模型(集合,函式,序列…),利用它模擬計算機識別的功能。所謂確定性是指,f(s, a) = s’ 是單值函式。 對任何狀態s∈S,和輸入符號 a∈∑ , f(s, a) 唯一的確定下一個狀態。所謂有限性是指,S是一個有限的狀態集合,並且∑是一個有限的輸入符號的字母表。用上述5條,來定義一個DFA,來完成識別一個序列是否被機器所接受。

eg. 設DFA M = ({0,1,2,3},{a, b}, f, 0, {3}),其中

f: f(0, a) = 1,f(0, b) = 2 。  f(1, a) = 3,f(1, b) = 2 。 f(2, a) = 1,f(2, b) = 3 。   f(3, a) = 3,f(3, b) = 3

若M的初態結點同時又是終態節點,則空字可被M識別。DFA M所能識別的字的全體記為L(M)。如果一個DFA M的輸入字母表為∑,則我們稱M是∑上的一個DFA。若V是∑上的一個正規集,當且僅當存在一個∑上的DFA M,使得V = L(M)。

對任何兩個有限的自動機M1和M2,若有L(M1)=L(M2),則稱M1與M2等價。 對於任何∑上NFA M都可構造一個∑上的正規式V,使得  L(V) = L(M) 。

使用替換規則逐步消去M’的所有結點。替換規則如下:


還有關於閉包的概念。假定I是M’的狀態集的子集,a ∈ ∑,定義Ia =ε_CLOSURE(J)。其中,J是所有那些可從I中的某一狀態結點出發經過一條a弧而到達的狀態結點的全體。

關於確定有限自動機的化簡(最少化)。尋找一個狀態比DFA M少的DFA M’,使得L(M’) = L(M)。兩個狀態等價:設s和t是M兩個不同的狀態,從s出發能讀出某個字而停於終態,那麼同樣,從t出發也能讀出同一個字而停在終態,反之亦可。DFA化簡演算法:把M的狀態集分割為一些不相交的子集,使得任何不同的兩個子集狀態都是可區別的,而同一個子集中的任何狀態都是等價的,最後讓每個子集選一個代表,同時消去其他等價狀態。化簡步驟:(1) 檢查狀態轉換函式是否為全函式。(2) 用化簡演算法進行化簡。(3) 去掉死狀態。

課後習題

做課後習題是劃題做的,把比較重要做了做(在打草紙上... 等我去拍上來)。訂正版:




補充:


感想

學完這一章,感覺是挺難以理解的。老師說可以自己寫一個詞法分析器。坦白地說,我只看了一下原理和程式碼,測試執行而沒有自己實踐,是一個不足之處;另外在做習題時,因為細節處理,可能會產生連環錯誤,一步錯步步錯,所以從一開始做題就要保持細心;詞法分析是語法分析的基礎,概念性的東西和流程性的東西比較強,其實套路擺在那,明白套路加以練習就可以基本掌握了。

詞法分析器

輸入緩衝區:成對且對半互補的輸入緩衝區模式。n: 取2的整次冪;每個半區的末尾設定標誌“ eof ” 表示讀入該半區的源程式的結束;B:單詞w開始指標; F:掃描w的指標。

兩個緩衝區的輸入模式預處理程式: (作用)
1) 減少記憶體空間佔用;
2) 減輕掃描器實質性處理的負擔;
預處理程式主要任務: 1) 濾掉源程式中的非單詞成分(如無用空格;換行符等);2) 其他的預處理工作:濾掉註釋;巨集替換;檔案包含的嵌入;條件編譯的嵌入。


相關推薦

編譯原理-詞法分析總結

課程總結第三章詞法分析我認為是比較難理解的一章。本文主要介紹在詞法分析過程中需要用到的一些基本概念,包括詞法單元、模式和詞素以及三者之間的關係,理解這些內容對學習詞法分析過程十分重要。首先要了解詞法分析的任務。詞法分析的任務:從左至右逐個字元的對源程式進行掃描,產生一個個的單

編譯原理----詞法分析

0.PL/0文法   〈程式〉→〈分程式〉. 〈分程式〉→ [<常量說明部分>][<變數說明部分>][<過程說明部分>]〈語句〉    <常量說明部分> → CONST<常量定義>{

編譯原理——詞法分析(1)

在我們學習詞法分析時,就會思考如何構造一個詞法分析器? 一個詞法分析器可以通過手工構造;也可以通過以下方式自動生成一個詞法分析器:向一個詞法分析器生成工具描述出詞素的模式,然後將這些模式編譯為具有動詞分

編譯原理——詞法分析(2)

1.1串和語言        字母表是一個有限的符號集合。符號的典型例子包括字母、數位和標點符號。如集合{0,1}是二進位制字母表。 某個字母表的串(string)是該字母表符號的有窮序列,空串是長度為0的串。 語言(language):是某個給定字元表上任意的可數

編譯原理-詞法分析

實驗內容 通過對PL/0詞法分析程式(GETSYM)的分析,並在此基礎上按照附錄A中給出的PL/0語言的語法描述,編寫一個PL/0語言的詞法分析程式。此程式應具有如下功能: 輸入為字串(待進行詞法分析的源程式),輸出為單詞串,即由(單詞、類別)所組成的二元組序列

編譯原理 詞法分析

本文是詞法分析的第三篇文章。之前的第一篇文章介紹了詞法單元、模式和詞素的三者間的關係,以及正則表示式;第二篇文章介紹了有窮自動機,以及如何把NFA轉換成等價的DFA。本文首先將介紹如何把一個正則表示式轉換成一個有窮自動機,接著會給出一個最小化DFA狀態數的演算法,最後會回顧整個詞法分析過程。 從

編譯原理 詞法分析

上一篇文章我們介紹了在詞法分析中涉及到的詞法單元、模式和詞素的概念,並給出了正則表示式的遞迴定義,以及如何把一個正則表示式轉換成一個狀態轉換圖。本篇文章將接著上一篇文章的內容,繼續介紹詞法分析的一個重要內容——有窮自動機。 有窮自動機 一個有窮自動機可以把一個描述詞素的模式變成一個詞法分析器,從

編譯原理 詞法分析

轉發自: 作者:jzyhywxz  來源:CSDN  原文:https://blog.csdn.net/jzyhywxz/article/details/78285722  版權宣告:本文為博主原創文章,轉載請附上博文連結!     本文是詞法分

編譯原理——詞法分析程式

前言:這是我學習編譯原理,課程實驗的內容,課程早已結束,現整理髮表。 一、實驗任務 閱讀已有編譯器的經典詞法分析源程式; 用C或JAVA語言編寫一門語言的詞法分析器。 二、實驗內容 閱讀已有編譯器的經典詞法分析源程式。 選擇一

編譯原理 詞法分析 原始碼

#include<iostream>#include<string>#include<fstream>#include<vector>// C++中的一種資料結構,確切的說是一個類.它相當於一個動態的陣列,當程式設計師無法知道自

編譯原理-詞法分析-語法分析-語義分析生成中間程式碼-python版

# -*- coding:UTF-8 -*- #!/usr/bin/python import string import sys import Analyze_2 Identifier=['if','else','for','while','do','int','writ

[編譯原理-詞法分析(一)] 輸入緩衝 雙緩衝區方案

前言 在實踐中, 通常需要向前看一個字元. 比如, 當讀到一個 非字母或數字的字元 時才能確定已經讀到一個識別符號的結尾. 因此

[編譯原理-詞法分析(二)] 使用狀態轉換圖識別詞法單元

前言 一個小Demo, 用於分析的原始檔比較簡單, 主要的部分都有, 擴充套件比較容易. 將正則表示式表示的模式構造為狀態轉換圖.

#編譯原理# 詞法分析(三)第一部分

詞法分析 編譯原理筆記第三部分,內容參考:北航軟院教師邵兵課堂課件及內容、張莉著《編譯原理及編譯程式構造》、國防工業出版社的《編譯原理——學習指導與典型題解析》、AlvinZH的學習筆記以及個人理解 目前是包含了全部內容的版本,後續會推出精簡版和複習知識點版 如有建議或錯誤錯誤歡迎在評論中指出或聯絡我:QQ:

#編譯原理# 詞法分析(三)第二部分

詞法分析 編譯原理筆記第三部分,由於內容過長所以分為了兩部分,跳轉連結在總閱讀目錄處,內容參考:北航軟院教師邵兵課堂課件及內容、張莉著《編譯原理及編譯程式構造》、國防工業出版社的《編譯原理——學習指導與典型題解析》、AlvinZH的學習筆記以及個人理解 目前是包含了全部內容的版本,後續會推出精簡版和複習知識點

編譯原理->詞法分析器的分析

> -> >=四、然後對於詞法分析器來說,我們就是要將物件語言的語法全部描述出來,下面就以C語言為例來說明問題:(1)關鍵字: main if else int return void while ...所有的關鍵字都是小寫。(2)專用符號= + - * / <= >= >

一個簡單的編譯原理詞法語法語義分析程式

這是我們學校的課程實驗,想做個學習記錄,所以發表了這篇部落格,有不足的地方,歡迎大家共同探討,也歡迎大家轉載,轉載時請務必註明作者,希望對想學習編譯原理的同學有一定的幫助。 一 語法結構的詞法說明 關鍵字:begin if while 和檔案結束符E

編譯原理預測分析程式的實現

預測分析程式的實現 設計內容及要求: 對文法  G: E->TE' E'->+TE' E'->e T->FT' T'->*FT' T'->e F->(E) F->i   造出 G 的

編譯原理-詞法分析器1(lex實現)

編譯原理課實驗一是詞法分析器,但是在網上查了很多資料,發現用lex實現還要用Linux,Windows可以用對應的flex實現,但是網上的資料很零散,所以整理了一下從安裝到配置,到實現一個詞法分析器的過程 一、 安裝 開啟安裝好的軟體,選Basic

編譯原理-語法分析

本文是語法分析的第四篇文章,第一篇文章介紹了基本的文法、推導和歸約的概念,第二篇文章介紹了自頂向下的語法分析和LL(1)方法,第三篇文章介紹了自底向上的語法分析和SLR方法。本文將承接第三篇文章,介紹比SLR更為強大的LR方法。 PS:閱讀本文需要掌握前三篇文章的知識,建議讀者先閱讀前三篇文章