【编译原理与技术(李文生第二版)】期末复习

    • 第五章 语法制导定义
    • 第五章 设计翻译方案√
    • 第六章 语义分析-类型表达式(仅记录,没说考)
    • 第七章 参数传递 √
    • 第七章 运行栈、display表 √
        • 例题1:来源:课件
        • 例题2:来源:教材7.4
        • 例题3:来源:教材7.5
    • 第八章 写三地址代码
        • 普通赋值语句转三地址
        • 数组转三地址
        • 布尔表达式转三地址(回填法)
        • if-else转三地址
        • while转三地址
        • for转三地址
    • 第十章 代码优化
    • 第四章 LL1文法
    • 第四章 LR文法
        • 四个文法强度排序
        • 例题

统统必考。

第五章 语法制导定义

前言:

  • 语法制导定义说的就是一个表格。在这个表格中,给每一个文法产生式赋予一个具体的含义(叫语义)。

  • 请注意,光有语法,我们不知道语义。你可能说你看到一个文法就能猜到它是什么含义(比如S->L.R, L->LB, R->BR, B->0|1,这一看就是个二进制数),但这是你猜的。我完全可以赋予它另外一个含义(输出另外的结果)。

  • 所以为什么第四章语法分析之后紧接着是语法制导定义。因为在这里我们给语法赋予语义。

考法:

  • 判断继承属性、综合属性

    • 继承属性:要让写原因文字叙述:该节点属性值由其父亲兄弟节点属性值决定。
    • 综合属性:该节点属性值由其子节点属性值决定。
  • 判断S属性定义、L属性定义

    • S属性定义:只用到综合属性(理解:自下而上一遍得出结果)
    • L属性定义:计算规则只依赖:出现在它左侧的符号的综/继
  • 画注释分析树

    • 如果让用题里给的语法制导定义or翻译方案进行翻译,就画树即可。(验证自己设计的翻译方案同理。)
  • 画依赖图

    • 树边是虚线
    • 依赖关系用实线箭头表示。
    • 来个例题:
      在这里插入图片描述 在这里插入图片描述
  • 画语法树

  • 画dag(在语法树的基础上把相同的节点捏一块)

第五章 设计翻译方案√

语法制导定义与翻译方案的区别
如果题目让写出语法制导定义,那么列如下形式的表

产生式语义规则
S→??S.??=??

如果让写翻译方案,那么在表格的基础上写出翻译方案。继承属性放前边,综合属性放最后。

做题方法是先找个例子(给定文法能接收的字符串),然后根据例子画分析树,猜出每个节点需要记录哪些信息。最后画出表格,根据表格写方案。

对于同一个文法,给出不同的翻译方案(语义规则),最终就可以得到不同的结果。下面来看几个文法的常见文法。

文法一:(a,a)式文法
文法形式化描述:
在这里插入图片描述
问题:

  1. 输出配对括号个数

  2. 输出a的最大嵌套深度
    在这里插入图片描述

  3. 输出每个a的嵌套深度
    在这里插入图片描述

  4. 输出每个a在串中的位置
    在这里插入图片描述

  5. 输出位置,最后输出a的个数
    在这里插入图片描述

  6. 对于每个a,输出位置和嵌套深度。最后输出字符串长度,a的个数
    在这里插入图片描述

文法二:二进制数文法
形式化描述:
在这里插入图片描述

问题:

  1. 输出十进制数值
    在这里插入图片描述

  2. 输出每个1的权值(如4,2,1,0.5……)
    在这里插入图片描述

补充:如果善良点,文法可改为S→L.R,这样就把小数点前后区别开了。
在这里插入图片描述

第六章 语义分析-类型表达式(仅记录,没说考)

在这里插入图片描述

第七章 参数传递 √

当属最不费力的题型了,只需画表。

此处只展示例题:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

第七章 运行栈、display表 √

前言:

  1. 为什么这些在C语言中都没遇到过?因为C语言不允许函数嵌套。所以函数外的非局部名字一定是全局变量,所以访问链 只能指向 全局区。这还考什么画法?
  2. 为什么访问链要画在栈上?答:过程能访问到的名字与该过程怎么激活的有关。(特指递归调用,总能访问 最新的 活动记录的内部名字)

解题方法:

先画一个栈。

  • 栈帧的顺序:画一个活动树,有助画栈帧。
  • 每个栈帧中有(从上到下):函数名,形参,控制链,访问链,局部变量

再连访问链、控制链。

  • 控制链的作用是恢复调用者运行环境。 所以是谁调的,就连到谁身上。
  • 访问链的作用是找非局部名字。 7.3节专门介绍访问链的连接方式。
    • 如果 调用者深度 == 被调者深度,二者指向同一个外围
    • 如果 调用者深度 + 1 == 被调者深度 ,被调者指向调用者
    • 如果 调用者深度 == 被调者深度 + r,沿着调用者的访问链向前走r个节点,得到的指针复制给被调者。
    • 以上三条是理论,通通不用看,瞪眼法指向直接外围过程就好了

但为什么还要把理论贴这里呢。因为还有个升级版:D表画法

  • D表将深度相同的函数对应的栈帧连成了一个链表
  • 最外围过程(一般是main)的深度认为是1(不是0,记住)
例题1:来源:课件

在这里插入图片描述
画出第一次进入exchange(1,3)时的运行栈。
在这里插入图片描述
在这里插入图片描述

例题2:来源:教材7.4

考虑如下pascal程序:
在这里插入图片描述
请为f的活动记录建立访问链
答案:

在这里插入图片描述

例题3:来源:教材7.5

考虑如下pascal程序:
在这里插入图片描述
在这里插入图片描述
答案:
(1)输出结果是2.(重点:那么多个m,f中能访问到的是哪个?——是过程c中的局部变量m)
在这里插入图片描述
display表有个问题,待解决。

第八章 写三地址代码

前言:不难。

翻译方案是看不懂的,瞪眼法做一下吧。可能出现的源代码有以下几个语法:

普通赋值语句转三地址

例题:
x:=a+b*y,x和y的类型是real,a和b的类型是int

分析:
计算顺序是by,a+by,x:=a+by
运算符两边类型不等就要转换,如inttoreal,并且运算符分为int+,real+,int
,real*

结果:

t1:=inttoreal b
t2:= t1 real* y
t3:= inttoreal a
t4:=t3 real+ t2
x:=t4
数组转三地址

例题:
A[x]
B[y, z]

定义:A:array[2…5] of integer
B:array[1…10, 1…20] of integer

分析:
算常数:A的常数是24=8,B的常数是(120)* 4=84
算格子数:A是x,B是y * 20+z
写三地址代码时,先算格子数,再算base,然后格子数乘域宽

结果:

t1=x
t2=A-8
t3=t1*4
t4=t2[t3]


t1:=y*20
t1:=t1+z
t2:=B-84
t3:=4*t1
t4:=t2[t3]
布尔表达式转三地址(回填法)

例题:
a>b and c>d or e<f

分析:
画一个叠叠图,找各表达式出口。goto哪可以看出来。但要是让画注释分析树就得 真会回填法了。

结果:

if (a>b) goto ___
goto ___
if (c>d) goto ___
goto ___
if (e<f) goto ___
goto ___

我发现注释分析树也能通过答案反推 (毕竟我们是拥有智慧的活人)

首先树的形状得会。这些注释,就看**翻译到这一句时,哪些行的goto还是空着的。**比如二层左边那个E,是第104句及之前。104句前,101、102、103的goto空着,那么就是这三个出现在注释中。
在这里插入图片描述

if-else转三地址

例题:
if (a>b) A1 else A2

结果:
if (a<b) goto ___
goto ___
【A1’s code……】
goto L:
【A2’s code……】
L: ……

while转三地址

例题:
while (a<b) {
A3
}
A4

结果:
L: if (a<b) goto ___
goto ___
【A3’s code……】
goto L

for转三地址

例题:
for (i=1; i<=m; i++)
A1;
halt
结果:
i=1
L: if (i>m) goto halt
【A1’s code……】
goto L
halt

大例题:

在这里插入图片描述
模块化。分为五坨东西:

  1. 布尔表达式(a>b and c>d aor e<f)
  2. 真出口(A1)
    A1做完无条件goto “布尔表达式(a<b)”
  3. 假出口(A2)
  4. 布尔表达式(a<b)
  5. 真出口(A3)
    A3做完无条件goto “布尔表达式(a<b)”
  6. 假出口(后续代码)

答案:
在这里插入图片描述

第十章 代码优化

基本块优化+循环优化

理论很简单,把题目完全做对是难的:

注意:

  1. 代码外提时,如果形如a[i,j],那么可以外提一半,也就是t=i*n2可外提,但t=t+j不能外提。需要将t重命名为t’再外提。(当然下一步削弱计算强度时还能让t和t’重新合并)
  2. 删除归纳变量时,要么删干净,那么这个变量就不会出现,其他变量初始化时不能用它;要么留着初始化,那么同族变量的初始化就能用这个变量,但是条件中被代替。
(模拟试卷1)
七、(10 分)有如下三地址代码
(1) i:=1
(2) if i>10 goto (29)
(3) j:=1
(4) if j>20 goto (27)
(5) k:=1
(6) if k>5 goto (25)
(7) t1:=i*20
(8) t1:=t1+j
(9) t2:=a-84
(10) t3:=4*t1
(11) t4:=i*5
(12) t4:=t4+k
(13) t5:=b-24
(14) t6:=4*t4
(15) t7:=t5[t6]
(16) t8:=k*20
(17) t8:=t8+j
(18) t9:=c-84
(19) t10:=4*t8
(20) t11:=t9[t10]
(21) t12:=t7+t11
(22) t2[t3]:=t12
(23) k:=k+1
(24) goto (6)
(25) j:=j+1
(26) goto (4)
(27) i:=i+1
(28) goto (2)
(29) halt

确定其入口语句有哪些,划分基本块,并画出流图。
在该段代码上进行内循环优化,给出优化过程中采用的优化技术及相应的优化结果

在这里插入图片描述

模拟试卷2
六、(15 分)有如下三地址代码:
(1) i:=1
(2) if i<=10 goto (4)
(3) goto (17)
(4) t1:=a-4
(5) t2:=4*i
(6) t3:=a-4
(7) t4:=4*i
(8) t5:=t3[t4]
(9) t6:=b-4
(10) t7:=4*i 
(11) t8:=t6[t7]
(12) t9:=t5+t8
(13) t1[t2]:=t9
(14) t10:=i+1
(15) i:=t10
(16) goto (2)
(17) halt
(1)将它划分基本块,并画出控制流图;
(2)在该段代码上进行基本块优化和循环优化,给出优化后的三地址代码。

在这里插入图片描述


* * * 期 中 之 前 的 内 容 * * *


第四章 LL1文法

first集和follow集会求。例题,这很重要

判断LL1:

  1. 左前缀、左递归,若有则必不是
  2. 只看多产生式,first集相交为空(说白了就是不能有左前缀)
  3. 如果多产生式其中有一个产生的是epsilon,那么左侧符号的follow集与右侧产生式的first相交为空。(意思是,follow代替了该项的first集去和其他产生式比)

来看一道题。
在这里插入图片描述

第四章 LR文法

如果问你是不是LRx文法,画出DFA才可判断。

四个文法强度排序

四个兄弟之间的关系:(从高到低)

要求最的是LR(0)文法,从不向前看。DFA中不能有移进归约在一起的情况。
次之为SLR(0)文法,用follow集当作向前看符号集。DFA中要保证移进符号(即·后的终结符)规约项follow集
要求比LR1高的是LALR1文法。需保证将LR1文法中的同心集合并后,仍没有冲突。
最低的是LR1文法,有自己的向前看符号集。DFA中要保证移进符号(即·后的终结符)规约项向前看符号集

没有要求的是LRK文法。

切记切记,LR(0)要求最高!!!
是谁期中因为这个扣了三分 (⌒_⌒;)

所以是LR1文法,一定是SLR1对吗?不对!!!反过来就对了,是SLR1,则一定是LR1

例题

在这里插入图片描述

做题总结:

2022-2023(A)
第二次做,错了求first集,如果S->A……A可推出空,那么S要往后看一个,而不是直接得出结论S也能推出空。
在这里插入图片描述
first(S)={a, +}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/949380.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot环境和Maven配置

SpringBoot环境和Maven配置 1. 环境准备2. Maven2.1 什么是Maven2.2 为什么要学 Maven2.3 创建一个 Maven项目2.4 Maven核心功能2.4.1 项目构建2.4.2 依赖管理2.4.3 Maven Help插件 2.5 Maven 仓库2.5.1本地仓库2.5.2 中央仓库2.5.3 私有服务器, 也称为私服 2.6 Maven设置国内源…

五个不同类型的数据库安装

一、 官方首页下载 打开 MySQL 官方首页&#xff0c;链接为&#xff1a; MySQL 进去社区后选择合适的版本进行安装 安装细节 依图一路next 点击finish结束安装 二、 在线YUM仓库 将该安装包的下载链接在 Linux 操作系统中按照以下命令直接进行下载 三、 二进制本地 通过该链接…

决定系数(R²分数)——评估回归模型性能的一个指标

目录 1.定义 2.计算举例 3. 结果分析 1.定义 R&#xff08;R平方&#xff09;分数&#xff0c;也称为决定系数&#xff0c;是用来评估回归模型性能的一个指标。它表示自变量解释因变量变异性的比例。R分数的取值范围通常在0到1之间&#xff0c;其值越接近1&#xff0c;说明…

基于单片机的直流稳压电源的设计(论文+源码)

1.系统方案设计 在本次直流稳压电源的设计中&#xff0c;其关键指标如下&#xff1a; 系统输入电压220V交流系统输出直流0到12V可调&#xff0c;步进可以达到0.1V电流最大输出可以到2A具有短路保护功能可以通过液晶或者数码管等显示设备显示当前输出电压 2. 电路图

排序算法——堆排序

什么是堆 堆就是一种特殊的二叉树&#xff0c;他有以下特点&#xff1a; 堆中某个节点的值总是不大于或不小于其父节点的值&#xff1b; 堆总是一棵完全二叉树。 堆又可以分为大根堆和小根堆 大根堆&#xff1a;根节点最大&#xff0c;每个节点都小于或等于父节点 小跟堆&am…

数据挖掘——聚类

数据挖掘——聚类 聚类K-meansKNN VS K-meansK-Nearest Neighbors (KNN)K-means K中心算法PAM算法 K-modes算法——解决数据敏感的问题KMeans算法 ——解决初始点选择问题K-中心点层次方法AGNES算法——最小距离单链接全链接平均链接 聚类评估K均值和K中心点的优缺点层次化聚类…

在线机考|2024华为实习秋招春招编程题(最新)——第3题_个性化歌单推荐系统_300分(十一)

题目内容 假设你是音乐服务的开发者,为了提高用户体验需要解决推荐歌单的同质化问题,保证推荐给用户的所有歌单不包含相同歌曲的。给定一个包含N个歌单和M条歌单重复记录,每个歌单用一个从1到N的整数编号,歌单重复记录包含两个歌单的ID,表示两个歌单有相同的歌曲。 你的任…

每日OJ_牛客_宵暗的妖怪_DP_C++_Java

目录 牛客_宵暗的妖怪_DP 题目解析 C代码 Java代码 牛客_宵暗的妖怪_DP 宵暗的妖怪 描述&#xff1a; 露米娅作为宵暗的妖怪&#xff0c;非常喜欢吞噬黑暗。这天&#xff0c;她来到了一条路上&#xff0c;准备吞噬这条路上的黑暗。这条道路一共被分为n 部分&…

开源架构的自动化测试策略优化版

最近四篇文章推荐&#xff1a; 开源架构的容器化部署优化版&#xff08;New&#xff09; 开源架构的微服务架构实践优化版&#xff08;New&#xff09; 开源架构中的数据库选择优化版&#xff08;New&#xff09; 开源架构学习指南&#xff1a;文档与资源的智慧锦囊&#xff08…

2. 进程和线程

文章目录 前言1. 进程是什么2. 进程的相关属性3. 线程是什么4. 为什么引入线程5. 进程和线程的区别 前言 上一篇博客&#xff0c;我们讲到了CPU和操作系统&#xff0c;今天我们讲一个操作系统中一个非常重要的概念—线程和进程 1. 进程是什么 每个应用程序运行于现代操作系统…

三甲医院等级评审八维数据分析应用(八)--数据治理的持续改进与反馈机制篇

一、引言 1.1 研究背景与意义 当前三甲医院在数据管理方面暴露出诸多棘手问题。一方面,数据治理缺乏系统性与规范性,数据标准不统一,不同科室、信息系统之间的数据格式各异、编码混乱,导致数据整合与共享困难重重,严重制约了数据分析的准确性与深度。以某三甲医院为例,…

HTML——66.单选框

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>单选框</title></head><body><!--input元素的type属性&#xff1a;(必须要有)--> <!--单选框:&#xff08;如所住省会&#xff0c;性别选择&…

数据结构与算法之排序

9.1 排序的概念 1. 排序的定义 定义&#xff1a;排序是将表中的记录按关键字递增&#xff08;或递减&#xff09;有序排列的过程。说明&#xff1a;数据中可以存在相同关键字的记录。本章主要考虑递增排序。扩展&#xff1a;排序是数据处理中的基本操作之一&#xff0c;广泛应用…

Swagger学习⑩——@Server注解

介绍 Server 是 Swagger/OpenAPI 3.0 注解中的一个注解&#xff0c;用于定义 API 文档中的服务器信息。通过 Server 注解&#xff0c;你可以指定 API 服务的基础 URL 或其他相关信息。 源代码 package io.swagger.v3.oas.annotations.servers;import io.swagger.v3.oas.anno…

MATLAB仿真:基于GS算法的经大气湍流畸变涡旋光束波前校正仿真

GS算法流程 GS&#xff08;Gerchberg-Saxton&#xff09;相位恢复算法是一种基于傅里叶变换的最速下降算法&#xff0c;可以通过输出平面和输入平面上光束的光强分布计算出光束的相位分布。图1是基于GS算法的涡旋光束畸变波前校正系统框图&#xff0c;在该框图中&#xff0c;已…

C语言笔记之`char*`、`const char*` 和 `char[]`辨析

C语言笔记之char*、const char* 和 char[]辨析 code review! 参考笔记 1.C语言笔记之char*、const char* 和 char[]辨析 2.C++笔记之int、size_t、uint8_t、unsigned char*区别 3.C++之char和string字符串类探究 4.C++笔记之字节数组的处理 5.C++笔记之如何给 const char* 类型…

十种基础排序算法(C语言实现,带源码)(有具体排序例子,适合学习理解)

学习了十种常见的排序方法&#xff0c;此文章针对所学的排序方法进行整理&#xff08;通过C语言完成排序&#xff09;。 参考内容&#xff1a; https://blog.csdn.net/mwj327720862/article/details/80498455 https://www.runoob.com/w3cnote/ten-sorting-algorithm.html 1. 冒…

Timer、Ticker使用及其注意事项

Timer、Ticker使用及其注意事项 在刚开始学习golang语言的时候就听说Timer、Ticker的使用要尤其注意&#xff0c;很容易出现问题&#xff0c;这次就来一探究竟。 本文主要脉络&#xff1a; 介绍定时器体系&#xff0c;并介绍常用使用方式和错误使用方式源码解读 timer、tic…

密码学科普

1 信息传输中的安全隐患 1. 窃听 解决方案&#xff1a;明文加密&#xff0c;X只能窃听到密文 2. 假冒 解决方案&#xff1a;消息认证码或者数字签名 3. 篡改 解决方案&#xff1a;消息认证码或者数字签名 4. 事后否认 解决方案&#xff1a;数字签名 2 对称加密/非对称加密 1…

MMPose关键点检测实践(一)

一&#xff0c;安装环境 这一步&#xff0c;需根据自己的硬件环境&#xff0c;按照以下文档安装即可&#xff0c;最大的变数就是不同的硬件&#xff0c;对应的软件版本不一样&#xff0c;这个因人而异&#xff0c;没有统一版本。mmpose安装说明&#xff1a; https://mmpose.r…