首页 > 其他分享 >编译原理大复习

编译原理大复习

时间:2023-05-31 22:55:56浏览次数:31  
标签:闭包 终结符 复习 产生 编译 开头 原理 终态 数量

Todo:代码优化

消除左递归及提取左公因式题型

中南大学徐德智老师PPT内容
一图解决问题。不再赘述

由语言构造文法

虽然有五种方法,但是把卷子做完一遍以后,最有效的应该还是分解法,能用到的两种方法记录一下。

分解法


这个分解法已经写的很清楚了,但是还是拿一个卷子上的例题来记一下:

\[S->a^m(ab)^nb^m(m>=1,n>=0) \]

首先把中间括号拆开,变为am+n以及bm+n,此时将整个产生式分为前后两个部分,分别对其进行进一步拆解,记为A、B
A->a^m+n,这个产生式很好拆解,可以拆解为A->aA|a
同理,B->b^m+n,也按照同样方式拆解,拆解为B->bB|b
最后将二者拼接在一起,形成L即可

对称法


上图说的很清楚了,不再赘述

等价法

image.png
首先不难发现,在语言中,a和b的数量应该一样多,于是乎可以先写一层
image.png
那么按照数量关系,当以a开头时,S中已经有了一个a,此时需要一个b,那么就创建一个非终结符来完成。下面当以b开头时也是如此。
接下来就分析S、A、B各产生式中非终结符的数量关系:
S中,a和b的数量应该相同。A中,b的数量应该比a的数量多一,弥补a开头的差距。B中,a的数量应该比b的数量多一,弥补b开头的差距。
下一步就是根据数量关系,进一步构造产生式:

  • 首先是A产生式,A产生式的职责在上面已经分析完毕了,就是要负责产生b相关的字符串。首先第一个能想到的非常简单,就是不进行递归产生,只弥补一个a开头时数量的差距。也就是只产生一个b。之后就要考虑递归产生问题,和构造S产生式一样,只需要以b开头,然后递归回S就可以了。但是此时A也是可以以a开头的,这样就产生了两个a,根据数量关系,aA构成一个S,此时S中a和b数量相同,只需要考虑把a开头的一个差距弥补,所以最后末尾再补一个A负责产生b即可,最终结果如下图image.png
  • 同理,B的产生式也很好构建,即为aS,a,bBBimage.png

NFA确定及最小化

写几个自己错误过的点,简单记录一下:

  • 首先是转换表第一格,直接求个开始状态的ε闭包。求ε闭包记得要把自身也加进去。image.png
  • 之后就是求第一列相对应的Ia、Ib闭包,步骤为先寻找通过第一列对应ε闭包中某一状态节点出发经过一条弧可以到达的状态节点的全体,注意是一条arc
  • 之后就要进行第二步,求解Ia或Ib闭包的ε闭包,将结果填写至表格中
  • 最终将含有终态的状态集合记为终态,不含有终态的状态集合记为普通状态画图即可
    之后是将DFA最小化的流程:
  • 首先将整个状态按照终态与非终态的标准划分为两部分集合,之后各对两个集合内部进行进一步划分
  • 按照接受某字符到达状态类型是否相同的标准进行进一步划分

逆波兰及三元式

题目一般都很简单,主要重点就是——逆波兰要按计算优先级倒着来,三元式则按计算优先级正着来。

LR(1)文法分析器

其实这想都不用想就知道肯定考LR(1)分析器,因为可以直接把所有的自底向上分析方式全考了。
LR(1)分析是为了解决SLR(1)无法解决的规约/规约冲突类型。有几点需要注意:

  • 首先需要拓展文法,加入新的开始符号
  • 在创建项目集过程中,读取符号如果扫描到了非终结符,就要将该非终结符的所有产生式都加入项目集中

标签:闭包,终结符,复习,产生,编译,开头,原理,终态,数量
From: https://www.cnblogs.com/appletree24/p/17447565.html

相关文章

  • qt5.15.9 静态编译 msvc 2017
    软件准备:VisualStudio2017ActivePerlPythonopenssl1.1以上版本QT5.15.9源码: https://download.qt.io/archive/qt/5.15/5.15.9/single/ 第一步命令:D:\qt-everywhere-src-5.15.9>configure.bat-prefixD:\Qt\Qt5.15.9-static-static-static-runtime-confirm-li......
  • Linux工作原理3设备
    本章是对正常运行的Linux系统中内核提供的设备基础设施的基本考察。纵观Linux的历史,在内核如何向用户展示设备方面已经有了许多变化。我们将从传统的设备文件系统开始,看看内核如何通过sysfs提供设备配置信息。我们的目标是能够提取系统中的设备信息,以便了解一些基本的操作。后面的......
  • 计算机组成原理—运算方式
    计算机组成原理—中央处理器(1)四、计算机的运行方式1.有符号数和无符号数计算机的数均存在寄存器中,通常称寄存器的位数为机器字长1.1无符号数没有表示符号的数,每一位均可存放数值。eg:若机器字长16位,则可表示无符号数的范围为0-65535(2^16-1)1.2有符号数符号的“+”、“-......
  • LVS原理详解以及部署
    linuxvirtualserver简称LVS,Internet的快速增长使多媒体网络服务器面对的访问数量快速增加,服务器需要具备提供大量并发访问服务的能力,因此对于大负载的服务器来讲,CPU、I/O处理能力很快会成为瓶颈。由于单台服务器的性能总是有限的,简单的提高硬件性能并不能真正解决这个问题。为......
  • Redis主从复制、哨兵、集群原理部署介绍
    Redis主从复制、哨兵、集群原理部署介绍原创 程序话题 IT当时语 2023-04-1820:26 发表于广东收录于合集#架构设计22个#分布式系统17个#Redis4个#微服务11个#分布式锁3个Redis主从复制、哨兵、集群原理部署介绍Redis主从复制的核心原理在分布式架构设计中......
  • 编译器绕过拷贝构造函数和返回值优化
    写在前面:在拷贝初始化(也就是用等号初始化,注意使用拷贝构造函数创建一个新的对象不属于拷贝初始化)过程中,编译器可以(但不是必须)跳过拷贝构造函数或者移动构造函数,直接创建对象。1stringnull_book="999";2//可以改写为3stringnull_book("999");这里面”999“隐式的转换为......
  • MS SQL Server 中的存储过程是一种预编译的代码块,可以接收输入参数并返回输出结果,用于
    MSSQLServer中的存储过程是一种预编译的代码块,可以接收输入参数并返回输出结果,用于完成特定的数据库操作。它们是SQLServer中存储逻辑业务的一种常见方式。下面是存储过程的优势和劣势:优势:更高的性能:存储过程在首次执行时会被编译和优化,然后将编译后的执行计划缓存起来,......
  • JSP原理深度刨析
    1. 我的第一个JSP程序  351.1 原理  35 在WEB-INF目录之外创建一个index.jsp文件,然后这个文件中没有任何内容。- 将上面的项目部署之后,启动服务器,打开浏览器,访问以下地址:  - http://localhost:8080/jsp/index.jsp 展现在大家面前的是一个空白。  - 实际上访问以上的......
  • Spring Boot中starter的原理是什么?如何实现一些starter?
    原理:核心就是@EnableAutoConfiguration注解,在该注解中有一个@Import注解。@Import注解导入了配置类:AutoConfigurationImportSelector.class。在该类中使用SpringFactoriesLoader.class加载配置文件META-INF/spring.factories。实现也starter需要实现一下步骤:autoconfigure模块......
  • C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理
    运行时类型识别(RTTI)的引入有三个作用:配合typeid操作符的实现;实现异常处理中catch的匹配过程;实现动态类型转换dynamic_cast。1.typeid操作符的实现1.1.静态类型的情形C++中支持使用typeid关键字获取对象类型信息,它的返回值类型是conststd::type_info&,例:#include<type......