词法分析器的设计

词法分析器的功能:输入源程序、输出单词符号

词法分析器的设计:给出程序设计语言的单词规范——单词表, 对照单词表设计识别该语言所有单词的状态转换图, 根据状态转换图编写词法分析程序

字母表:一个有穷字符集,记为∑

字母表中每个元素称为字符

∑上的字(也叫字符串) 是指由∑中的字符所构成的一个有穷序列

不包含任何字符的序列称为空字,记为ε

用∑*表示∑上的所有字的全体,包含空字ε

例如: 设 ∑={a, b},则,∑*={ε,a,b,aa,ab,ba,bb,aaa,...}

∑ * 的子集U和V的连接(积)定义为UV={ αβ | α∈U & β∈V }

V自身的 n次积记为V n =V V…V

正规式和正规集

程序设计语言的单词符号都是一些特殊的字符串,用正规集和正规表达式(简称正规式)来描述

正规集可以用正规式表示,正规式是表示正规集一种方法, 一个字集合是正规集当且仅当它能用正规式表示

正规式和正规集的递归定义

对给定的字母表Σ,ε 和∅都是Σ上的正规式,它们所表示的正规集为{ε}和∅;

任何a∈Σ ,a是Σ上的正规式,它所表示的正规集为{a} ;

ε是什么?字,正规式

∅是什么?集合,正规式

a (a ∈Σ)是什么?字符,字,正规式

假定e 1 和e 2 都是Σ上的正规式,它们所表示的正规集为L(e 1 )和L(e 2 ),则(e 1 |e 2 )为正规式,它所表示的正规集为L(e 1 )∪L(e 2 ),(e 1 .e 2 )为正规式,它所表示的正规集为L(e 1 )L(e 2 ),(e 1 ) * 为正规式,它所表示的正规集为(L(e 1 )) *,仅由有限次使用上述三步骤而定义的表达式才是Σ上的正规式,仅由这些正规式表示的字集才是Σ上的正规集。

正规式的等价性

若两个正规式所表示的正规集相同,则称这两个正规式等价。如

正规式的性质

确定有限自动机

对状态图进行形式化定义

DFA表示为状态转换图,假定DFA M含有m个状态和n个输入字符,对应的状态转换图含有m个状态结点,每个结点顶多含有n条箭弧射出,且每条箭弧用Σ上的不同的输入字符来作标记

对于Σ*中的任何字α,若存在一条从初态到某一终态的道路,且这条路上所有弧上的标记符连接成的字等于α,则称α为DFA M所识别(接收),DFA M所识别的字的全体记为L(M)

L(M)={含aa或bb的字}

非确定有限自动机

从状态图看NFA 和DFA的区别,NFA可以有多个初态,弧上的标记可以是Σ * 中的一个字(甚至可以是一个正规式),而不一定是单个字符,同一个字可能出现在同状态射出的多条弧上

DFA是NFA的特例

对于Σ*中的任何字α,若存在一条从初态到某一终态的道路,且这条路上所有弧上的标记字连接成的字等于α(忽略那些标记为ε的弧),则称α为NFA M所识别(接收),NFA M所识别的字的全体记为L(M)

L(M 1 )={含aa或bb的字}

L(M 2 )={a m b n | m,n≥1}

DFA和NFA

定义:对于任何两个有限自动机M和M’,如果L(M)=L(M’),则称M与M’等价,自动机理论中一个重要的结论:判定两个自动机等价性的算法是存在的,对于每个NFA M存在一个DFA M’,使得L(M)=L(M’),DFA与NFA识别能力相同!

正规式与正规集,DFA与NFA的更多相关文章

  1. 自动构造词法分析器的步骤——正规式转换为最小化DFA

    正规式-->最小化DFA 1.先把正则式-->NFA(非确定有穷自动机) 涉及一系列分解规则 2.再把NFA通过"子集构造法"-->DFA 通过子集构造法将NFA ...

  2. 有穷自动机(NFA、DFA)&正规文法&正规式之间的相互转化构造方法

    在编译原理(第三版清华大学出版社出版)中第三章的词法分析中,3.4.3.5.3.6小节中分别讲解了 1.什么是NFA(不确定的有穷自动机)和DFA(确定的有穷自动机) 2.如何将  不确定的有穷自动机 ...

  3. 正规式->最小化DFA说明

      整体的步骤是三步: 一,先把正规式转换为NFA(非确定有穷自动机), 二,在把NFA通过"子集构造法"转化为DFA, 三,在把DFA通过"分割法"进行最小化 ...

  4. 《编译原理》构造与正规式 (0|1)*01 等价的 DFA - 例题解析

    <编译原理>构造与正规式 (0|1)*01 等价的 DFA - 例题解析 解题步骤: NFA 状态转换图 子集法 DFA 的状态转换矩阵 DFA 的状态转图 解: 已给正规式:(0|1)* ...

  5. 编译原理:正规式转变成DFA算法

    //将正规式转变成NFApackage hjzgg.formal_ceremony_to_dfa; import java.util.ArrayList; class Edge{ public int ...

  6. 正规式α向有限自动机M的转换

    [注:这一节是在学习东南大学廖力老师的公开课时,所记录的一些知识点截屏,谢谢廖力老师的辛劳付出] 引入3条正规式分裂规则来分裂α,所得到的是NFA  M(因为包含ε弧,之后进行确定化就是所需要求得DF ...

  7. 编译原理课后习题答案令A,B和C是任意正规式,证明以下关系成立(A|B)*=(A*B*)*=(A*|B*)*

    题目: 令A.B和C是任意正规式,证明以下关系成立: A∣A=A (A*)*= A*         A*=ε∣A A*        (AB)*A=A(BA)*        (A∣B)*=(A*B ...

  8. DFA和NFA的区别

    正则表达式引擎分成两类,一类称为DFA(确定性有穷自动机),另一类称为NFA(非确定性有穷自动机).两类引擎要顺利工作,都必须有一个正则式和一个文本串,一个捏在手里,一个吃下去.DFA捏着文本串去比较 ...

  9. SurFS:共享式和分布式集群各取所长

    http://www.ccidnet.com/2016/0811/10168835.shtml 一个集群系统可以做成三层定义,也就是后端存储访问层.沟通协作层.前端数据访问层,如果愣是要给每个层起个洋 ...

随机推荐

  1. go编写简单接口的过程

    环境 系统 Windows server 2016 Datacener go version go1.13.3 windows/amd64 数据库 Microsoft SQL Server 2014( ...

  2. 看看AQS阻塞队列和条件队列

    上一篇简单介绍了AQS,我们大概知道AQS就是一个框架,把很多功能都给实现了(比如入队规则,唤醒节点中的线程等),我们如果要使用的话只需要实现其中的一些方法(比如tryAcquire等)就行了!这次主 ...

  3. 每日一技|巧用 Telnet 调试 Dubbo 服务

    个人博客地址 studyidea.cn,点击查看更多原创文章 0x00. 前言 想象这样一个场景,线上某个服务突发异常,导致上游服务调用异常,数据处于中间状态.服务恢复之后,我们需要修复这笔数据至正常 ...

  4. Git详解之内部原理

    前言 不管你是从前面的章节直接跳到了本章,还是读完了其余各章一直到这,你都将在本章见识 Git 的内部工作原理和实现方式.我个人发现学习这些内容对于理解 Git 的用处和强大是非常重要的,不过也有人认 ...

  5. Vue中的计算属性

    一.什么是计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护. 二.计算属性的用法 在一个计算属性里可以完成各种复杂的逻辑,包括运算.函 ...

  6. python学习Day7--字符串操作

    [主要内容] 1. 补充基础数据类型的相关知识点 1. str. join() 把列表变成字符串 2. 列表不能再循环的时候删除. 因为索引会跟着改变 3. 字典也不能直接循环删除. 把要删除的内容记 ...

  7. 用上自己的线程池,实现自己的RPC框架

    package github.com.AllenDuke.rpc.customer; import github.com.AllenDuke.rpc.netty.NettyClient; import ...

  8. 使用Gradle自动创建Java项目结构

    D:\N3verL4nd\Desktop\java>tree 卷 本地磁盘 的文件夹 PATH 列表 卷序列号为 00000200 0006:08B0 D:. ├─.gradle │ ├─3.4 ...

  9. BZOJ 2733 [HNOI2012]永无乡 (权值线段树启发式合并+并查集)

    题意: n<=1e5的图里,在线连边.查询某连通块第k大 思路: 练习线段树合并的好题,因为依然记得上一次启发式合并trie的时候内存爆炸的恐怖,所以这次还是用了动态开点.回收 听说启发式合并s ...

  10. Codeforces 1064D Labyrinth(双端队列BFS)

    题意: 给一个图,"*"不可以走,给你一个起点,限制向左走L次,向右走R次,上下不限制,问你最多可以走到多少个格子 思路: BFS,每次将上下走的策略加入队首,左右加入队尾,(相当 ...