编译原理第三章-词法分析

第三章 词法分析

 

 

l  词法分析器的要求

n  任务:从左至右逐个字符的对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为由单词符号串组成的程序

n  单词的种类(基本字、标识符、常数、运算符、界符)

n  单词表示形式

二元式:<单词种别,单词符号的属性值>

 

l  词法分析器的设计

n  词法分析器的结构

编译原理第三章-词法分析_第1张图片

n  功能:

u  输入缓冲器、预处理子程序

u  扫描缓冲区、扫描器

 

n  单词符号的识别

u  超前搜索:在单词识别的过程中,通过向前多读几个符号的形式,准确的进行单词的识别;一旦确定识别到的单词之后,需要进行扫描指针的回退,保证单词识别工作的顺利进

u  直接分析法

状态转换图法:一张有限方向图

状态转换图的结构(结点、箭弧、箭弧上的标记)

一个完整的状态转换图有n个状态,其中有一个初态,至少要有一个终态(用双圆圈表示)

                  [例] 识别实型常数的状态转换图

编译原理第三章-词法分析_第2张图片

正则表达式和有限自动机(重点)

n  正规式与正规集

u  把具有相同特征的字放在一起组成一个集合,即所谓的正规集

u  然后使用一种形式化的方法来表示正规集,即所谓的正规式

正规式与正规集的定义(递归的定义方法)

 (1)ε和φ是∑上的正规式,它们所表示的正规集分别为{ε}和φ

(2)任何a∈∑,是∑上的一个正规式,他所表示的正规集为{ a }

(3)假定U和V都是∑上的正规式,他们所表示的正规集分别记为L(U)和L(V),那么

         (a) (U|V)是正规式,所表示的正规集为L(U)∪L(V)

         (b) (UV)是正规式,所表示的正规集为L(U)· L(V)(连接积)

         (c) (U)*是正规式,所表示的正规集为(L(U))*(闭包)

         仅由有限次使用(1)(2)(3)所得到的表达式才是∑上的正规式,仅由这些正规式所表示的字集才是∑上的正规集。

        

注:|(或)、 ·(连接)、*(闭包,任意有限次的自重复连接)

                      运算的优先级为:“ * ”  >  “· ”   >  “ | ”

两个正规式的等价

若两个正规式U和V所表示的正规集相同,则认为二者等价,记为:               

U = V

正规式的性质

设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       

[题5]

编译原理第三章-词法分析_第3张图片

[题6]

编译原理第三章-词法分析_第4张图片

编译原理第三章-词法分析_第5张图片

编译原理第三章-词法分析_第6张图片

n  确定有限自动机(DFA)(DeterministicFinite Automata)

u  定义:一个确定有限自动机(DFA)M是一个五元式:

M = (S, ∑, f,s0, F),其中

1)  S是一个有限的状态集合,它的每个元素我们称为一个状态

2)  ∑是一个有穷的输入符号的字母表,它的每个元素我们称为一个输入字符

3)  f是从 S×∑ →S的单值部分映射

4)  s0是S的一个元素,为初始状态,它是唯一的

5)  状态集合F是终止状态的集合,它是S的子集(可空)

u  注意:

1)  所谓确定性是指,f(s, a) = s’ 是单值函数。对任何状态s∈S,和输入符号 a∈∑ , f(s, a) 唯一的确定下一个状态

2)  所谓有限性是指,S是一个有限的状态集合,并且∑是一个有限的输入符号的字母表

u  表示方法:矩阵法、状态转换图法

n  非确定有限自动机(NFA)(Non-deterministicFinite Automata)

u  定义:一个非确定有限自动机(NFA)M是一个五元式M = (S, ∑, f, S0, F),其中

1)      S是一个有限的状态集合,它的每个元素我们称为一个状态

2)      ∑是一个有限的输入符号的字母表,它的每个元素我们称为一个输入字符

3)      f是从S×∑*→2S 的部分映射,其中,2S表示S的幂集合(所有S的子集组成的集合)(f是非单值的M是非确定)

4)      状态集合S0是初始状态集合,它是S的子集

5)      状态集合F是终止状态的集合,它是S的子集

u  表示方法:状态矩阵表示、状态转换图表示

n  有限自动机的等价性

对任何两个有限的自动机M1和M2,若有L(M1)=L(M2),则称M1与M2等价。

n  正规式与有限自动机的等价性

1)  定理1:对于任何∑上NFA M都可构造一个∑上的正规式V,使得  L(V) = L(M)

其中,L(M)是∑上NFA M所能识别的字的全体,L(V)是∑上的正规集

[问题] 如何由一个NFA M,构造一个正规式V

                    i.           在M转换图上加进X结点和Y结点,从X结点用弧ε连接M的所有初态结点,M的所有终态结点用弧ε连接到Y,得到一个NFA M’,且L(M) = L(M’)

                   ii.           使用替换规则逐步消去M’的所有结点,直到只剩下X结点和Y结点,在消去过程中,逐步使用正规式来标记箭弧

 

2)  定理2:对于∑上的每一个正规式V,存在一个∑上的DFA M,使得L(M) = L(V)

 

[问题] 如何由一个正规式V,构造一个DFA M

1.     构造NFA(根据V,构造一个NFA M’,使得L(M’) = L(V) )

2.     确定化 (将M’确定化,变为DFA M)

3.     最少化

 

[问题] 如何由一个正规文法转化成一个 DFA M

与上述类似,非终结符为状态结点,弧为终结符

 

定义2:假定I是M’的状态集的子集,a ∈ ∑,定义

Ia =ε_CLOSURE(J)

其中,J是所有那些可从I中的某一状态结点出发经过一条a弧而到达的状态结点的全体

 

n  确定有限自动机的化简(最少化)

u  状态等价:两个状态读出同一个字都停在终态

u  状态可区别:若DFA M的两个状态s和t不等价,则称这两个状态是可区别的

注:终态和非终态是可区别的,因为终态可以读出空字ε,而非终态不能读出空字ε

化简DFA步骤

1.       检查状态转换函数是否为全函数,若不是引入一个死状态,死状态对所有输入符号都转换到本身。

2.       用化简算法进行化简

化简算法

1)      假定到某个时候П含有m个子集,

                  记П={I(1),I(2),…I(m)}

若存在一个输入字符a使得I(i)a不全包含在现行П的某个子集I(j)中,就将I(i)一分为二

2)      重复1) 划分到所有子集可区别

3)      对于这个П中的每个子集,选取子集中的一个状态代表其它状态。

3.       去掉死状态

[题7(1)]

编译原理第三章-词法分析_第7张图片

编译原理第三章-词法分析_第8张图片

[题(2)]

编译原理第三章-词法分析_第9张图片

 

[题12(1)]

编译原理第三章-词法分析_第10张图片

[题12(2)]

编译原理第三章-词法分析_第11张图片

 

个人感想:这一章的东西好多,构造一个最小化的DFA很重要,本章的所有知识点都在为这个操作服务。自己的形式化语言阅读能力欠佳,看课本上密密麻麻的符号定义看的很头疼。手工构造DFA着实麻烦,清明找时间编写一下状态转换的代码。

你可能感兴趣的:(编译原理)