编译原理第二版4.3答案

4.3 节的练习

4.3.1

下面是一个只包含符号 a 和 b 的正则表达式文法。它使用 + 替代表示并运算的字符 | ,以避免和文法中作为元符号使用的竖线相混淆:

rexpr -> rexpr + rterm | rterm
rterm -> rterm rfactor | rfactor
rfactor -> rfactor * | rprimary
rprimary -> a | b
  1. 对这个文法提取左公因子。
  2. 提取左公因子的变换能使这个文法适用于自顶向下的语法分析技术吗?
  3. 提取左公因子之后,从原文法中消除左递归。
  4. 得到的文法适用于自顶向下的语法分析吗?
解答
  1. 无左公因子

  2. 不适合

  3. 消除左递归

        rexpr -> rterm A
            A -> + rterm A | ε
        rterm -> rfactor B
            B -> rfactor B | ε
      rfactor -> rprimary C
            C -> * C | ε
     rprimary -> a | b
    
  4. 适合?

4.3.2

对下面的文法重复练习 4.3.1

  1. 练习 4.2.1 的文法
  2. 练习 4.2.2-1 的文法
  3. 练习 4.2.2-3 的文法
  4. 练习 4.2.2-5 的文法
  5. 练习 4.2.2-7 的文法
解答
  1. S -> S S + | S S * | a

    1. 提取左公因子

       S -> S S A | a
       A -> + | *
      
    2. 不适合

    3. 消除左递归

       // initial status
       1)S -> S S A | a
       2) A -> + | *
       
       // i = 1
       1) S -> a B
       2) B -> S A B | ε
       3) A -> + | *
       
       // i = 2, j = 1
       1) S -> a B
       2) B -> a B A B | ε
       3) A -> + | *
       
       // i = 3, j = 1 ~ 2
       // nothing changed
      
    4. 适合

  2. S -> 0 S 1 | 0 1

    1. 提取左公因子

       S -> 0 A
       A -> S 1 | 1
      
    2. 不适合,有间接左递归

    3. 消除左递归

       // initial status
       1) S -> 0 A
       2) A -> S 1 | 1
       
       // i = 1
       // nothing changed
       
       // i = 2, j = 1
       1) S -> 0 A
       2) A -> 0 A 1 | 1
      
    4. 合适

  3. S -> S (S) S | ε

    1. 无左公因子

    2. 不合适

    3. 消除左递归

       // initial status
       1) S -> S (S) S | ε
       
       // i = 1
       1) S -> A
       2) A -> (S) S A | ε
       
       // i = 2, j = 1
       // nothing changed
      
    4. 合适

  4. S -> (L) | a 以及 L -> L, S | S

    1. 无左公因子

    2. 不合适

    3. 消除左递归

       // initial status
       1) S -> (L) | a
       2) L -> L, S | S
       
       // i = 1
       // nothing changed
       
       // i = 2, j = 1
       1) S -> (L) | a
       2) L -> (L) A | a A
       3) A -> , S A | ε
       
       // i = 3, j = 1~2
       // nothing changed
      
    4. 合适

4.3.3 !

下面文法的目的是消除 4.3.2 节中讨论的 “悬空-else 二义性”:

stmt -> if expr then stmt
      | matchedStmt
matchedStmt -> if expr then matchedStmt else stmt
             | other

说明这个文法仍然是二义性的。

解答

看一段示范代码,我们通过缩进来表示代码解析的层次结构

if expr 
then 
    if expr 
    then matchedStmt 
    else
        if expr
        then matchedStmt
else stmt

这段代码还可以被解析成

if expr 
then 
    if expr 
    then matchedStmt 
    else
        if expr
        then matchedStmt
        else stmt

所以这仍然是一个二义性的文法。原因在于 matchedStmt -> if expr then matchedStmt else stmt 中的最后一个 stmt,如果包含 else 语句的话,既可以认为是属于这个 stmt 的,也可以认为是属于包含这个 matchedStmt 的语句的。

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
编译原理》课后习题答案第一章 第 1 章引论 第 1 题 解释下列术语: (1)编译程序 (2)源程序 (3)目标程序 (4)编译程序的前端 (5)后端 (6)遍 答案: (1) 编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语 言,则此翻译程序称为编译程序。 (2) 源程序:源语言编写的程序称为源程序。 (3) 目标程序:目标语言书写的程序称为目标程序。 (4) 编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与 目标机无关。通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶 段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符 号表管理等工作。 (5) 后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段, 即目标代码生成,以及相关出错处理和符号表操作。 (6) 遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。 第 2 题 一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程 序的总体结构图。 答案一个典型的编译程序通常包含 8 个组成部分,它们是词法分析程序、语法分析程序、语 义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和 错误处理程序。其各部分的主要功能简述如下。 词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。 语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。 语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表 中。 中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式 的中间语言代码,如三元式或四元式。 中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。 盛威网(www.snwei.com)专业的计算机学习网站1 《编译原理》课后习题答案第一章 目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。 表格管理程序:负责建立、填写和查找等一系列表格工作。表格的作用是记录源程序的 各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的 中间结果都记录在相应的表格中。可以说整个编译过程就是造表、查表的工作过程。需要指 出的是,这里的“表格管理程序”并不意味着它就是一个独立的表格管理模块,而是指编译 程序具有的表格管理功能。 错误处理程序:处理和校正源程序中存在的词法、语法和语义错误。当编译程序发现源 程序中的错误时,错误处理程序负责报告出错的位置和错误性质等信息,同时对发现的错误 进行适当的校正(修复),目的是使编译程序能够继续向下进行分析和处理。 注意:如果问编译程序有哪些主要构成成分,只要回答六部分就可以。如果搞不清楚, 就回答八部分。 第 3 题 何谓翻译程序、编译程序和解释程序?它们三者之间有何种关系? 答案: 翻译程序是指将用某种语言编写的程序转换成另一种语言形式的程序的程序,如编译程 序和汇编程序等。 编译程序是把用高级语言编写的源程序转换(加工)成与之等价的另一种用低级语言编 写的目标程序的翻译程序。 解释程序是解释、执行高级语言源程序的程序。解释方式一般分为两种:一种方式是, 源程序功能的实现完全由解释程序承担和完成,即每读出源程序的一条语句的第一个单词, 则依据这个单词把控制转移到实现这条语句功能的程序部分,该部分负责完成这条语句的功 能的实现,完成后返回到解释程序的总控部分再读人下一条语句继续进行解释、执行,如此 反复;另一种方式是,一边翻译一边执行,即每读出源程序的一条语句,解释程序就将其翻 译成一段机器指令并执行之,然后再读人下一条语句继续进行解释、执行,如此反复。无论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值