首页 > 其他分享 >编译原理部分题型总结

编译原理部分题型总结

时间:2023-06-24 12:11:55浏览次数:66  
标签:总结 题型 文法 varepsilon qquad LL 分析 编译 FIRST

2 形式语言和自动机

转化为等价的无二义性文法

image.png
image.png
优先级越高的越在后边

根据描述写非二义性文法

image.png
image.pngimage.png
注意左结合是先归约在移进,右结合是先移进再归约

根据描述画DFA

image.png
注意这种一般是将第一个0独立出去

根据描述写正规式

image.png
image.png

3 词法分析

image.png
image.png

4 语法分析——自上而下分析

消除左递归

image.png
image.png

改写并判断是否为LL(1)文法

HSH%NM5GMEDW0JE3BAD`2QJ.png
首先要不含左递归不含左公因子
对A的操作是消除公共因子,对B是消除左递归
image.png
不要忘记follow含#的情况
只需要对有多个产生式的求FIRST集

image.png
image.png
image.png

不能用普通方法改写为LL(1)文法

尝试作DFA转为正规式
image.png
image.png
若不能作正规式
image.png
image.png

说明是否为LL(1)文法

设有下列文法_G_(A)
A→BCc|eDB
B→\(\varepsilon\)|bCD
C→DaB|ca
D→\(\varepsilon\)|dD
(1)计算每个侯选式的FIRST集合,若侯选式的FIRST集合包含\(\varepsilon\),计算左侧非终结符号的FOLLOW集合。
(2)根据(1)中的计算结果,构造该文法的LL(1)分析表,说明该文法是否为LL(1)文法。
解:
(1)对A:\(FIRST(BCc) = \{a,b,c,d\} \qquad FIRST(eDB) = \{e\} \qquad\)
对B:\(FIRST(\varepsilon ) = \{\varepsilon \} \qquad FIRST(bCD) = \{b\} \qquad FOLLOW(B) = \{\#,a,c,d\}\)
对C:\(FIRST(DaB) = \{a,d\} \qquad FIRST(ca) = \{c\}\)
对D:\(FIRST(\varepsilon ) = \{\varepsilon \} \qquad FIRST(dD) = \{d\} \qquad FOLLOW(D)=\{\#,a,b,c,d\}\)
(2)
LL(1)分析表为:

a b c d e
A A→BCc A→BCc A→BCc A→BCc A→eDB
B B→ε B→bCD B→ε B→ε
C C→DaB C→ca C→DaB
D D→ε D→ε D→ε D→ε,D→dB D→ε

因为M[D,d] 有多重定义入口,所以该文法不是LL(1)文法。

LL(1)分析分析过程

有文法

_E_→-_E_|(_E_)|_VT_
_T_→-_E_|_ε_
_V_→_iF_
_F_→(_E_)| _ε_

问题:
1. 给出上述文法的LL(1)分析表;
image.png
2. 给出句子_i_- - i(i)利用LL(1)分析法的如下图所示的分析过程。

步骤 分析栈 余留输入串 所用产生式

IMG_20230617_190859-01.jpeg
image.png
image.png

5 语法分析——自下而上分析

image.png
一个短语必须是和其所有的兄弟节点组成的
image.png
如果有两个长的一样的短语但是在不同位置那他们是不同的短语

判定文法具有二义性

image.png
image.png

SLR(1)解决移进归约冲突

image.png
image.png
image.png

构建SLR(1)分析表

image.png
image.png

SLR(1)分析+左结合+分析过程

设有下列文法G[S]:
image.png
(2)假设加法“+”为左结合,试构造该文法的SLR(1)分析表;
(3)给出句子a+++a++的SLR(1)分析过程。
IMG_20230618_201043_edit_1434101939294191-01.jpeg
最后少一步
image.png

判断是LR(0)还是SLR(1)

image.png
image.png
image.png

优先级+左结合

image.png

LR(1)构建

image.png
image.png
image.png

LALR(1)构建

image.png
image.png
image.png

6 语义分析与中间代码生成

在编译程序中与生成中间代码的目的无关的是D
A.便于目标代码优化
B.便于存储空间的组织
C.便于目标代码的移植
D.便于编译程序的移植

逆波兰表达式、三元式、树以及四元式

image.png

  • BZ 即如果栈顶元素为零,则进行分支跳转。它通常用于条件判断,当栈顶元素为零时,根据指定的跳转地址进行无条件跳转。
  • BR 即无条件分支跳转。它用于无条件地将程序控制流程跳转到指定的地址。

image.png
image.png

拉链返填(for while if型)

有下列C语言语句

for(i=0; i<n; i++;) 
    whlile(a>b)do
        if(c>d)m=n+1;
s=m;     

问题:
1.给出该语句的语义处理(没有优化处理)后的四元式形式的目标代码;
image.png
2.设编译器是单遍扫描的编译器,给出中间代码生成后循环处理产生的如下所示的标号表的内容(标号按出现的先后顺序命名为Li,其中i=1,2,…,n;**)。

标号名 定义否(1/0) 返填顺序 地址
Li 1 ⑤→②→①

IMG_20230618_231535-01.jpeg
注意:
A)无条件转移操作符用“j”表示,条件成立转移的操作符用“jT”表示,条件不成立转移的操作符用“jF”表示;
B)语句标号的定义性出现用Li(i=1,2,…,n)表示,语句标号的地址使用四元式序列的序号表示,序号用①,②,…表示。

拉链返填(for if else if else型)

image.png
image.png
image.png
image.png
源程序生成中间代码的目标结构
IMG_20230611_185335-01.jpeg
IMG_20230611_184845-01.jpeg
image.png

逆波兰式表示+四元式表示+拉链返填

image.png
image.png
image.png

if-else if-else型

image.png
image.png

根据文法给出语法分析树

设有文法的语法制导定义如下。
image.png
(1) 根据文法给出句子 ((i),((i),(i))) 的语法分析树
(2) 根据语法分析树及语法制导定义,给出句子 ((i),((i),(i))) 的计算过程以及输出结果。
IMG_20230616_181315-01.jpeg
5

8 代码优化

DAG图优化

image.png
image.png
image.png
image.png
image.png
image.png

例题(循环优化)

image.png
image.png

根据四元式划分基本块

image.png
image.png

求控制流图和必经结点集

image.png

求回边和循环+代码外提

image.png

强度削弱+删除归纳变量(循环控制变量)

image.png
删除无用转移语句!
image.png
image.png

例题(基本块优化)

image.png
image.png

删除无用赋值

image.png
image.png
image.png

常量合并与传播

image.png

另一道题

image.png
image.png

公共子表达式删除

image.png
image.png
image.png

image.png
image.png

循环展开

image.png
(3)
image.png
image.png
image.png

例题

image.png

求到达-定值集IN和OUT

image.png

生成GEN集和KILL集

![%1D8GYI%3]K`9D{HXD$$B5.jpg
在基本块中如果有两个相同的变量被赋值,GEN集中记录的是最后一个被赋值的变量的定义。
image.png

初始化IN和OUT

out都是gen
image.png

迭代

注意-和U的优先级相同
image.png
image.png

求各基本块中变量引用点的ud链

image.png
image.png
image.png

求各基本块的活跃变量集IN和OUT集

image.png

生成DEF集和USE集

image.png
image.png

初始化IN和OUT

迭代

image.png
image.png

求各基本块中变量定值点的du链

image.png
image.png

标签:总结,题型,文法,varepsilon,qquad,LL,分析,编译,FIRST
From: https://www.cnblogs.com/JinyuLi/p/17500897.html

相关文章

  • [C/C++] Visual Stdio Code中多线程多源码文件编译、运行和调试
    搞了很久,记录一下:一.环境OS:Ubuntu20.04VSCode:1.77.0g++:g++(Ubuntu9.4.0-1ubuntu1~20.04.1)9.4.0二.配置文件下面两个文件先不要手动创建,下面第三章会讲到:task.json:编译程序的配置文件;launch.json:运行程序的配置文件.三.编译&运行1.打开main函数所在的cpp文......
  • SystemVerilog总结
    SystemVerilog总结过了两个月的时间,把这本《SystemVerilogforDesign(Edition2)》基本上读完了。对SystemVerilog也建立了一些认识。本书一共十二章,除去第一章是比较笼统的介绍,最后两章主要是设计实例以外,第二章到第十章都是很干货的语法讲解。本书的特色是比较深入的讲了一......
  • 浅浅地总结一下
    1、今天主要是进行了数据结构的小组报告的完成!2、还有数据结构第二阶段程序的完善!3、还有,竞赛的ppt的思路的讨论!!!!有一点儿蓝瘦香菇(被PUA了),坚持就是胜利!......
  • Springboot web 项目开发流程梳理总结
    项目开发流程梳理总结1.环境准备1.准备数据库表(user,order);2.创建springboot工程,引入对应的起步依赖(web,mybatis,mybatisx,mysql驱动,lombok);3.配置文件application.properties中引入mybatis的配置信息,准备对应的实体类;4.准备对应的mapper,service(接口,实现类),controlle......
  • PTA题目集6-8的总结性Blog
    一、前言在这个PTA题目集中,涉及到了成绩计算中所需要的各种计算方式,容器-HashMap,容器-ArrayList,以及 jmu-Java-02基本语法和接口-自定义接口等方面的知识。总体来说,难度适中,但需要考生对这些概念有一定的了解。二、设计与分析首先是7-1容器-HashMap-检索输入多个学生的成绩......
  • 第三次总结性blog
    目录 1.前言2.设计与分析3.踩坑心得4.改进建议5.总结 1.前言题目集8课程成绩统计程序-1题目集9统计Java程序中关键词的出现次数题目集10容器-HashMap-检索容器-HashMap-排序课程成绩统计程序-2动物发声模拟器......
  • JAVA面向对象程序设计_PTA题目集07-11总结分析
    JAVA面向对象程序设计_PTA题目集07-11总结分析前言:天将降大任于是人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为。所以动心忍性,增益其所不能。随堂检测在最末浅析。 题目集七:知识点:类间设计,类的设计。题量:一题,菜单计价五。难度:八个满分。 题目集八:知识点:类......
  • c++面试常见问题总结
    近来在面试的过程,发现面试官在c++方面总是喜欢问及的一些相关问题总结,当时没怎么答出来,或者是答的不怎么全面,故而查询相关资料总结下。(后面实际工作会进行实时更新信息)<一>c++虚函数方面虚函数(VirtualFunction)是通过一张虚函数表(VirtualTable)来实现的。简称为V-Table。在......
  • 反射与正则表达式学习总结
    1.反射的定义(1)动态获取对象信息(2)调用对象的信息(成员变量,成员方法,构造方法)2.反射的核心编程思想以及各自的常用方法步骤1:获取class类型的对象【字节码对象】(1)Classaclass=Class.forName("");(2)ClassemployeeClass=Employee.class;(3)Employeeemployee=newEmplo......
  • 网络流题型总结
    最近写了一段时间的网络流,现在应该总结一下了。网络流就是将原问题抽象成包含顶点和边有容量限制的网络。本文中有些题目的题解复制自网络,仅作个人学习总结之用。1.最大流最大流可以看作使用flow来做出一系列的限制,从而满足原题条件。1.1拆点有时候某一个点还有额外的限......