《编译与反编译技术》—第3章3.6本章小结

3.6 本章小结
语法分析是编译的核心部分,其任务是检查由词法分析器所产生的单词符号串是否符合源语言的语法规则。要分析源程序的语法规则,必须对编写源语言的语法结构进行描述,因此本章首先介绍了描述语法结构的上下文无关文法的相关概念。接下来,讨论了编译器常用的两种语法分析方法,即自上而下的语法分析方法和自下而上的语法分析方法,前者是为输入串寻找一个最左推导,后者是为输入串寻找一个最左归约,它们的共同点是从左向右逐个地扫描输入。
自上而下的语法分析会遇到左递归问题、回溯问题,因此本章又分别介绍了消除左递归和回溯的方法。此外,介绍了一类可以进行确定的自上而下的语法分析的文法,即LL(1)文法。讨论了如何利用FIRST集和FOLLOW集来判定某个上下文无关文法是否为LL(1)文法。探讨了如何利用LL(1)分析法对LL(1)文法进行不带回溯的非递归自上而下的语法分析,并给出了LL(1)分析法的表驱动方式的实现,也即LL(1)分析器。
自下而上语法分析法是一种“移进–归约”法。这一部分首先介绍了移进–归约的基本思想和表驱动方式的实现:移进–归约分析程序。接下来,介绍一种有效的自下而上的语法分析方法,即LR分析法。讨论了几种常用的LR分析方法,包括LR(0)分析方法、SLR(1)分析方法、LR(1)分析方法和LALR(1)分析方法,并对它们进行了比较。最后,介绍了LALR(1)语法分析器的自动生成工具YACC软件。
习题

  1. 考虑文法 bexpr → bexpr or bterm | bterm
    bterm → bterm and bfactor | bfactor
    bfactor → not bfactor | ( bexpr) | true | false
    (1)请指出该文法的终结符号、非终结符号和文法开始符号。

(2)为句子not ( true or false )构造一棵语法分析树。
(3)给出句子not ( true or false )的最左推导和最右推导。
(4)试求该文法所产生的语言。

  1. 给出产生下面语言的上下文无关文法
    (1)L1 = {wcwT},其中wT是w的逆

(2)L2 = {aibncn | n≥1,i≥0}
(3)L3 = {anbnambm | n,m≥0}
(4)L4 = {1n0m1m0n | n,m≥0}

  1. 对于文法G(S):S→(L)∣aS∣a

        L→L,S∣S

    (1)画出句型(S,(a))的语法树。

(2)写出上述句型的所有短语、直接短语、句柄。

  1. 已知文法G(S):S→aSb∣Sb∣b,试证明文法G(S)为二义文法。
  2. 已知文法G(S):S→SaS∣ε,试证明文法G(S)为二义文法。
  3. 试证明:左递归的文法不是LL(1)文法。
  4. 试证明:LL(1)文法不是二义的。
  5. 考虑下面文法G(S): S→(T)∣^∣a
    T→T,S∣S

(1)消去G(S)的左递归。
(2)经改写后的文法是否是LL(1)文法?如果是,给出它的预测分析表。

  1. 已知文法G(A): A→aABc∣a
    B→Bb∣d

(1)试给出与G(A)等价的LL(1)文法G'(A)。
(2)构造G'(A)的LL(1)分析表。
(3)给出输入串“aadc#”的预测分析过程。

  1. 已知文法G(V): V→N∣N[E]
    E→V∣V+E

N→i
判断该文法是否为LL(1)文法?如果不是,其是否可以改造为LL(1)文法?

  1. 构造下面文法G(D)的LL(1)分析表。
    D→TL

T→int | real
L→id R
R→,id R | ε

  1. 考虑如下文法G(E):
    E→(L) | a

L→L,E | E
(1)构造该文法的LR(0)项目集规范族及识别其所有活前缀的DFA。
(2)构造该文法的SLR(1)分析表。
(3)给出对输入符号串“((a),a,(a,a))”的移进–归约分析动作。
(4)该文法是LR(0)文法吗?如果是,请构造其LR(0)分析表;如果不是,请说明理由。

  1. 考虑习题12中的文法:
    (1)构造该文法的LR(1)项目集规范族及识别其所有活前缀的DFA。

(2)构造该文法的LR(1)分析表。
(3)构造该文法的LALR(1)项目集规范族及识别其所有活前缀的DFA。
(4)构造该文法的LALR(1)分析表。

  1. 试构造下述文法的SLR(1)分析表。
    S→bASB | bA

A→dSa | e
B→cAa∣c

  1. 考虑文法
    E→E + T | T

T→TF | F
F→F * | a | b
(1)为该文法构造SLR(1)分析表。
(2)构造其LALR(1)分析表。

  1. 考虑文法
    S→A

A→BA |ε
B→aB | b
(1)证明该文法是LR(1)文法。
(2)构造该文法的LR(1)分析表。
(3)给出对于输入符号串“abab”的LR(1)分析过程。

  1. 证明下面文法是SLR(1)文法,但不是LR(0)文法。
    S→A

A→Ab | bBa
B→aAc | a | aAb

  1. 证明下面文法是SLR(1)文法,但不是LL(1)文法。
    S→SA | A

A→a

  1. 证明下面的文法是LL(1)文法,但不是SLR(1)文法。
    S→AaAb | BbBa

A→ε
B→ε

  1. 证明所有LL(1)文法都是LR(1)文法。
  2. 证明下面的文法是LALR(1)文法,但不是SLR(1)文法。
    S→Aa | bAc | dc | bda

A→d

  1. 证明每个SLR(1)文法都是LALR(1)文法。
  2. 证明下面的文法是LR(1)文法,但不是LALR(1)文法。
    S→Aa | bAc | Bc | bBa

A→d
B→d

  1. LR(0)、SLR(1)、LR(1)及LALR(1)分析方法有何共同特征?它们的本质区别是什么?
  2. 一个非LR(1)的文法如下:
    L→MLb | a

M→ε
请给出所有有移进–归约冲突的LR(1)项目集,以说明该文法确实不是LR(1)文法。

时间: 2024-10-31 06:08:22

《编译与反编译技术》—第3章3.6本章小结的相关文章

《编译与反编译技术》—第2章2.1节词法分析器的需求分析

本节书摘来自华章出版社<编译与反编译技术>一书中的第2章,第2.1节词法分析器的需求分析,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问"华章计算机"公众号查看. 第2章 词法分析的理论与实践 词法分析是编译过程的第一步,也是编译过程必不可少的步骤.编译过程中执行词法分析的程序称为词法分析器.本章主要介绍词法分析器的手动构造和自动构造的原理. 2.1 词法分析器的需求分析 本节首先介绍词法分析器的功能及其输出的单词符号的表示方式,然后研究将词法分析独立出来的原因.

《编译与反编译技术》—第1章1.5节高级语言及其分类

本节书摘来自华章出版社<编译与反编译技术>一书中的第1章,第1.5节高级语言及其分类,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问"华章计算机"公众号查看. 1.5 高级语言及其分类 根据应用类型的不同,涌现了多种多样的面向人类的高级语言,其中典型的有如下几类形式. 1.过程式语言 过程式语言也称为强制式语言(Imperative Language).这类语言的特点是面向语句,命令驱动.一个用过程式语言编写的程序由一系列语句组成,语句的执行会引起若干存储单元中的值

《编译与反编译技术》—第1章1.8节UNIX/Linux环境中的make和makefile

本节书摘来自华章出版社<编译与反编译技术>一书中的第1章,第1.8节UNIX/Linux环境中的make和makefile ,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问"华章计算机"公众号查看. 1.8 UNIX/Linux环境中的make和makefile 在UNIX或Linux环境中,make是一个非常重要和经常使用的编译工具.无论是自己进行项目开发还是安装应用软件,都会经常用到make或make install.使用make工具,可以将大型的开发项目分解成

《编译与反编译技术》—第2章2.2词法分析器的设计

本节书摘来自华章出版社<编译与反编译技术>一书中的第2章,第2.2节词法分析器的设计,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问"华章计算机"公众号查看. 2.2 词法分析器的设计 下面将词法分析器作为一个独立的子程序来考虑其设计.本节主要探讨实现词法分析器的关键技术和词法分析器的手工实现. 2.2.1 输入及其处理 词法分析器的结构如图2-3所示.词法分析器首先将源程序文本输入一个缓冲区中,该缓冲区称为输入缓冲区,单词符号的识别可以直接在输入缓冲区中进行.但在

《编译与反编译技术实战》——第1章 实践的环境与工具 1.1 实践环境概述

第1章 实践的环境与工具 本书致力于通过实践及案例,从正反向两个角度介绍编译系统的一般构造原理和基本实现技术,本章首先对书中内容涉及的环境与工具进行简单介绍,这些工具都是编译与反编译过程中常用的工具. 1.1 实践环境概述 在编译过程中所涉及的环境主要是编译环境及工具链,常用的工具有词法分析生成器.语法分析生成器.编译器.汇编器.链接器等.在反编译过程中主要涉及反汇编器.静态或动态的调试与分析工具.下面对近年来流行的编译与反编译工具逐一进行简单介绍.

《编译与反编译技术实战 》一 第1章 实践的环境与工具

第1章 实践的环境与工具 本书致力于通过实践及案例,从正反向两个角度介绍编译系统的一般构造原理和基本实现技术,本章首先对书中内容涉及的环境与工具进行简单介绍,这些工具都是编译与反编译过程中常用的工具. 1.1 实践环境概述 在编译过程中所涉及的环境主要是编译环境及工具链,常用的工具有词法分析生成器.语法分析生成器.编译器.汇编器.链接器等.在反编译过程中主要涉及反汇编器.静态或动态的调试与分析工具.下面对近年来流行的编译与反编译工具逐一进行简单介绍.

《编译与反编译技术》—第2章2.3节有穷自动机

本节书摘来自华章出版社<编译与反编译技术>一书中的第2章,第2.3节有穷自动机,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问"华章计算机"公众号查看. 2.3 有穷自动机 前面在介绍词法分析程序的手工实现时引入了状态转换图,为了讨论词法分析器的自动生成,需要将上述状态图的概念形式化,即引入有穷自动机.有穷自动机分为确定的有穷自动机和非确定的有穷自动机. 2.3.1 确定的有穷自动机 定义2.9(确定的有穷自动机(Deterministic Finite Autom

《编译与反编译技术实战》——第1章实践的环境与工具

第1章实践的环境与工具本书致力于通过实践及案例,从正反向两个角度介绍编译系统的一般构造原理和基本实现技术,本章首先对书中内容涉及的环境与工具进行简单介绍,这些工具都是编译与反编译过程中常用的工具.

《编译与反编译技术》—第1章1.7节C语言程序的编译流程

本节书摘来自华章出版社<编译与反编译技术>一书中的第1章,第1.7节C语言程序的编译流程,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问"华章计算机"公众号查看. 1.7 C语言程序的编译流程 本节以C语言程序的编译流程为例,介绍实际的C语言编译器是如何运作的.通常把整个代码的编译流程分为编译过程和链接过程. 1.编译过程 编译过程可分为编译预处理.编译与优化.汇编等阶段. (1)编译预处理 编译预处理即读取C源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处

《编译与反编译技术》—第1章1.2节编译过程

本节书摘来自华章出版社<编译与反编译技术>一书中的第1章,第X节,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问"华章计算机"公众号查看. 1.2 编译过程 考虑一种场景,让一个既懂英文又懂中文的俄罗斯人将一篇英文文章翻译成中文,此人可能要经历这样几个阶段:识别英文单词.识别英文句子.理解意思.先译成俄语并进行合理修饰.译成中文.编译器对高级语言的翻译也需要经历这样几个类似阶段:先进行词法分析,识别出合法的单词:再进行语法分析,得到由单词串组成的句子:然后进行语义分