编译原理期末复习简记(更新中~)

news2024/9/23 5:30:13

注意:该复习简记只是针对我校期末该课程复习纲要进行的,仅供参考

第一章 引论

编译程序是什么?

编译程序是一个涉及分析和综合的复杂系统

编译程序组成

编译程序通常由以下内容组成

  • 词法分析器
    • 输入 组成源程序的字符串
    • 输出 记号/单词序列
  • 语法分析器
    • 输入 单词序列
    • 输出 语法单位(不同层次的语法成分)
  • 语义分析与中间代码生成器
    • 输入 语法单位
    • 输出 中间代码
  • 代码优化器
    • 输入中间代码
    • 输出中间代码
  • 目标代码生成器
    • 输入中间代码
    • 输出目标程序
  • 符号表管理器
    • 与编译程序的全过程相关
    • 功能:按照编译过程的信息需求,组织符号表,维护表格,提供信息服务
  • 出错处理器
    • 使得出错的地方尽量小,且编译程序能继续运行

第二章 高级语言及文法 

首先简单认识高级程序设计语言中的基本成分

  • 单词
  • 语句(单词组成的串,也叫句子)
  • 程序(语句组成的串)
  • 语言(语句的集合)

下面是学习这一章之前的必备概念认识

  • 字母表

    • 它是一个非空有穷集合(注意包含了集合的概念,即元素不能重复)
    • 不可分性,类似\n,\t也是一个字符
    • 字母表的乘积怎么计算?使用其中一个字母表的的每一个字符去拼接另一个字母表的每一个字符
    • 字母表的N次幂,与字母表的乘积计算类似,需要注意的是0次幂的结果为由空字符组成的集合
    • 字母表的正闭包(字母表的1次幂并2次幂并3次幂.......)
    • 字母表的克林闭包(正闭包并上空集)
  • 句子x

    • x是字母表克林闭包的一个元素,那么x为该字母表的一个句子
    • 当且仅当两个句子的对应位置上的字符都相等,两个句子相等
    • 句子也被称为 字 行 串 字符串 字符行
    • 句子的一个出现,例如字母表{a,b},则abaabb为一个句子,那么a的第一个出现在句子首部,第二个出现在句子的第3个字符
    • 句子的长度,使用绝对值符号,例如字符串bbaa的长度为4
    • 注意 空串符号长度为0 但是空串符号组成的一个集合长度为1
    • 句子的并置/连结,例如两个串x=001,y=1101,那么xy=0011101
    • 句子的前缀、真前缀、后缀、真后缀 ,真前缀与真后缀不包括句子本身,空串属于这里的四个概念
    • 用字母与字母右上角一个T代表x的倒序,例如abc的倒序为cba
    • 公共前缀 最大公共前缀 公共后缀 最大公共后缀
    • 子串(连续的),例如x=0101的子串有空串, 0,1,01,10,010,101,0101
    • 公共子串,即两个句子的同时拥有同一个子串
    • 最大公共子串(这里概念指的是长度),最大公共子串不唯一
  • 语言

    • 从字母表的克林闭包中选一些句子组成的集合叫做语言,其中语言的一个元素叫句子
    • 有穷语言,无穷语言
    • 语言的乘积 参考字母表的乘积

文法的定义

文法的形式定义如下

文法G是一个四元组(V,T,P,S)

  • V代表变量/语法变量/非终结符,表示一个集合,变量也称为语法范畴
  • T代表终结符
  • V并T并空串中的符号统称为语法符号/文法符号
  • P为产生式/定义式/语法规则,类似a->b这样的结构,读作a定义为b,每一个产生式的左部为V与T的正闭包,右部为V与T的克林闭包
  • S为文法的开始符号
  • 一般使用小写字母表示T,大写字母表示V,且第一个产生式的左部为该文法的开始符号

我们需要学会得到一个文法所描述的语言是什么

定义L(G)={w|S经过若干次推导得到w并且w是T的克林闭包}

那么如文法 C->a|b|c   D->d|e  E->C|D

L(C)={a,b,c} L(D)={d,e} L(E)={a,b,c,d,e}

直到我们推到开始符号S,那么L(S)即所给文法定义的语言,其中该集合的每一个元素都是该语言的一个句子

反过来我们需要判断某一个句子是否属于某文法

可以通过推导/规约的办法进行判断

什么是句型

如果我们可以通过开始符号S经过若干次推导得到一个类似产生式左部的"串",那么这个"串"就叫句型,也就是说,句型可能含有非终结符,对比句子,句子绝对不含非终结符

因此句子一定是句型,句型不一定是句子

文法的分类

根据对产生式要求的不同,我们将文法分为4类(英文也要掌握)

  • 0型文法/短语结构文法(phrase structure grammar,PSG),对应的L(G)称为0型语言/短语结构语言(PSL)/递归可枚举集
    • 对产生式无约束,即任何文法都是0型文法
  • 1型文法/上下文有关文法(context sensitive grammar,CSG),对应的有1型语言,上下文有关语言(CSL)
    • 要求产生式右部长度>=左部
  • 2型文法/上下文无关文法(context-free grammar,CFG),对应有2型语言,上下文无关语言(CFL)
    • 约束是产生式右部长度>=左部且左部属于非终结符(且长度为1)
  • 3型文法/正则文法(regular grammar,RG),对应3型语言,正则语言/正规语言(RL)
    • 产生式要么类似A->w要么A->wB,其中A,B是非终结符,w是终结符的正闭包
    • 正则文法与右线性文法的定义相同,并且可以证明左线性文法与右线性文法等价,因此二者统称正则文法
  • 注意这四种文法都可以包含右部为空的产生式

语法树

语法树也称为分析树/推导树/派生树,每一个节点代表一个语法符号,如果分别将语法树的叶子按照从左到右的顺序排列,即得到一个结果,树根为文法的开始符号

注意这里的语法树只针对CFG

以某一颗树的节点A作为根得到的子树称为A-子树

短语

短语的概念是相对于句型来说的,句型的语法树的任意一个层数>=2的A-子树的结果(语法树的叶子按照从左到右的顺序排列)是它的短语,如果层数为2,那么是直接短语

推论:一个句型的短语数量<=对应语法树的中间节点数量(根节点也算中间节点)

总结:要想得到一个句型的短语,那么找到该句型的所有中间节点作为子树的根,找到所有子树的结果即可

句柄

G的句型的最左直接短语(树中最左边的直接短语)就是句柄

最左推导

a是G的一个句型,如果在a的推导过程中,每一步都是对当前句型的最左变量进行替换,那么称该推导为最左推导

且每一步得到的句型称为左句型

相应的规约称为最右规约

如果在a的推导过程中每一步对当前句型的最右变量进行替换,则称该推导为最右推导,每一步得到的句型也称为右句型,对应的最左规约

其中最右推导为规范推导,最左规约为规范规约,二者产生的句型称为规范句型

二义性

学会构建语法树并判断某个语法树是否存在二义性即可,做题时只需给出反例即可

素短语

 在得到某个句型的所有短语后,按照从后往前进行判断即可

参考资料​​​​​​

第三章 词法分析

什么是词法分析

简单来说,词法分析器读入表示源程序的字符流,按照程序功能等价的要求,将其转换成对应的单词序列,并且剔除其中的空格、注解等不影响程序语义的字符

单词的分类

  • 关键字/基本字,类似程序设计语言中的while,if,int这些,此外如果某些关键字不允许被使用的话,我们称其为保留字
  • 标识符,用于表示各种名字,例如变量名
  • 常数
  • 运算符
  • 分界符,类似逗号,分号

正则表达式

根据前面所学我们可以使用正则文法去表示某一种单词,此外我们还可以使用正则表达式表示某种单词

正则表达式简称正则式/正规式,正则表达式与正则文法是等价的,不过正则表达式可以容易看出单词的结构

一个字母表上的正则表达式及其表示的语言定义如下

  • 表示字母表上的一个正则表达式,表示空集
  • 是字母表上的一个正则表达式,表示语言
  • 对于字母表上的字母a,a是字母表上的一个正则表达式,它表示的正则语言是{a}
  • 假设r和s都是字母表上的正则表达式,他们表示的语言分别为L(r),L(s),则:
    • (r)也是字母表上的正则表达式,它表示的语言为L(r)
    • (r|s)也是字母表上的正则表达式,它表示的语言为L(r)并L(s)
    • 也是字母表上的正则表达式,它表示的语言为L(r)L(s)
    • 也是字母表上的正则表达式,它表示的语言为

  •  只有经过有限次上述规则得到的表达式才是字母表上的正则表达式

注意上面的乘号可以省略,|可以被+替代注意上面的乘号可以省略,|可以被+替代,并且闭包符号的优先级大于乘号,最后是或|

如果正则表达式r与s表示的语言相同,即L(r)=L(s),则称两个正则表达式等价记作r=s

正则表达式所表示的语言称为正则集=正则语言

正则表达式的代数性质

 补充克林闭包与正闭包

补充0或一个

?是一元操作符,表示“0或一个”

 

补充字符类

[ abc ](其中a、b和c是字母表中的符号)表示正则表达式a|b|c 

正则文法与正则表达式之间的转换

根据正则文法构建等价的正则表达式

根据上图所示的规则进行操作即可,注意不要漏情况了 

将正则表达式转换成等价的正则文法

首先定义正则定义式/正规定义式的概念,简单的说就是形如A->r的式子,其中左部为一个语法变量,右部为一个正则表达式

接着根据上图规则进行分解即可 

注意一点,转换出的是“正则文法即3类文法”,因此也要符合其规则

有穷状态自动机

首先认识什么是有穷状态自动机

 其物理模型如下

 因此我们对有穷自动状态机(FA)有如下定义

与前面类似的如果M1与M2都是FA,如果L(M1)=L(M2),那么表示两个自动机是等价的

上面介绍的是确定的有穷状态自动机(DFA),如果状态转移函数存在空格子,那么则该自动机称为非确定的有穷状态自动机(NFA) 

 状态转换图

状态转换图也叫状态转移图,用于表示有穷状态自动机

如上图所示,每一个圆圈里的代表一个状态,其中有start指针指向的为开始状态,双圆圈表示终止状态/接受状态,弧表示在某个状态下读入某个内容时应该转移到什么状态

正则表达式转换为状态转换图

二者的“语法转换”如下图所示

 例题

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jenkins+Gitlab+Springboot项目部署Jar和image两种方式

Springboot环境准备 利用spring官网快速创建springboot项目。 添加一个controller package com.example.demo;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;RestController public class…

新华三眼中的AI天路

ChatGPT的火爆&#xff0c;在全球范围内掀起了新一轮的AI风暴。如今&#xff0c;各行各业都在讨论AI&#xff0c;各个国家都在密集进行新一轮的AI基础设施建设与技术投入。 但眼前的盛景并非突然到来&#xff0c;就拿这一轮大模型热潮来说&#xff0c;谷歌早在2018年底就发布了…

协议速攻 IIC协议详解

介绍 IIC是一种 同步 半双工 串行 总线 同步 指的是同一根时钟线(SCL) 半双工 可以进行双向通信&#xff0c;但是收发不能同时进行&#xff0c;发的时候禁止接收&#xff0c;接的时候禁止发送 串行 数据是一位一位发送的 总线 两根线(SCL SDA)可以接多个IIC类型器件&#…

《统计学习方法》——逻辑斯蒂回归和最大熵模型

参考资料&#xff1a; 《统计学习方法》李航通俗理解信息熵 - 知乎 (zhihu.com)拉格朗日函数为什么要先最大化&#xff1f; - 知乎 (zhihu.com) 1 逻辑斯蒂回归 1.1 逻辑斯蒂回归 输入 x ( x ( 1 ) , x ( 2 ) , ⋯ , x ( n ) , 1 ) T x(x^{(1)},x^{(2)},\cdots,x^{(n)},1…

【动态规划算法练习】day11

文章目录 一、1312. 让字符串成为回文串的最少插入次数1.题目简介2.解题思路3.代码4.运行结果 二、1143. 最长公共子序列1.题目简介2.解题思路3.代码4.运行结果 三、1035. 不相交的线1.题目简介2.解题思路3.代码4.运行结果 总结 一、1312. 让字符串成为回文串的最少插入次数 1…

DevOps系列文章之 设计一个简单的DevOps系统

前置条件 gitlab gitlab-runner k8s docker 1. gitlab创建群组 创建群组的好处是,对项目进行分组,群组内的资源可以共享,这里创建了一个tibos的群组 2. 在群组创建一个项目 这里创建一个空白项目,项目名为Gourd.Test,将项目克隆到本地,然后在该目录下创建一个.net core3.1的w…

Spring Cloud Alibaba Seata源码分析

目录 一、Seata源码分析 1、Seata源码入口 1.1、2.0.0.RELEASE 1.2、2.2.6.RELEASE 2、Seata源码分析-2PC核心源码 3、Seata源码分析-数据源代理 3.1、数据源代理DataSourceProxy 4、Seata源码分析- Seata服务端&#xff08;TC&#xff09;源码 一、Seata源码分析 Sea…

P1dB、IIP3、OIP3、IMD定义及关系

P1dB 1分贝压缩输出功率。放大器有一个线性动态范围&#xff0c;在这个范围内&#xff0c;放大器的输出功率随输入功率线性增加。随着输入功率的继续增加&#xff0c;放大器进入非线性区&#xff0c;其输出功率不再随输入功率的增加而线性增加&#xff0c;也就是说&#xff0c;…

【新星计划·2023】Linux文件权限讲解

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 前言 这篇文章&#xff0c;将带你详细的了解一下 Linux 系统里面有哪些重要的文件&#xff1f;。 不过&#xff0c;每个文件都有相当多的属性…

ROS学习篇之传感器(二)IMU(超核IMU HI266)

文章目录 一.确定IMU型号二.安装驱动1.找到驱动的包2.解压该压缩包3.安装步骤说明4.具体安装5.检查IMU的usb接口是否插到电脑 三.在RVIZ中的显示1.复制示例下的src里的文件复制到自己的src下2.自己的文件目录3.尝试编译一下4.示例的文件说明5.运行Demo6.配置Rviz 四.查看IMU的实…

【深入了解系统性能优化】「实战技术专题」全方面带你透彻探索服务优化技术方案(系统服务调优)

全方面带你透彻探索服务优化技术方案&#xff08;服务器系统性能调优&#xff09; 调优意义计划分析 流程相关分析优化分析Nginx请求服务日志将请求热度最高的接口进行优化异步调用优化方式注意要点 分析调用链路追踪体系建立切面操作分析性能和数据统计存储相关的调用以及耗时…

Pycharm中画图警告:MatplotlibDeprecationWarning

前言&#xff1a; \textcolor{Green}{前言&#xff1a;} 前言&#xff1a; &#x1f49e;这是由于在python中画图出现的问题&#xff0c;一般不会有错。因为它只是个警告&#xff0c;但是我们也可以知道解决这个问题的方法&#xff0c;防止后面出问题的时候知道怎么解决。 前因…

窗口函数 OVER(PARTITION BY ...)

开窗函数的语法结构&#xff1a;分析函数() over(partition by 分组列名 order by 排序列名 rows between 开始位置 and 结束位置) over()函数中包括三个函数&#xff1a;分区partition by 列名、排序order by 列名、指定窗口范围rows between 开始位置 and 结束位置 rows bet…

Win10共享文件|文件夹 电脑之间快速传输文件的方法

一、设置共享的文件或文件夹 1、A电脑上的文件要共享 进行如下设置&#xff1a; 右击要共享的就文件或文件夹->属性->"共享 "选项卡->"共享"按扭->选择共享的用户 下拉选择"Everyone"->单击"添加"按扭->根据需要设…

PVE8.0内核构建支持IOMMU拆分

PVE直通SATA控制器给群晖的时候&#xff0c;发现网卡、USB、SATA控制器都在一个IOMMU上。 直通完了&#xff0c;PVE直接失联了。这肯定不行。百度了一下说是要编译内核把IOMMU拆开。下面记录一下编译内核的过程。 准备编译环境 我直接用pve物理机编译&#xff0c;怕破坏环境的…

【Spring/Java项目】如何利用swagger-parser解析yaml中的api请求类型、注释、接口名等等(含示例代码)

手打不易&#xff0c;如果转摘&#xff0c;请注明出处&#xff01; 注明原文&#xff1a;https://zhangxiaofan.blog.csdn.net/article/details/129167371 目录 前言 官方文档 项目配置 示例代码 测试文件 解析代码 运行结果 前言 用到这个工具是因为项目需要&#xff0…

构造函数与成员变量初始化

1 为何需要定义构造函数&#xff1f; 构造函数的主要目的在于对成员变量进行初始化&#xff0c;确保类对象具有良好的初始状态。 2 构造函数对成员变量的初始化 接下来&#xff0c;我们将完善前文中提到的几个构造函数&#xff0c;使其能够有效地完成成员变量的初始化工作。 …

【趣说冒泡排序】

前言 在计算机科学中&#xff0c;排序算法是一种常见且重要的算法。排序算法的目标是将一组无序的数据按照一定的规则进行重新排列&#xff0c;以便更方便地进行搜索、查找或其他操作。 冒泡排序&#xff08;Bubble Sort&#xff09;是最简单的排序算法之一&#xff0c;它的原…

软件测试技能,JMeter压力测试教程,统一随机定时器/高斯随机定时器(十九)

目录 前言 一、统一随机定时器 1、统一随机定时器&#xff08;Uniform Random Timer&#xff09; 2、设置延迟时间 二、高斯随机定时器 1、高斯随机定时器Gaussian Random Timer 2、设置延迟时间 前言 如果想加个随机等待时间可以用到 jmeter 里面的统一随机定时器&…

WPF 样式设计总结

文章目录 行内样式页内样式样式继承控件样式只能继承一个 局部样式窗口控件和用户控件直接的区别使用代码用户控件引用 全局样式 行内样式 我们新建一个简单的样式 <Grid><TextBox Text"我是样式" FontSize"100" /></Grid>这种属性直接…