上下文无关文法(编译原理)

词法分析

1. 词法分析基础夯实

  1. 记号、模式与单词

  • 单词的分类:关键字(保留字)、标识符、字面量、特殊符号

  • 模式(pattern):产生/识别单词的规则

  • 记号(token):按照某个模式(或规则)识别出的元素(一组)

  • 单词(lexeme):被识别出的元素的值(字符串本身) ,也称为词值

  1. 词法分析器的作用:

  • 识别记号并交给语法分析器(根据模式识别记号)

  • 滤掉源程序中的无用成分,如注释、空格和回车等

  • 处理与具体平台有关的输入(如文件结束符的不同表示等)

  • 调用符号表管理器和出错处理器,进行相关处理

  1. 工作方式

  • 单独一遍扫描

  • 作为语法分析器的子程序

  • 并行方式

2.模式的形式化描述

2.1字符串与语言

语言L是有限字母表∑上有限长度字符串的集合.

定义中强调两个有限,因为计算机的表示能力有限 :

  • 字母表是有限的,即字母表中元素是有限多个;

  • 字符串的长度是有限的,即字符串中字符个数是有限多个。

(字符串与字符串集合相关的概念与运算,如前缀、后缀、子串、子序列等,字符串的并、交、连接、差、闭包)

2.2 正规式与正规集

令Σ是一个有限字母表,则Σ上的 正规式 及其表示的集合递归定义如下:
    1. ε是正规式,它表示集合  L(ε) = {ε}
    2. 若a是Σ上的字符,则a是正规式,它表示集合L(a)={a}
    3. 若正规式r和s分别表示集合L(r)和L(s),则
       (a) r|s是正规式,表示集合L(r)∪L(s),
       (b) rs是正规式,表示集合L(r)L(s),
       (c) r*是正规式,表示集合(L(r))*,
       (d)(r)是正规式,表示的集合仍然是L(r)。                                   
       括弧用来改变运算的先后次序!

可用正规式描述(其结构)的语言称为 正规语言 或 正规集

若运算的优先级和结合性做下述约定:
    1. 三种运算均具有左结合性质;
    2. 优先级从高到低顺序排列为:闭包运算、连接运算、或运算。
则正规式中不必要的括号可以被省略。

若正规式P和Q表示了同一个正规集,则称P和Q是等价的,记为P=Q

2.3 简化正规式

(a) 正闭包 若r是表示L(r)的正规式,则r+是表示(L(r))+的正规式,且下述等式成立:r+ = rr* = rr,r = r+|ε;
          +与*具有相同的运算结合性和优先级
(b) 可缺省  若r是正规式,则r?是表示L(r)∪{ε}的正规式,且下述等式成立:r? = r|ε
           ? 与 * 具有相同的运算结合性和优先级
(c) 串    若r是若干字符进行连接运算构成的正规式,则:串“r” =  r ,且: ε= “”,   a = “a”(a是Σ的任一字符)
(d) 字符组 若r是若干字符进行|运算构成的正规式,则可改写为  [r’],其中r’可以有如下两种书写形式:
             枚举:      如  a|b|e|h,可写为 [abeh]:
             分段:   如0|1|2|3|4|5|6|7|8|9|a|b|c|d|e , 可写为: [0-9a-e]
(e) 非字符组 若[r]是一个字符组形式的正规式,则[^r]是表示∑- L([r])的正规式。 

3. 有限自动机——(符号的识别)

3.1 不确定的有限自动机(NondeterministicFinite Automaton, NFA)

NFA是一个五元组(5-tuple):M =(S,∑,move,s0,F),其中
(1) S是有限个状态(state)的集合;
(2) ∑是有限个输入字符(包括ε)的集合;
(3) move是一个状态转移函数,move(si,ch)=sj表示,当前状态si下若遇到输入字符ch,则转移到状态sj;
(4) s0是唯一的初态(也称开始状态);
(5) F是终态集(也称接受状态集),它是S的子集,包含了所有的终态。
  1. 直观地表达方式

  • 状态转换图:用一个有向图来直观表示NFA

  • 状态转换矩阵:用一个矩阵来直观表示NFA (矩阵中,状态对应行,字符对应列)

  1. NFA(识别记号)的特点

NFA识别记号的最大特点是它的不确定性,即在当前状态下对同一字符有多于一个的下一状态转移。

具体体现:
定义: move函数是1对多的;
状态转换图:从同一状态出发,可通过多于一条标记相同字符的边转移到不同的状态;
状态转换矩阵: M[si,a]是一个状态的集合
  1. NFA识别记号存在的问题

  • 只有尝试了全部可能的路径,才能确定一个输入序列不被接受,而这些路径的条数随着路径长度的增长成指数增长

  • 识别过程中需要进行大量回朔,时间复杂度升高且算法复杂

3.2 确定的有限自动机(NondeterministicFinite Automaton, NFA)

定义: DFA是NFA的一个特例,其中: 
  (1)没有状态具有ε状态转移(ε-transition),即状态转换图中没有标记ε的边;
  (2)对每个状态s和每个字符a,最多有一个下一状态。
  
特点:与NFA相比,DFA的特征:确定性
    定义:move(si, a)函数都是 1对1 的;
    转换图 从一个状态出发的任2条边上的标记均不同;
    转换矩阵:M[si,a]是一个状态   且字母表不包括ε。
提示:正规式和有限自动机从两个侧面表示正规式。正规式是描述,自动机是识别。

4. 从正规式到词法分析器

构造词法分析器的一般方法和步骤:
1. 用正规式描述模式(为记号设计正规式);
2. 为每个正规式构造一个NFA,它识别正规式所表示的正规集;
3. 将构造的NFA转换成等价的DFA,这一过程也被称为确定化;
4. 优化DFA,使其状态数最少,这一过程也被称为最小化;
5. 根据优化后的DFA构造词法分析器。

4.1 从正规式到NFA

Thompson 算法

4.2 从NFA到DFA

- smove(S, a):从状态集S出发,标记为a的下一状态全体。与move(s, a)的唯一区别:用状态集取代状态
- ε-闭包(T):从状态集T出发,不经任何字符达到的状态全体
- “子集法”构造DFA

4.3 最小化DFA

步骤如下:

  1. 初始划分:终态组 , 非终态组;

  1. 利用可区分的概念,反复分裂划分中的组Gi,直到不可再分裂;

  1. 由最终划分构造D',关键是选代表和修改状态转移;

  1. 消除可能的死状态和不可达状态。

5.从DFA构造词法分析器

分类:表驱动型的词法分析器;直接编码的词法分析器

对比:

表驱动

直接编码

分析器的速度

程序与模式的关系

无关

有关

适合的编写方法

工具生成

手工编写

分析器的规模

较大

较小

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值