编译原理:编译原理简明教程知识点梳理(应对考试版)

news2024/11/25 2:46:37

前言

姜老师是一个好老师,编译原理没有过是我的问题,我爱姜老师。
写这篇博客涉及到好多符号,可以参考这篇文章latex数学公式详细教程
因为打字过于麻烦,很多内容用平板的手写截图,还有电脑截图替代,不太习惯用平板写字,也不太习惯用鼠标写字,所以写地歪歪扭扭略有凌乱,各位见谅。

1. 编译概述

1.1 翻译程序

翻译程序:把某种程序设计语言(源语言)编写的程序(源程序)翻译成与之等价的另一种语言(目标语言)的程序(目标程序)。
在这里插入图片描述
编译程序:编译程序是一种翻译程序,将高级语言编写的源程序翻译成等价的机器语言或汇编语言的目标程序。
解释程序:翻译一句执行一句,不生成目标文件,直接执行源代码文件。

1.2 编译过程和编译程序的基本结构

  1. 编译程序的几个工作阶段

词法分析
语法分析
语义分析
中间代码生成
代码优化
目标代码生成

2. 文法与语言

2.1 符号串与语言

  1. 字母表:大写字母表示,或Σ(A={0,1} Σ=(a,b,c,d))
    有穷非空集合(C语言的字母表:ASSIC)

  2. 符号:Σ中的元素

  3. 符号串:Σ中符号的序列

  4. 长度:符号串中元素个数 记为|x|

  5. 空串:长度为0,记为ϵ , |ϵ|=0

  6. 运算:符号串的连接,把y写在x后面,记为xy
    显然:
    a. ϵx=x=ϵx
    b. |xy|=|x|+|y|

  7. 头尾子串
    符号串Σ=xyw
    x为头,w为尾
    Σ=x……
    Σ=……w
    Σ=……y……
    x=ab,子串:a,b,ab,ϵ,头:a,ab,ϵ

  8. 符号串的方幂
    x为串,xxxx……x(n个x)记为xn
    显然:
    a. xn=|x|+|x|+|x|+……+|x| n个|x|
    b. xn xm=xn+m =xm+n=xm xn
    c. |x0 |=0 , |ϵ|=0,x0

  9. 符号串的集合 -->就是语言
    Σ串是符号串构成的集合,用大写字母表示(A,B……)

  10. 集合中元素个数 记为|A|

  11. 空集 ϕ \phi ϕ | ϕ \phi ϕ|=0
    注意:区别 ϕ \phi ϕ、{ϵ}和 ξ \xi ξ ,|ϵ|=1,| ϕ \phi ϕ|=0

  12. 运算
    符号串集合 A和B的乘积 A ⋅ \cdot B={xy|x ∈ \in A,且y ∈ \in B}
    A={0,1},B={a,b}
    A ⋅ \cdot B ={0a,0b,1a,1b}
    显然:
    a.|AB|=|A| ⋅ \cdot |B|
    (重复元素重复计算)
    b. ϕ \phi ϕA=0=| ϕ \phi ϕ |= A ϕ \phi ϕ
    {ϵ}A=A=A{ϵ}
    在这里插入图片描述

  13. 符号串集合的方幂
    AAAAA……A (n个A)
    Σ={0,1}
    Σ1={0,1}
    Σ2={00,01,10,11}
    ……
    Σn=Σ字母表中所有长度为n的符号串构成的集合
    显然:
    a. AnAm=An+m=Am+n=AmAn
    b. |An|=(|A|)n
    c. A0={ϵ}

  14. 正闭包+和闭包*
    设A为符号串集合
    A+=A1 ∪ \cup A2 ∪ \cup A3 ……
    A*=A0 ∪ \cup A1 ∪ \cup A2 ∪ \cup A3 ……
    Σ+ ={所有长度≥1的串}
    Σ* ={Σ上任意串}

显然:
a. A+ =AA*
b. (A* )* =A*
在这里插入图片描述

  1. 规则(产生式)
    有序对(A, α \alpha α
    记为 A–> α \alpha α 或A::= α \alpha α
    如:
    A代表以0开头的有0,1组成的串

    A–> 0B

在这里插入图片描述
附:
非终结符:表示抽象概念,最终不出现 V N _N N
终结符 :要写出来 V T _T T

例:
被2整除的0,1构成的串
结构上:
在这里插入图片描述
A–>B0
那么B又有哪些可能呢?
在这里插入图片描述
所以
A–>0B
B–>ϵ
B–>0B
B–>1B
(递归)

  1. 文法
    文法G是四元组(V N _N N,V T _T T,P,Z)
    V N _N N -----------非终结符,非空有穷
    V T _T T------------终结符,非空有穷
    P --------------规则的集合
    Z--------------开始符号(最终关心要定义的那个非终结符)

G[Z] (V N _N N,V T _T T,P,Z)

在这里插入图片描述
给定一个问题设计一个相应的文法
例1,设计G表达{an |a>=1}
第一种方法,归纳法(生成法)

在这里插入图片描述
第二种方法:分析法
在这里插入图片描述
例2,设计一个文法G表示{an bm |m,n>=1}

在这里插入图片描述
例3,设计一个G表示{an bn |n>=1}
(配对)

在这里插入图片描述
附:什么是直接推导?
α \alpha αAB串,A–> γ \gamma γ
α \alpha αAB中A用 γ \gamma γ 代替 α \alpha α γ \gamma γB

在这里插入图片描述
例4,设计一个文法G表示{an bn cm |m,n>=1}

在这里插入图片描述
例5,设计一个语法G表示{an bm cn|m,n>=1}

在这里插入图片描述
例6,被2整除的0,1串

在这里插入图片描述
例7,被三整除的0,1串
在这里插入图片描述

  1. 认识一些推导

在这里插入图片描述

例:
在这里插入图片描述

  1. 最左、最右、规范推导
    最左(最右)推导:指一个推导序列中,每一步直接推导 α \alpha α ⇒ \Rightarrow β \beta β
    都是对 α \alpha α 中的最左(最右)非终结符进行替换。
    在形式语言中,最右推导通常称为规范推导。
    规范推导的逆过程称为最左规约,也称为规范规约。
    在这里插入图片描述

  2. 语法树
    推导过程用树表示出来。
    在这里插入图片描述

  3. 文法的二义性
    如果一个文法存在某个句子具有两棵不同的语法树,则称这个语法是二义的。

  4. 句型,句子,语言
    句子本身属于句型,句子所有符号都是终结符
    语言,G【s】所确定的语言为L(G[S])
    一个文法决定一个语言

2.2 文法的左递归

在这里插入图片描述

2.3 短语、直接短语、句柄

直接短语
在这里插入图片描述
看一个例子
在这里插入图片描述
首先画出语法树

在这里插入图片描述
短语:语法树中每一个内部结点包含树根都对应一个短语,所有叶子从左到右写出来。

在这里插入图片描述
直接短语:父子两代,直接长成的,一步生长
F……T
F……T

句柄:
F……T
(最左最小的树对应的符号串)

素短语:含有一个终结符,不含其他更小的素短语。

再来看一个例子:
在这里插入图片描述

2.4 文法的实用限制

1),不存在U–>U规则(直接删除)
2),每一个非终结符都是有用的
3),每一个非终结符都是能终止的

2.5 算法2.1:每一个非终结符都是有用的

有用留下,无用删除

打点法

初始化:集合U=V N _N N U中文法开始符号S打上标志

反复做:
对每一条规则,A–> α \alpha α ,若A已打上标志,则 α \alpha α对应的所有的非终结符都是有用的,都打上标志一直做到集合U中没有新的符号打上标志。

最后:U中没有打上标志的符号,全部删除

来看一个例子:

在这里插入图片描述

2.6 算法2.2:每一个非终结符都能终止

前提:U–> α \alpha α| β \beta β 分开
U–> α \alpha α
U–> β \beta β

打点法

初始化:如果规则右部分全部由V T _T T 符号组成,该规则左部符号打上标志
反复做:
对每一条规则,如果规则右部由V T _T T中的符号以及打上标志非终结符组成,该规则符号左部打上标志。
一直到没有规则打上标志。
最后:直接删除未打上标志的

在这里插入图片描述
算法2.1 算法2.2要反复多次迭代运行直到2.1 2.2都不发生变化。

2.7 形式语言分类

0型文法
1型文法(上下文有关)
2型文法(上下文无关)
3型文法(正则文法)

3. 词法分析

3.1 基本概念

  1. 功能
    1),从组成源程序的字符串识别出一个单词(具有语法含义的最小单位)
    2),依据词法规则识别单词
    3),单词类别:保留字,标识符,常数,运算符,分隔符
    4),单词的表示:二元组(类别,属性)

3.2 手工设计词法分析程序

3.3 有限自动机及其化简

3.3.1 NFA不确定有限自动机

M=(S,Σ, δ \delta δ,S 0 _0 0,F)

δ \delta δ:SXΣ* 到S子集映射
有空边一定是NFA,DFA是NFA的特例。

1),设计被2整除的0,1串
在这里插入图片描述
2),设计NFA,L(NFA)={被三整除的0,1串}, ξ \xi ξ也算

在这里插入图片描述

3.3.2 DFA确定的有限自动机

M=(S,Σ, δ \delta δ,S 0 _0 0,F)
DFA只能允许一个开始状态

1),设计一个DFA表示L={以0开头的0,1串}

在这里插入图片描述
2),L(DFA)={ϵ}
在这里插入图片描述

3),L(DFA)= ϕ \phi ϕ

在这里插入图片描述

3.4 算法3.1 NFA的确定化(NFA–>DFA)

情形1:不存在ϵ边
在这里插入图片描述
1),请将下NFA化为DFA
在这里插入图片描述
在这里插入图片描述
2),请将下NFA化为DFA

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
情形2:有 ϵ \epsilon ϵ
ϵ \epsilon ϵ边的作用
在这里插入图片描述
1),请将下NFA化为DFA

在这里插入图片描述
2),L={ ϵ \epsilon ϵ}设计一个NFA表示
在这里插入图片描述
结果如下
在这里插入图片描述
3),请将下NFA化为DFA
在这里插入图片描述
在这里插入图片描述

3.5 算法3.2 DFA的化简(DFA–>MFA)

在这里插入图片描述
在这里插入图片描述
DFA的最优化,将不等价的状态拆分

1),DFA–>MFA
在这里插入图片描述

在这里插入图片描述
2), DFA–>MFA

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

3.6 正则式

正则式:以a开头后跟任意多个b,记为ab*
正则集:a,ab,abb,……
满足特征所有符号串构成的集合

核心运算定义

在这里插入图片描述
正则式的性质:
在这里插入图片描述
1),L(e)={任意0,1串}
(0|1)*
2),L(e)={以0开头0,1串}
0(0|1)*
3),L(e)={被2整除的0,1串}
(0|1)*0

3.7 算法3.3 正则式–>NFA

在这里插入图片描述
1),0(0|1)*
在这里插入图片描述
2),(a|b)* a (a|b)*

在这里插入图片描述

3.8 算法3.4 NFA–>正则式

改造NFA:
1)检查NFA是不是只有一个开始状态且发出边,否则引入一个新的开始状态且发出 ϵ \epsilon ϵ边,指向旧的开始状态。
2)检查NFA是否只有一个终止状态,只接受边,否则引入一个新的终止状态,旧的终止状态发出 ϵ \epsilon ϵ边指向它。
目标:唯一的开始,唯一的终止。

反复使用如下四条规则
在这里插入图片描述

1),被2整除的0,1串
在这里插入图片描述

2),被三整除的0,1串, ϵ \epsilon ϵ也算

在这里插入图片描述

3.9 算法3.5 左线性文法–>NFA

左线性文法和右线性文法
在这里插入图片描述
在这里插入图片描述
1),左线性转换NFA

在这里插入图片描述

3.10 算法3.6 NFA–>左线性文法

在这里插入图片描述

1),被2整除的0,1串,NFA–>左线性文法
在这里插入图片描述

3.11 算法3.7 右线性文法–>NFA

在这里插入图片描述
1),右线性文法–>NFA

在这里插入图片描述

3.12 算法3.8 NFA–>右线性文法

在这里插入图片描述
1),NFA–>右线性文法
在这里插入图片描述
2),NFA–>右线性文法
在这里插入图片描述
3),左线性文法改造为右线性文法
在这里插入图片描述

3.13 算法3.9 左线性文法–>正则表达式

在这里插入图片描述
1),左线性文法–>正则表达式
在这里插入图片描述

3.14 算法3.10 正则表达式–>左线性文法

在这里插入图片描述
1),正则表达式–>左线性文法

在这里插入图片描述

3.15 算法3.11 右线性文法–>正则表达式

在这里插入图片描述
1),右线性文法–>正则表达式
在这里插入图片描述

2),右线性文法–>正则表达式
在这里插入图片描述

3.16 算法3.12 正则表达式–>右线性文法

在这里插入图片描述
1),正则表达式–>右线性文法

在这里插入图片描述

3.17 12个算法的相互关系

在这里插入图片描述

4. 自上而下的语法分析

4.1 自上而下的语法分析基本思想

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

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

相关文章

【刷题篇】贪心算法(一)

文章目录 分割平衡字符串买卖股票的最佳时机Ⅱ跳跃游戏钱币找零 分割平衡字符串 class Solution { public:int balancedStringSplit(string s) {int lens.size();int cnt0;int balance0;for(int i0;i<len;i){if(s[i]R){balance--;}else{balance;}if(balance0){cnt;}}return …

MyBatis框架中各种参数类型绑定的方式

MyBatis框架中各种参数类型绑定的方式 一、MyBatis参数绑定 MyBatis框架中&#xff0c;通过Mapper接口和Mapper映射文件的方式来操作数据库的时候&#xff0c;可能需要通过Mapper接口中的方法传递相应的参数拼接到SQL语句上面&#xff0c;那么Mybatis将传递的参数映射到对应S…

用python实现基本数据结构【03/4】

说明 如果需要用到这些知识却没有掌握&#xff0c;则会让人感到沮丧&#xff0c;也可能导致面试被拒。无论是花几天时间“突击”&#xff0c;还是利用零碎的时间持续学习&#xff0c;在数据结构上下点功夫都是值得的。那么Python 中有哪些数据结构呢&#xff1f;列表、字典、集…

03_瑞萨GUI(LVGL)移植实战教程之驱动触摸屏(I2C)

本系列教程配套出有视频教程&#xff0c;观看地址&#xff1a;https://www.bilibili.com/video/BV1gV4y1e7Sg # 3. 驱动触摸屏(I2C) 本次实验我们在上一次实验的基础上驱动I2C触摸屏。从这次实验开始&#xff0c;我们不需要重新创建工程&#xff0c;而是在上一次实验项目的基础…

【Unity编辑器扩展】| SceneView面板扩展

前言【Unity编辑器扩展】| SceneView面板扩展一、Scene界面添加右键菜单二、自定义菜单的方式三、Scene视图中禁用选择对象四、OnSceneGUI()五、Gizmos5.1 绘制线框5.2 拓展方法六、Handles总结前言 前面我们介绍了Unity中编辑器扩展的一些基本概念及基础知识,还有编辑器扩展中…

IDEA中的MySQL数据库所需驱动包的下载和导入方法

文章目录 下载驱动导入方法 下载驱动 MySQL数据库驱动文件下载方法&#xff1a; 最新版的MySQL版本的驱动获取方法&#xff0c;这个超链接是下载介绍的博客 除最新版以外的MySQL版本的驱动获取方法&#xff0c;选择Platform Independent&#xff0c;选择第二个zip压缩包虾藻…

华清远见第六课程作业day3

类 栈 #include <iostream>using namespace std;class Sta{ private:int *data;int top; public:Sta():data(new int(128)){top-1;cout<<"stack::无参构造:"<<endl;}~Sta(){delete data;cout<<"stack::析构函数:"<<this<…

信息安全技术概论-李剑-持续更新

图片和细节来源于 用户 xiejava1018 一.概述 随着计算机网络技术的发展&#xff0c;与时代的变化&#xff0c;计算机病毒也经历了从早期的破坏为主到勒索钱财敲诈经济为主&#xff0c;破坏方式也多种多样&#xff0c;由早期的破坏网络到破坏硬件设备等等 &#xff0c;这也…

顾曼宁(顾曼):颠覆行业,引领共享伞新浪潮

在共享经济浪潮中&#xff0c;有一位勇敢的女性创业者&#xff0c;以其卓越的洞察力和创新思维&#xff0c;成为国内共享晴雨伞行业的领航者——她就是顾曼宁&#xff08;顾曼&#xff09;。作为行业颠覆者和蚂蚁金服战略投资的受益者&#xff0c;她的创业历程彰显了女性创业者…

【Kafka】Kafka再平衡机制及相关参数

背景 Kafka作为一款基于发布订阅模式的消息队列&#xff0c;生产者将消息发送到Kafka集群&#xff08;Brokers&#xff09;中&#xff0c;消费者&#xff08;Consumer Group &#xff09;拉取消息进行消费&#xff0c;实现了异步机制。Kafka中&#xff0c;消费者通常以消费者组…

【Python从入门到进阶】35、selenium基本语法学习

接上篇《34、selenium基本概念及安装流程》 上一篇我们介绍了selenium技术的基础概念以及安装和调用的流程&#xff0c;本篇我们来学习selenium的基本语法&#xff0c;包括元素定位以及访问元素信息的操作。 一、元素定位 Selenium元素定位是指通过特定的方法在网页中准确定位…

SpringMvc--文件上传下载

一.什么是SpringMvc文件上传下载 二.文件上传 编写hpjyController类 编写upload.jsp 建立一个储存图片的文件夹 ​编辑 编写PageController来处理页面跳转 编写工具类PropertiesUtil 编写resource.properties类 编写list.jsp 测试结果 三.文件下载 编写hpjyControll…

Redis集群3.2.11离线安装详细版本(使用Ruby)

1.安装软件准备 1.Redis版本下载 Index of /releases/http://download.redis.io/releases/ 1.2gcc环境准备 GCC(GNU Compiler Collection,GNU编译器套件)是一套用于编译程序代码的开源编译器工具集。它的主要用途是将高级编程语言(如C、C++、Fortran等)编写的源代码转换…

MyBatis之分页查询:MyBatis PageHelper

MyBatis之分页查询&#xff1a;MyBatis PageHelper 简介 MyBatis&#xff0c;作为目前流行的ORM框架&#xff0c;大大方便了日常开发。而对于分页查询&#xff0c;虽然可以通过SQL的limit语句实现&#xff0c;但是比较繁琐。而MyBatis PageHelper的出现&#xff0c;则解决了这…

如何在postman中实现自动化测试?

这里简单演示在postman中怎样实现自动化测试&#xff08;不涉及到用户登录的token认证&#xff09; 导入测试用例文件&#xff0c;测试web接口 postman使用流程&#xff1a;创建collection文件夹&#xff0c;在该文件夹中创建post&#xff0c;get请求&#xff1b;其中传入的参…

Keil MDK-ARM 软件的部分常用快捷键如下

F7&#xff1a;编译。F8: 下载。F9&#xff1a;添加/取消断点。Ctrl F5&#xff1a;调试。Tab&#xff1a;将选中的内容整体右移。Shift Tab&#xff1a;将选中的内容整体左移。Home&#xff1a;将光标移至行首。End&#xff1a;将光标移至行末。Ctrl >&#xff1a;光标…

【SpringMVC】注解、参数传递、返回值和页面跳转的关键步骤

目录 引言 一、常用注解 1.1.RequestMapping 1.2.RequestParam 1.3.RequestBody 1.4.RequestHeader 1.5.PathVariable 二、参数传递 2.1.基础类型String 2.2.复杂类型 2.3.RequestParam 2.4.PathVariable 2.5.RequestBody 2.6.RequestHeader 三、返回值 3.1.vo…

大数据-玩转数据-Flink状态编程(中)

一、键控状态 键控状态是根据输入数据流中定义的键&#xff08;key&#xff09;来维护和访问的。 Flink为每个键值维护一个状态实例&#xff0c;并将具有相同键的所有数据&#xff0c;都分区到同一个算子任务中&#xff0c;这个任务会维护和处理这个key对应的状态。当任务处理…

Jmeter压测监控体系搭建Docker+Influxdb+Grafana

章节目录&#xff1a; 一、背景介绍1.1 概述1.2 拓扑图 二、云服务器设置三、Docker3.1 概述3.2 搭建流程3.3 安装验证3.4 配置docker镜像加速3.5 取消sudo运行(可选操作) 四、InfluxDB4.1 镜像拉取4.2 运行数据库4.3 创建存储 jmeter 数据的库 五、Grafana5.1 镜像拉取5.2 关联…

Day_13 > 指针进阶(2)

目录 1.函数指针数组 2.指向函数指针数组的指针 3.回调函数 qsort()函数 代码示例 void* 4.结束 今天我们在进阶指针的基础上&#xff0c;学习进阶指针的第二部分 1.函数指针数组 首先我们回顾一下指针数组 char* arr[5]://字符指针数组 - 数组 - 存放的是字符指针 in…