【编译原理】龙书第三章作业答案

练习3.1.1:根据3.1.2节中的讨论,将下面的C++程序划分成正确的词素序列。哪些词素应该有相关联的词法值?应该具有什么值?


答案: 左列为词素,右列为值,划分如下:

< float> 值为它本身
<id,limitedSquare> 值为*limitedSquare指针
<(> 标点符号无值
<id,x> 值为*x指针
<)> 标点符号无值
<{> 标点符号无值
< float> 值为它本身
<id,x> 值为*x指针
< return> 值为return
<(> 标点符号无值
<id,x> 值为*x指针
<comparison,<=> 标点符号无值
<number,10.0> 常量值为10.0
<op," ll "> 标点符号无值
<id,x> 值为*x指针
<comparison,>=> 标点符号无值
<number,10.0> <)> 常量值为10.0
<op,”?”> 值为判断是否相等
<number,100> 常量值为100
<op,”:”> 无值
<id,x> 值为*x指针
<op,”*”> 无值
<id,x> 值为*x指针
<op,”;”> 无值
<}> 标点符号无值

练习3.1.2:像HTML或XML之类的标记语言不同于传统的程序设计语言,它们要么包含有很多标点符号(标记),如HTML,要么使用由用户自定义的标记集合,如XML。而且标记还可以带有参数。请指出如何把如下的HTML文档划分为适当的词素序列。哪些词素应该有相关联的词法值?应该具有什么值?


答案:

常量 ”Here is a photo of”, ”My house”, ”See”, ”More Pictures”, ”if you liked that one”
变量 B,P,IMG,SRC,BR,A,HREF
标点符号 =,<,>,/

其中,常量的值为所存在内存单元中的值;符号没有对应的值;关键字的值为它们本身。

练习3.1.2:试描述下列正则表达式定义的语言


答案:

1)以a开头和结尾的零个或多个a或b组成的串的组合。

2)零个或多个a或b组成的串的组合。

3)结尾倒数第三个是a的零个或多个a或b组成的串的组合。

4)由三个b和零个或多个a组成的串的组合。

5)偶数个a或b组成的串的组合。

练习3.3.5:试描述下列正则表达式定义的语言


答案:
1)设σ=[b-df-hj-np-tv-z],也就是除了所有元音以外的小写字母串。所以该题语言的正则定义是:σ* a(σ|a)*e(σ|e)*i(σ|i)*o(σ|o)*u(σ|u) *

2)a * b * … z *

3)由于串中字符串只可能是以下两种情况:
(i)除了 * / 以外的所有字符;
(ii)“ * /”。考虑用或符号 ” | ” 来描述上述情况。
为了使其描述更多合法字符,再将它描述为闭包 ” * ”。再结合首尾分别规定为:”/ * ”和 ” * /”,所以正则表达式如下(注:” / ” 前和 ” * ” 前必须加多一个 “ \ ”):
\ / \ * ((^\ * \ / )|(“ * /”)) * \ * \ /

9)(b*a * )|(b * a * ba * )

练习3.3.11: UNIX的shell命令sh在文件名表达式中使用图3-9中的运算符来描述文件名的集合。例如,文件名表达式*.o和所有以.0结束的文件名匹配;sort1.?和所有形如sort1.c的文件名匹配,其中c可以是任何字符。试问如何使用只包含并、连接和闭包运算符的正则表达式来表示sh文件名表达式?


答案: 首先设name为所有可以做文件名的字符,前缀一定为可做文件名的字符,然后可以为?*\的字面字符,点号“.”之后也是一样的:
[name\ * \ ?? ’\’].[ name \ * \ ??’\’]

练习3.4.1: 给出识别练习3.3.2中各个正则表达式所描述的语言的状态转换图


答案:
1)

2)

3)该小题较复杂,为了确保思路清晰,首先作出如下所示的NFA图像:

其次将这个NFA进一步转换得到状态转移图(也是某种意义上的DFA):

4)为了确保思路清晰,首先作出如下所示的NFA图像:

其次将这个NFA进一步转换得到状态转移图(也是某种意义上的DFA):

5)这个字符串可以看作是(aa|bb) * 和((ab|ba)(aa|bb) * (ab|ba)(aa|bb)* )*两个闭包连接而成的而在画第二个大闭包的各个组成部分的时候,最后一部分(aa|bb) * 与第一部分的闭包完全相同,所以可以转换到第一部分从而形成闭包,具体状态转移图如下所示:

练习3.4.2:给出识别练习3.3.5中各个正则表达式所描述的语言的状态转换图。


答案:
1)σ * a(σ | a) * e(σ | e) * i(σ | i) * o(σ | o) * u(σ | u) *

2)a * b * … z *

3)\ / \ * ((^\ * \ / ) | (“ * / ”)) * \ * \ /
(注:在符号 ’ * ’ 和 ’ / ’ 之前加符号 ’ \ ’ 是为了使该符号正常被接收而不被当作换行符或其他处理,并没有实际意义)

9)( b * a * )( ε | b a * )

练习3.6.2:为练习3.3.5中的每一个语言设计一个DFA或NFA。


答案:
1)σ * a(σ | a) * e(σ | e) * i(σ | i) * o(σ | o) * u(σ | u) * 的NFA如下所示:

2)a * b * … z * 的NFA如下所示:

q0={s0,s1,s3,s4,…,s78},q1={s1,s2,s3,s4,…,s78},其他状态可以类推,故DFA如下:

3)\ / \ * ((^\ * \ / ) | (“ * / ”)) * \ * \ / (注:在符号’*’和’/’之前加符号’\’是为了使该符号正常被接收而不被当作换行符或其他处理,并没有实际意义)

9)( b * a * )( ε | b a * )的NFA如下图所示:

练习3.6.3:找出图3-29所示的NFA中所有标号为aabb的路径。这个NFA接受aabb吗?


答案: NFA中所有标号为aabb的路径为:

所以这个NFA接受aabb。

练习3.6.4:对于图3-30的NFA,重复练习3.6.3。


答案: NFA中所有标号为aabb的路径为:

所以这个NFA接受aabb。

练习3.7.1:将下列图中的NFA转换成DFA。

答案:
1)

q0={s0,s1,s3},q1={s2},q2={s4},作出如下状态转移表:

a b
q0 q1 q2
q1 q1 NULL
q2 NULL q2

所以DFA如下所示:

2)

q0={s0},q1={s0,s1},q2={s0,s1,s2},q3={s0,s1,s2,s3},作出如下状态转换表:

a b
q0 q1 q0
q1 q2 q1
q2 q2 q3
q3 q2 q3

所以DFA如下所示:

3)

q0={s0,s1,s2,s3},作出如下状态转移表:

a b
q0 q0 q0

所以DFA如下所示:

练习3.7.3:使用算法3.23和3.20将下列正则表达式转换成DFA。


答案: 使用算法3.23(即:Thompson算法)和算法3.20(即:子集构造算法)转换如下:
1)NFA如下所示:

列出状态转移表:

a b
q0 q1 q2
q1 q1 q2
q2 q1 q2

所以DFA如下所示:

2)NFA如下所示:

q0={s0,s1,s2,s3,s5,s6,s7,s9,s10,s11},
q1={s1,s2,s3,s4,s5,s6,s7,s9,s10,s11},
q2={s1,s2,s3,s5,s6,s7,s8,s9,s10,s11},
列出状态转移表:

a b
q0 q1 q2
q1 q1 q2
q2 q1 q2

所以DFA如下所示:

3)NFA如下所示:

q0={s0,s1,s2,s3,s4,s6,s7,s8,s10,s11},
q1={s1,s2,s3,s4,s5,s6,s7,s8,s10,s11},
q2={s1,s2,s3,s5,s6,s7,s8,s9,s10,s11},
列出状态转移表:

a b
q0 q1 q2
q1 q1 q2
q2 q1 q2

所以DFA如下所示:

4)NFA如下所示:

q0={s0,s1,s2,s4,s7},
q1={s1,s2,s3,s6,s7,s8},
q2={s1,s2,s4,s5,s6,s7},
q3={s1,s2,s4,s5,s6,s7,s9},
q4={s1,s2,s4,s5,s6,s7,s10,s11,s12,s13,s15,s18},
q5={s1,s2,s3,s4,s6,s7,s8,s11,s12,s13,s14,s15,s17,s18},
q6={s1,s2,s4,s5,s6,s7,s8,s11,s12,s14,s16,s17,s18},
q7={s1,s2,s4,s5,s6,s7,s9,s11,s12,s15,s16,s17,s18},
q8={s1,s2,s4,s5,s6,s7,s10,s11,s12,s15,s16,s17,s18},
列出状态转移表:

a b
q0 q1 q2
q1 q1 q3
q2 q1 q2
q3 q1 q4
q4 q5 q6
q5 q5 q6
q6 q5 q6

所以DFA如下所示:

练习3.9.4:为下列的正则表达式构造最少状态DFA:


答案:
1)NFA如下所示:

q0={s0,s1,s2,s4,s7},
q1={s1,s2,s3,s4,s6,s7,s8,s9,s11},
q2={s1,s2,s4,s5,s6,s7},
q3={s1,s2,s3,s4,s6,s7,s8,s9,s10,s11,s13},
q4={s1,s2,s4,s5,s6,s7,s12,s13},
列出状态转移表:

a b
q0 q1 q2
q1 q3 q4
q2 q1 q2
q3 q3 q4
q4 q1 q2

所以DFA如下所示:

首先把所有状态分为非终结状态集 {q0,q1,q2} 和终结状态集 {q3,q4} ,然后逐步对他们进行切分,切分的条件是如果接收某一字符后到达不同状态则切分为两个集合。首先,q1 接收字符 a 后会到达 q3 ,也就是终结状态集中,和其他两个状态接收a后仍然在非终结状态集中不一样,所以切分为:A {q0,q2} 和 B {q1} 。而 q4 接收字符 a 后会到达 q2 ,也就是非终结状态集中,和其他 q4 接收b后仍然在非终结状态集中不一样,所以切分为:C {q3} 和 D {q4} 。得到最少DFA如下所示:

2)NFA如下所示:

q0={s0,s1,s2,s4,s7},
q1={s1,s2,s3,s4,s6,s7,s8,s9,s11},
q2={s1,s2,s4,s5,s6,s7},
q3={s1,s2,s3,s4,s6,s7,s8,s9,s10,s11,s13,s14,s16},
q4={s1,s2,s4,s5,s6,s7,s12,s13,s14,s16},
q5={s1,s2,s3,s4,s6,s7,s8,s9,s10,s11,s13,s14,s15,s16,s18},
q6={s1,s2,s4,s5,s6,s7,s12,s13,s14,s16,s17,s18},
q7={s1,s2,s3,s4,s6,s7,s8,s9,s11,s15,s18},
q8={s1,s2,s3,s4,s6,s7,s17,s18},
作出如下状态转移表:

a b
q0 q1 q2
q1 q3 q4
q2 q1 q2
q3 q5 q6
q4 q7 q8
q5 q5 q6
q6 q7 q8
q7 q5 q4
q8 q1 q2

所以DFA如下所示:


首先把所有状态分为非终结状态集 {q0,q1,q2,q3,q4} 和终结状态集 {q5,q6,q7,q8} ,然后逐步对他们进行切分,切分的条件是如果接收某一字符后到达不同状态则切分为两个集合。其中,q3 和 q4 接收字符a、b后会到达终结状态集中,和其他两个状态接收a、b后仍然在非终结状态集中不一样,所以切分为:{q0,q1,q2} 和 {q3,q4} 。接着对集合 {q0,q1,q2} 作划分,q0 接收a、b后的转移状态和 q2 一样,q1 则不同,所以将 {q0,q1,q2} 集合切分为:{q0,q1} 和 {q2} 。一直按这个原则重复上述步骤,最后切分结果为:A{q0,q2} ,B{q1} ,C{q3},D{q4}, E{q5},F{q6},G{q7},H{q8},得到最少DFA如下所示:

3)NFA如下所示:

q0={s0,s1,s2,s4,s7},
q1={s1,s2,s3,s4,s6,s7,s8,s9,s11},
q2={s1,s2,s4,s5,s6,s7},
q3={s1,s2,s3,s4,s6,s7,s8,s9,s10,s11,s13,s14,s16},
q4={s1,s2,s4,s5,s6,s7,s12,s13,s14,s16},
q5={s1,s2,s3,s4,s6,s7,s8,s9,s10,s11,s13,s14,s15,s16,s18,s19,s21},
q6={s1,s2,s4,s5,s6,s7,s12,s13,s14,s16,s17,s18,s19,s21},
q7={s1,s2,s3,s4,s6,s7,s8,s9,s11,s15,s18,s19,s21},
作出如下状态转移表:

a b
q0 q1 q2
q1 q3 q4
q2 q1 q2
q3 q5 q6
q4 q7 q8
q5 q9 q10
q6 q11 q12
q7 q3 q4
… … … … … …

(表格篇幅过大不一一列举,依照同一步骤完成整个状态转移表即可)
所以DFA如下所示:

首先把所有状态分为非终结状态集 {q0,q1,q2,q3,q4,q5,q6,q7,q8} 和终结状态集 {q9,q10,q11,q12,q13,q14,q15,q16} ,然后逐步对他们进行切分,切分的条件是如果接收某一字符后到达不同状态则切分为两个集合。一直按这个原则重复上述步骤,最后切分结果为:A{q0,q2} ,B{q1} ,C{q3},D{q4}, E{q5},F{q6},G{q7},H{q8},I{q9} ,J{q10},K{q11}, L{q12},M{q13},N{q14},O{q15},P{q16},得到最少DFA如下所示:
根据画出三个小问的最少状态DFA图,我总结出如下规律:

  1. 每个DFA图的q0和q2都可以合并从而得到最少状态DFA;

  2. 序号最大的接受状态都是输入a指向B,输入b指向A。所以最小 DFA 都首尾相连;

  3. DFA中节点的个数呈现指数倍增长。

【编译原理】龙书第三章作业答案相关推荐

  1. 编译原理 龙书第4章 作业3

    4.2.1 考虑上下文无关文法: S→S S + | S S * | a, 以及串aa+a* 1)给出这个串的一个最左推导 S→S S * →S S + S * →a S + S * →a a + S ...

  2. 正则表达式引擎的构建——基于编译原理DFA(龙书第三章)——1 概述

    说明:本系列文章介绍的算法均来自编译原理(龙书)一书,如果读者对代码没有兴趣,只想了解算法思路,完全可以阅读龙书相关章节内容,比我讲得清晰透彻. 序: 啃编译原理半年以来,任然徘徊在前4章,其间反反复 ...

  3. 编译原理练习题(第三章)

    编译原理练习题(第三章) 一. 二. 三. 四.

  4. dx12 龙书第三章学习笔记 -- 变换

    1.线性变换:   函数的输入和输出都是3D向量,我们称为线性变换 矩阵表示法: ⭐所以已知一个线性变换,只要将i,j,z也就是标准基向量代入线性变换,就能构造一个变换矩阵 A:线性变换的矩阵表示法 ...

  5. 正则表达式引擎的构建——基于编译原理DFA(龙书第三章)——5 DFA最小化

    完整引擎代码在github上,地址为:https://github.com/sun2043430/RegularExpression_Engine.git DFA最小化的算法原理 "DFA状 ...

  6. 《编译原理-龙书》练习第4章

    4.2 上下文无关文法 **4.2.7节中L={a^nb^n|n>=1}怎么用文法表示? S -> aAb A -> ab| ε 4.2.1 1) E -> EE* -> ...

  7. 《编译原理-龙书》练习第2章

    第2章 一个简单的语法制导翻译器 2.2 语法定义 主要描述了"上下文无关文法" 2.2.1 1) S1 = aa+ S2 = S1a* 2)              * + a ...

  8. 《编译原理-龙书》练习第3章

    3.1 词法分析器的作用 3.1.1          float     limitedSquare     (      x     )     {     float     x     ; r ...

  9. 编译原理 龙书 笔记

    DFA NFA CFG DFA的定义: A = ( Σ, S, s0, F, N ) Σ: 输入字母表(alphabet),是一个输入字符的集合. S:状态的集合s0: 初始状态F:终止状态集合 F ...

最新文章

  1. nodejs 获取文件路径_Qunar 酒店 Nodejs 覆盖率收集实践
  2. ExtJS4.x动态加载js文件
  3. MVC后台创建Json(List),前台接受并循环读取
  4. python跨目录调用_python 跨目录访问文件
  5. python3 urllib安装_对python3 urllib包与http包的使用详解
  6. python读取配置文件获取所有键值对_python读取配置文件
  7. Kali Linux安装Remmina无法加载RDP插件
  8. 为linux扩展swap分区
  9. java工程师简历项目经验
  10. 动态规划之矩阵连乘问题详细解读(思路解读+填表+代码)
  11. 万用表二极管档和三极管档的使用
  12. 使用EXCEL VBA代码自动群发带附件的邮件同时抄送给不同的人
  13. NTFS,exFAT,FAT32最详细的评测
  14. Android程序的入口
  15. macOS SwiftUI 指示器组件规范之 02 评级指标 Rating Indicators
  16. 优秀的程序员都在关注「沉默王三」公众号
  17. 0.96寸OLED显示屏标准库移植HAL库(模拟IIC) - 基于STM32
  18. 使用CvvImage类在MFC的static控件显示图片
  19. javaEE开发如何在oracle官网下载安装jdk?(java SE 8u5 JDK 和 Java EE 7 SDK with JDK 7 U45的区别 )
  20. 吴军《数学之美》部分概念笔记(1-11章)

热门文章

  1. 数据通信与网络(五)
  2. r7 7735h和r5 5560U差距 锐龙r77735h和r55560U对比
  3. BGP-边际网关路由协议简记
  4. [视觉实战案例]Qt调用Basler网口工业相机SDK实现采图和相机参数设置
  5. owasp top10 渗透测试
  6. 安卓系统结构和安卓开发目录结构
  7. 地图坐标格式转换工具
  8. html网页设计与制作:基于html设计整套招聘网站求职前端模板页面 静态网页HTML代码 学生网页课程设计期末作业下载
  9. 【详细图解】一步一步教你自定义博客园(cnblog)界面
  10. gwr模型用什么做_如何对好文章做信息处理,用好文章摘录模型