编译原理笔记6:从正规式到词法分析器(3):DFA最小化、词法分析器的构造、Lex 使用示例

从 DFA 到最小 DFA

关于星闭包的补充:一个语言被认为是所有可能字的子集。所有可能字的集合可以被认为是所有可能的字符串串接的集合。

DFA 最小化的过程,就是通过某些等效转换减少原 DFA 状态数的过程——这里的“等效转换”,就是对多余的状态进行合并。

那,什么叫多余?这里的多余,指的是对于同样的输入会得到同样的结果——比如在上面NFA转DFA的例子中,我们观察得到的DFA,发现其中的A、C状态对于字母表中任意的输入,都会给出相同的结果。那么这个A和C对任意输入而言就是等效的,它们两个就可以互相替代,我们也就可以把它们合并成一个状态。

将DFA最小化需要去除多余状态,所以如何最小化DFA的问题就转化为了如何找出“多余状态”的问题。我们需要一个方法来帮助我们判断某个状态是否是多余的。这里引入“等价”、“可区分”、“划分”的概念。

等价

定义:设 p、q ∈ S,对于任一输入序列 w∈Σ*,有 move(p, w)∈F 且 move(q, w)∈F,则称状态 p 和 q 等价。否则称 p、q 是可区分的,也就是存在 x∈Σ*,使得move(p, x) 和 move(q, x) 不能同时进入终态。

可区分

对于DFA中的任意两个状态t、s,若从其中一个状态出发能够接受输入字符串 ω,而从另一个状态出发却不能接受 ω,则称 ω区分状态t和s。如果存在某个能够区分状态 t 和 s 的串,那么状态 t 和 s 就是可区分的。

因此,如果我们找到这样一对 t 和 s ,对于从它们两个状态分别出发的任何的输入序列 ω,都能够最终到达相同的结果,那么 t 和 s 就可以合并成一个状态。

因此,最小化 DFA 的本质,就是将 DFA 中的状态分成不同的组,使得同一个组中的状态之间不可区分(也就是等价的),而不同组的状态之间可区分(也就是不等价)。当我们把每个组内的状态都合并成为一个状态后,我们就能够得到一个最小 DFA 了

(其实就是把DFA中的各个状态划分成几个等价类,然后把等价类内的状态进行合并。这样最终得到的最小DFA的状态数就是之前我们划分的等价类数。每一个等价类对应最小DFA中的一个状态)

划分

给定一个DFA,我们可以确定:

  • DFA 的终态和非终态是可区分的;(使用 ε 即可区分终态和非终态。因为 DFA 中不存在 ε 转移。DFA 中的任意状态经过 ε 都不会发生改变)
  • 若分别从 s 和 t 出发,沿着标记为 x 的路径到达的两个状态p、q是可区分的,那么 s 和 t 也是可区分的。 这里的 p、q 是我们已知可区分的——因为对于 p、q,如果有相同的输入序列 y 使得他们分别到达终态和非终态,那么 p、q 就是可区分的了。一旦 p、q 可区分,则 s、t 经过输入序列 xy 就能够分别到达 f、g ,也就随之满足可区分的定义了

算法:最小化 DFA 的状态数(DFA化简)

输入:DFA D = {S, Σ, move, s0, F }

输出:等价的 D' = {S', Σ, move', s0', F' }(D' 的状态数最少)

主要步骤:

  1. 进行初始化分,获得终态和非终态;
  2. 利用“可区分”的概念,反复分裂划分中的组 Gi,直到不可再分裂;
  3. 由最终划分构造 D',关键是用等价的概念对一些状态进行合并,选出新的代表状态并修改状态转移;
  4. 消除可能的死状态的不可达状态。

化简的基本思路,其实就是把原来的状态集按照等价关系进行划分(划分后的子集互不相交),同一子集内元素等价,不同子集元素可区分。将每一个子集中的状态合并成一个状态,就可以得到一个新的状态集 Snew,原初态s0所在子集就成为化简后状态机 Dnew 的新初态 s0new ,原终态所在子集就成为化简后的 Dnew 的一个新终态。

下面用这个算法来化简我们前面的 DFA

每个DFA都能够最小化,这里有个定理:

对于一个 DFA D = {S, Σ, mvoe, s0, F}, 存在唯一一个最小状态(就状态数而言)DFA D' = {S', Σ, move', s0, F'} 与 D 等价。

手写 DFA

建出来了 DFA 的状态转移图,我们就可以通过直接编码的方式来为我们的 DFA 手写词法分析器了。由于操作复杂,故实际应用中不会使用这种方法构造词法分析器,而是会使用 Lex 进行该工作。

此处先略,日后再补。。。(坑)

词法分析器的构造

实际应用中,我们使用工具来生成词法分析器。因为从正规式到词法分析器这个过程中的每一步都有对应的算法来实现。我们构造自己的词法分析器,只需要使用 Lex 就可以了。

Lex 使用示例

image.png

点击 Lex 中的 编译按钮 ,将会生成一个 .c 和一个 .h 文件

对于词法解析错误的输入,lex 编译出的程序将会直接把错误的输入回显

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容