编译原理第二版4.4答案

2023-11-06

4.4 节的练习

4.4.1

为下面的每个文法设计一个预测分析器,并给出预测分析表。你可能先要对文法进行提取左公因子或者消除左递归的操作。

练习 4.2.2 中 1 - 7 中的文法。

解答
  1. S -> 0 S 1 | 0 1

    step1. 提取左公因子

     S -> 0 A
     A -> S 1 | 1
    

    step2. 消除左递归

     S -> 0 A
     A -> 0 A 1 | 1
    

    step3. 预测分析表

    非终结符号 输入符号
    0 1 $
    S S -> 0 A
    A A -> 0 A 1 A -> 1
  2. S -> + S S | * S S | a

    step1. 无左公因子

    step2. 无左递归

    step3. 预测分析表

    非终结符号 输入符号
    + * a $
    S S -> + S S S -> * S S S -> a
  3. ! S -> S (S) S | ε

    step1. 无左公因子

    step2. 消除左递归

     S -> A
     A -> (S) S A | ε
    

    step3. 预测分析表

    非终结符号 输入符号
    ( ) $
    S S -> A S -> A S -> A
    A A -> (S) S A
    A -> ε
    A -> ε A -> ε
  4. ! S -> S + S | S S | (S) | S * | a

    step1. 提取左公因子

     S -> SA | (S) | a
     A -> +S | S | *
    

    进一步提取终结符

     S -> SA | T
     A -> +S | S | *
     T -> (S) | a  
    

    step2. 消除左递归(根据 p135 的算法 4.19)

     i = 1
             S -> TB
             B -> AB | ε
             
     i = 2
         j = 1
             A -> +S | TB | *
             
     i = 3
         j = 1
             无需处理
         j = 2
             无需处理
    

    得到最终的产生式

     S -> TB
     B -> AB | ε
     A -> +S | TB | *
     T -> (S) | a  
    

    step3. first && follow

     first(T) = [(, a]
     first(A) = [+, *] + first(T) =[+, *, (, a]
     first(B) = [ε] + first(A) = [ε, +, *, (, a]
     first(S) = first(T) = [(, a]
    
     follow(T) = [$, +, *, (, a]
     follow(A) = [$, +, *, (, ), a]
     follow(B) = [$]
     follow(S) = [$, +, *, (, ), a]
    

    step4. 预测分析表

    非终结符号 输入符号
    ( ) + * a $
    S S -> TB S -> TB
    B B -> AB B -> AB B -> AB B -> AB B -> ε
    A A -> TB A -> +S A -> \* A -> TB
    T T -> (S) T -> a
  5. S -> (L) | a 以及 L -> L, S | S

    step1. 无左公因子

    step2. 消除左递归

     S -> (L) | a
     L -> SA
     A -> ,SA | ε
    

    step3. 预测分析表

  6. grammar for boolean expressions:

    bexpr -> bexpr or bterm | bterm
    bterm -> bterm and bfactor | bfactor
    bfactor -> not bfactor | ( bexpr ) | true | false
    

    step1. 无左公因子

    step2. 消除左递归

    bexpr -> bterm bexpr'
    bexpr' -> or bterm bexpr' | ε
    bterm -> bfactor bterm'
    bterm' -> and bfactor bterm' | ε
    bfactor -> not bfactor | (bexpr) | true | false
    

    step3. first && follow

    first(bexpr) = first(bterm) = first(bfactor) = [not, (, true, false]
    first(bexpr') = [or, ε]
    first(bterm') = [and, ε]
    
    follow(bexpr) = follow(bexpr') = [), $]
    follow(bterm) = follow(bterm') = [or, $]
    follow(bfactor) = [and, $]
    
    

    step4. 预测分析表

    非终结符号 输入符号
    and or not ( ) true false $
    bexpr bexpr -> bterm bexpr' bexpr -> bterm bexpr' bexpr -> bterm bexpr' bexpr -> bterm bexpr'
    bexpr' bexpr' -> or bterm bexpr' bexpr' -> ε bexpr' -> ε
    bterm bterm -> bfactor bterm' bterm -> bfactor bterm' bterm -> bfactor bterm' bterm -> bfactor bterm'
    bterm' bterm' -> and bfactor bterm' bterm' -> ε bterm' -> ε
    bfactor bfactor -> not bfactor bfactor -> (bexpr) bfactor -> true bfactor -> false

4.4.2 !!

有没有可能通过某种方法修改练习 4.2.1 中的文法,构造出一个与该练习中的语言(运算分量为 a 的后缀表达式)对应的预测分析器?

解答
S -> SS+ | SS* | a

step1. 提取左公因子

S -> SSA | a
A -> + | *

step2. 消除左递归

i = 1 
        S -> aB
        B -> SAB | ε
        A -> + | *
i = 2
    j = 1
        S -> aB
        B -> aBAB | ε
        A -> + | *

step3. 预测分析表

非终结符号 输入符号
+ * a $
S S -> aB
A A -> + A -> *
B B -> ε B -> ε B -> SAB B -> ε

4.4.3

计算练习 4.2.1 的文法的 FIRST 和 FOLLOW 集合。

解答
  • first(S) = [a]
  • follow(S) = [a, +, *]

4.4.4

计算练习 4.2.2 中各个文法的 FIRST 和 FOLLOW 集合。

解答
  1. S -> 0 S 1 | 0 1

    • first(S) = [0]
    • follow(S) = [1, $]
  2. S -> + S S | * S S | a

    • first(S) = [+, *, a]
    • follow(S) = [+, *, a, $]
  3. S -> S (S) S | ε

    • first(S) = [(, ε]
    • followS(S) = [), $]
  4. S -> S + S | S S | (S) | S * | a

    • first(S) = [(, a]
    • follow(S) = [+, (, ), a, *, $]
  5. S -> (L) | a 以及 L -> L, S | S

    • first(S) = [(, a]
    • follow(S) = [",", $]
    • first(L) = first(S) = [(, a]
    • follow(L) = [), “,”, $]
  6. S -> a S b S | b S a S | ε

    • first(S) = [a, b, ε]
    • follow(S) = [a, b, $]
  7. 下面的布尔表达式对应的文法:

     bexpr -> bexpr or bterm | bterm
     bterm -> bterm and bfactor | bfactor
     bfactor -> not bfactor | (bexpr) | true | false
    

4.4.5

文法 S -> aSa | aa 生成了所有由 a 组成的长度为偶数的串。我们可以为这个文法设计一个带回溯的递归下降分析器。如果我们选择先用产生式 S -> aa 展开,那么我们只能识别串 aa。因此,任何合理的递归下降分析器将首先尝试 S -> aSa。

  1. ! 说明这个递归下降分析器识别输入 aa,aaaa 和 aaaaaaaa,但识别不了 aaaaaa。
  2. !! 这个递归下降分析器识别什么样的语言?

注意

以下题目请参考 Aho 本人的讲义:Aho: Properties of Context-Free Languages本地副本

此外还有另一篇内容相似的文章本地副本

关于 CNF 和 CYK 算法,有较多相关资料,自行搜索

4.4.6 !

如果一个文法没有产生式体为 ε 的产生式,那么这个文法就是无 ε 产生式的。

  1. 给出一个算法,他的功能是把任何文法转变成一个无 ε 产生式的生成相同语言的文法(唯一可能的例外是空串——没有哪个无 ε 产生式的文法能生成 ε)。提示:首先找出所有可能为空的非终结符号。非终结符号可能为空是指它(可能通过很长的推导)生成 ε。
  2. 将你的算法应用于文法 S -> aSbS | bSaS | ε

4.4.7 !

单产生式是指其产生式体为单个非终结符号的产生式,即形如 A -> B 的产生式。

  1. 给出一个算法,它可以把任何文法转变成一个生成相同语言(唯一可能的例外是空串)的、无 ε 产生式、无单产生式的文法。提示:首先消除 ε 产生式,然后找出所有满足下列条件的非终结符号对 A 和 B:存在 A =*=> B。
  2. 将你的算法应用于 4.1.2 节的算法。
  3. 说明作为 (1) 的一个结果,我们可以把一个文法转换成一个没有环的等价文法。

4.4.8 !!

如果一个文法的每个产生式要么形如 A -> BC,要么形如 A -> a,那么这个文法就成为 Chomsky 范式(Chomsky Normal Form, CNF)。说明如何将任意文法转变成一个生成相同语言(唯一可能的例外是空串——没有 CNF 文法可以生成 ε)的 CNF 文法。

4.4.9 !

对于每个具有上下文无关的语法,其长度为 n 的串可以在 O(n^3) 的时间内完成识别。完成这种识别工作的一个简单方法称为 Cocke-Younger-Kasami(CYK)算法。该算法基于动态规划技术。也就是说,给定一个串 a_1a_2…a_n,我们构造出一个 nxn 的表 T 使得 T_ij 是可以生成子串 a_ia_i+1…aj 的非终结符号的集合。如果基础文法是 CNF 的,那么只要我们按照正确的顺序来填表:先填 j-i 值最小的条目,则表中的每一个条目都可以在 O(n) 时间内填写完毕。给出一个能够正确填写这个表的条目的算法,并说明你的算法的时间复杂度为 O(n^3)。填完这个表之后,你如何判断 a_1a_2…a_n 是否在这个语言中?

4.4.10 !

说明我们如何能够在填好练习 4.4.9 中的表之后,在 O(n) 的时间内获得 a_1a_2…a_n 对应的一颗语法分析树?提示:修改练习 4.4.9 中的表 T,使得对于表的每个条目 T_ij 中的每个非终结符号 A,这个表同时记录了其他条目中的哪两个非终结符号组成的对偶使得我们将 A 放到 T_ij 中。

4.4.11 !

修改练习 4.4.9 中的算法,使得对于任意符号串,他可以找出至少需要执行多少次插入、删除和修改错误(每个错误是一个字符)的操作才能将这个串变成基础文法的语言的句子。

4.4.12 !

stmt -> if e then stmt stmtTail
      | while e do stmt
      | begin list end
      | s
stmtTail -> else stmt
          | ε
list -> stmt listTail
listTail -> ; list
          | ε

上面的代码给出了对应于某些语句的文法。你可以将 e 和 s 当做分别代表条件表达式和“其他语句”的终结符号。如果我们按照下列方法来解决因为展开可选“else”(非终结符号 stmtTail)而引起的冲突:当我们从输入中看到一个 else 时就选择消耗掉这个 else。使用 4.4.5 节中描述的同步符号的思想:

  1. 为这个文法构造一个带有错误纠正信息的预测分析表。
  2. 给出你的语法分析器在处理下列输入时的行为:
    1. if e then s; if e then s end
    2. while e do begin s; if e then e; end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编译原理第二版4.4答案 的相关文章

  • Mybatis整合Spring -- typeAliasesPackage

    Mybatis 整合 Spring integration MapperScannerConfigurer Mybatis整合Spring 根据官方的说法 在ibatis3 也就是Mybatis3问世之前 Spring3的开发工作就已经完成
  • python时间计算 周开始第一天和结束天 通过年周计算

    python def year mon for check year week 通过年周获取当前月 按每周最后一天的月份比对 最后一天为周日 end year week str year str week 0 end week result
  • xss入门闯关详解6-10关

    继续进行6 10关 第6关 简单的尝试之后发现闭合掉了 尝试空格或者大小写 tab绕过 大小写成功绕过 Onclick alert 1 第七关 老样子 value gt click alert 1 gt value gt lt gt ale
  • 取消idm下载器和google浏览器的关联(让谷歌浏览器禁止使用idm插件)

    https jingyan baidu com article 597035529ae46b8fc107405d html IDM下载安装成功之后 会自动默认关联你电脑上的所有浏览器 在使用浏览器下载的时候自动会变成IDM下载 如果不想让I
  • 2018-2019-2 网络对抗技术 20165335 Exp2 后门原理与实践

    一 基础问题回答 1 例举你能想到的一个后门进入到你系统中的可能方式 钓鱼网站 搞一个假网站 假淘宝 盗版电影 文库下载文档什么的 下载东西的时候把带隐藏的后门程序附带下载进去 自启动 反弹连接 搞一个小网站 用iframe标签跳转到危险网
  • 自动化测试工具Parasoft c++ test v2021.1全新发布,简化嵌入式测试

    随着Parasoft C C test 2021 1的发布 嵌入式测试和开发团队获得了现代高度自动化CI CD管道的速度和效率 最新版本为团队提供了完全集成的静态和单元测试 以实现持续合规性和质量的交付 新版本继续全面支持最新的合规标准 包
  • 几种查找的时间复杂度

    1 顺序查找 1 最好情况 要查找的第一个就是 时间复杂度为 O 1 2 最坏情况 最后一个是要查找的元素 时间复杂度未 O n 3 平均情况下就是 n 1 2 所以总的来说时间复杂度为 O n 2 二分查找 O log2n gt log以
  • 在Ubuntu上编译安装LLVM

    章节索引 Motivation 环境 Git 下载LLVM源码 CMake 编译 安装 文件链接 验证 后记 Motivation 两周前实验室要求我配置一个叫Speedy js的编译器 配置这个编译器需要先配置好LLVM 根据这个编译器作
  • Unity 流程控制

    异步函数 Invoke 被调用的方法不是立刻执行 而是过一段时间后才执行 注 Invoke是不能接受有参数的方法的 Invoke是受Time timeScale的影响 所以当Time timeScale 0 的时候 Invoke是无效的 因
  • python测试url是否可访问,网站是否连通的方法

    目录 前言 1 requests库 1 1 传参 1 2 响应内容 2 python web 前言 一般这种方法用在校验 比如 前端界面传回后端的url 如果返回值不是200 不保存其值 调用的接口不通 直接返回非200 爬虫网站 验证ur
  • C# Dictionary用法总结

    1 常规用法 增加键值对之前需要判断是否存在该键 如果已经存在该键而且不判断 将抛出异常 所以这样每次都要进行判断 很麻烦 在备注里使用了一个扩展方法 public static void DicSample1 Dictionary

随机推荐

  • 【今日CV 计算机视觉论文速览 第111期】Fri, 3 May 2019

    今日CS CV 计算机视觉论文速览 Fri 3 May 2019 Totally 29 papers 上期速览 更多精彩请移步主页 Interesting Single Image Portrait Relighting单图肖像光照重建 本
  • 【Java基础】使用HashMap和For循环查找数据并且统计耗费时长

    准备一个ArrayList其中存放3000000 三百万个 Hero对象 其名称是随机的 格式是hero 4位随机数 hero 3229 hero 6232 hero 9365 因为总数很大 所以几乎每种都有重复 把名字叫做 hero 55
  • ICS大作业--hello程序人生

    摘 要 Hello是每个程序员第一个接触的程序 在本文中利用计算机系统所学的知识 基于Linux平台 通过gcc objdump gdb edb等工具 从c源程序的预处理开始 跟踪分析程序编译 汇编 链接 进程管理 存储管理 I O管理整个
  • 基于Matlab的激光雷达与单目摄像头联合外参标定

    1 背景介绍 目前团队正在与某主机厂合作开发L4级自动驾驶出租车项目 所用的传感器包括80线激光雷达和单目摄像头 为了充分利用Lidar和Cam各自的优势 设计了一种融合算法 需要获得Lidar2Camera的联合外参 前期使用Autowa
  • Java数组&二维数组

    Java数组 二维数组 1 一维数组 1 1 数组介绍 数组就是存储数据长度固定的容器 存储多个数据的数据类型要一致 1 2 数组的定义格式 1 2 1 第一种格式 数据类型 数组名 示例 int arr double arr char a
  • python调用多级目录中的文件_python复制多层目录下的文件至其他盘符对应的目录中...

    tmp c cmd js d TZT2 0 js d TZT js d TZT 346 226 207 346 241 243 350 257 264 346 230 216 json d c modules config js d css
  • Go_包、工程管理

    包 包其实就是文件夹 把文件分类放到不同的包利于管理 作用 如果把所有的代码都放在一个文件中 后续的可维护性 阅读性都比较差 所以可以使用包的来区分不同的模块 功能分别放在不同包中 然后其它的文件使用到功能就调用就可以了 在同一个包下是函数
  • android studio在XML预览中出现Rendering Problems问题

    http blog csdn net u014365838 article details 52078501 如图所示 出现问题的原因是style不和规范 虽然没有大问题 编译也可以通过 不过总有些碍眼 解决方法 1 在styles xml
  • apache-ant build.xml 实例

    文章目录 version apache ant 1 9 15 build xml
  • php发送邮件样式_php简单实现发送带附件的邮件

    这篇文章主要介绍了php简单实现发送带附件的邮件 涉及附件上传及邮件发送的相关技巧 需要的朋友可以参考下 本文实例讲述了php简单实现发送带附件的邮件 分享给大家供大家参考 具体如下 下面是静态html代码 带附件的邮件发送 发送人 收件人
  • 多gpu训练梯度如何计算,求和是否要求平均

    作者 智星云服务 链接 https www zhihu com question 271226455 answer 1521784627 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 作者 itsAndy
  • libc.so.6

    libc so 6是一个类似于WINDOWS下的一个快捷指向型的文件 用命令LN产生 ln s root arm unknown linux gnu arm unknown linux gnu lib libc so root worksp
  • uni-app生产环境去掉console

    uni app生产环境去掉console 运行期判断 运行期判断是指代码已经打入包中 仍然需要在运行期判断平台 此时可使用 uni getSystemInfoSync platform 判断客户端环境是 Android iOS 还是小程序开
  • kubernetes安全检测工具-kube-bench

    一 kube bench基础介绍 kube bench是基于go语言开发 一款针对kubernetes进行安全检测的工具 主要是检测kubernetes集群的各个组件的配置 确认配置文件是否符合安全基线标准 输出检测报告 并给出修复建议 从
  • 蓝桥杯 算法训练 拿金币 Java

    import java util Scanner public class Main public static void main String args Scanner scanner new Scanner System in int
  • 第十二届蓝桥杯javaB组刷题day2

    1 直线 我们思路 暴力解法 将所有可能的情况列举出来 故需要两个坐标的横纵坐标 便需要四个for循环来进行遍历 出现问题 需要排除斜率为0的情况 后面再单独进行相加 因为需要set来加入斜率 而一条斜线y kx b 包括k和b set只能
  • Linux ceontOS7.X 安装RabbitMQ

    安装erlang环境 https blog csdn net qq 37279783 article details 90515409 下载 解压MQ 下载 https www rabbitmq com releases rabbitmq
  • 测试用例设计方法---等价类划分法

    1 等价类划分法 1 1 定义 是把所有可能输入的数据 即程序的输入域划分策划国内若干部分 子集 然后从每一个子集中选取少数具有代表性的数据作为测试用例 方法是一种重要的 常用的黑盒测试用例设计方法 1 1划分等价类 1 有效等价类 指对于
  • 大师兄!SLAM 为什么需要李群与李代数?

    from https mp weixin qq com s sVjy9kr 8qc9W9VN78JoDQ 作者 electech6 来源 计算机视觉life 编辑 Tony 很多刚刚接触SLAM的小伙伴在看到李群和李代数这部分的时候 都有点
  • 编译原理第二版4.4答案

    4 4 节的练习 4 4 1 为下面的每个文法设计一个预测分析器 并给出预测分析表 你可能先要对文法进行提取左公因子或者消除左递归的操作 练习 4 2 2 中 1 7 中的文法 解答 S gt 0 S 1 0 1 step1 提取左公因子