【编译原理】总览

1 字母表 

字母表:

        用表示,它是一个有穷符号集合

        符号:字母、数字、标点符号...

        例如:二进制字母表为{0,1},ASCII字符集

2 字母表的运算

字母表上的乘积:

        ∑1∑2={ab  | a属于∑1,b属于∑2}

        例如:{0,1}{a,b}={0a,0b,1a,1b}

3 串      

4 串的运算

 5 文法的形式化定义

        G=(VT,VN,P,S)

        VT是终结符集合,用小写字母表示

        VN是非终结符集合,用大写字母表示

        P 是产生式集,产生式的右边的式子是左部字母的“候选式”

        S是开始符号

6 语言的定义

        直接推导:简而言之就是用产生式的右部替换成产生式的左部

有了文法(语言规则),如何判定某一词串是否是该语言的句子:

        1.句子的推导(派生)--从生成语言的角度

        2.句子的归约--从识别语言的角度

        由文法G的开始符号推导出的所有句子构成的集合称为文法G的生成的语言,记为L(G)

7 文法分类

文法分类:

        0型文法

         1型文法

         2型文法

         3型文法 

7.1 0型文法 

        无限制文法/短语结构文法,

        由0型文法G生成的语言称为L(G),0型语言

7.2 1型文法

        也称为上下文有关文法  CSG    

        要求产生式的左部的长度小于右部的长度  

        CSG中不包含空产生式( ε-产生式)

        由CSG产生的语言叫做上下文有关语言(1型语言)

        由上下文有关文法(1型文法)G生成的语言称为L(G)

7.3 2型文法

        也称为上下文无关文法CFG

        要求产生式的左部必须是一个非终结符        

        由CFG产生的语言叫做上下文无关语言(2型语言)

        由上下文无关文法(2型文法)G生成的语言称为L(G)

7.4 3型文法

        正则文法,包含右线性文法(A->wB或A->w)和左线性文法(A->Bw或A->w)

        由3型文法产生的语言叫做正则语言(3型语言)

        由正则文法(3型文法)G生成的语言称为L(G)

        正则文法能描述程序设计语言的多数单词

7.5 四种文法之间的关系

         逐级限制和逐极包含

8 CFG分析树

        (句型的)短语:给定一个句型,其分析树中的每一棵子树的边缘称为该句型的一个短语 。如果子树只有父子两代结点,那么这可子树的边缘称为该句型的一个直接短语。

9 二义性文法

        下面这种情况消除歧义的规则:每个else和最近的尚未匹配的if匹配 

1-9 有关练习 

        1.文法G产生的 句子的全体是该文法的语言

        2.文法G定义的语言是无限集,则文法必然是递归

        3.若一个文法是递归的,则它所产生的语言的句子是无穷多个

        4.文法E->E+E|E*E|i的句子i*i+i*i有5棵不同的语法树

        5.由文法开始符号出发经过若干步(包括0步)推导产生的文法符号序列称为句型

        6.不能由符号集S={a,b}通过正比包运算产生     

        7.把汇编语言程序翻译成机器可执行的目标程序的工作是由汇编完成的。 

        8.编译程序分成若干“遍”,是为了使得程序的结构更为清晰

        9.编译是对高级语言的翻译  

10 词法分析-正则表达式

        正则表达式是一种用来描述正则语言的更紧凑的表示方法.例如r=a(a|b)*

        正则表达式可以由较小的正则表达式按照特定规则递归地构建.每个正则表达式r定义(表示)一个语言,记为L(r).这个语言也是根据r的子表达式所表示的语言递归定义的 

11 词法分析-正则语言

        可以用RE(正规式)定义的语言叫做正则语言或者正则集合

 11 词法分析-正则定义

        d相当于是给每个正则式的命名,以后就用d来代替对应的正则式 

 12 词法分析- 有穷自动机

        这类系统具有一系列离散的输入输出信息有穷数目的内部状态

        系统只需要根据当前所处的状态当前面临的输入信息就可以决定系统的后继行为.每当系统处理了当前的输入后,系统的内部状态也将发生改变

        最长子串匹配原则:当输入串的多个前缀与一个或多个模式匹配时,总是选择最长的前缀进行匹配

        FA的分类:确定的FA、非确定的FA

12.1 DFA

        用转换图或者转换表表示 

12.2 NFA 

13  词法分析--从正则表达式到有穷自动机

        

例题:

 14 词法分析器--从NFA到DFA

15 识别单词的DFA 

 16 词法分析阶段的错误处理

        

10-16 例题

        词法分析器的输出结果是:单词的种别编码和自身值

        词法分析器能识别出数值常量、过滤源程序中的注释、扫描源程序并识别记号,不能发现括号不匹配

        词法分析器用于识别单词,加工对象是源程序

        语法分析器以单词为单位输入

        语法分析器的任务是:分析单词串是如何构成语句和声名

        不存在这样一些语言,它们能被确定的有穷自动机识别,但不能用正则式表示

        两个有穷自动机等价是指它们所识别的语言相等

        有限状态自动机所能识别的是正规语言

        DFA的成分有:有穷字母表、多个终态的集合、转换函数,不包括多个初始状态的集合

        如果一个正规式所代表的集合是无穷的,则它必含有的运算是闭包运算

        一个正规式不止对应一个确定的有限状态机,一个正规语言可能对应多个正规文法

         翻译程序是把某一种语言程序(称为源语言程序)等价地转换成另一种语言程序(称为目标语 言程序)的程序。

        编译程序是把某一种高级语言程序等价地转换成另一种低级语言程序(如汇编语言或机器 语言程序)的程序。

        解释程序是把源语言写的源程序作为输入,但不产生目标程序,而是边解释边执行源程序 本身。

        词法分析器,又称扫描器,输入源程序,进行词法分析,输出单词符号。

        语法分析器,简称分析器,对单词符号串进行语法分析,识别出各类语法单元,最终判断输入串是否构成语法上正确的“程序”。

文法是描述语言的语法结构的形式规则(即语法规则)。

标识符是指由字母或数字组成的以字母为开头的一个字符串。

实质上,语法树与分析树的最根本区别在于它们的内部节点(包括根结点)
分析树的内部节点是非终结符
语法树的内部节点是操作符(运算符)
语法树省略了反应分析过程的非终结符

抽象语法树:语法树
具体语法树:分析树

17 语法分析--自顶向下分析

        从分析树的顶部(根节点)向底部(叶节点)方向构造分析树,看以看成是从文法符号S推导出词串w的过程

        最左推导:总是选择每个句型的最左非终结符进行替换

        最右推导:总是选择每个句型的最右非终结符进行替换

        在自底向上的分析中,总是采用最左规约的方式,因此把最左规约称为规范规约,而最右推导相应的称为规范推导

        计算机实现自顶向下分析是通过递归下降分析,递归下降分析由一组过程组成,每个过程对应一个非终结符。可能需要回溯,导致效率低下

        预测分析技术递归下降技术的一个特例,通过在输入中向前看固定个数(通常是1)符号来选择正确的A-产生式。预测分析不需要回溯,是一种确定的自顶向下分析方法

18 语法分析--文法转换

        问题1:同一个终结符的多个候选式存在共同前缀,将导致回溯现象

        问题2:左递归文法会使递归下降分析器陷入无限循环

18.1 消除直接左递归

        实际是将左递归变成右递归;消除左递归付出的代价是--引进了一些非终结符和ε产生式

        将A'→αA'|ε换成A→βA' A'→αA'|ε

例子:

        E→E+T|T

        T→T*F|F

        F→(E)|i

消除直接左递归:

上面的文法有两条直接左递归:E→E+T|T和T→T*F|F

E→E+T消除左递归后变成:
E→TE' E'→+TE'|ε
同理,T→T*F|F消除左递归:
T→FT' T'→*FT'|ε

18.2 消除间接左递归

       A→Bc A→d B→aA B→Ab

首先,经过推导(替换),文法变为
A→Abc|aAc|d

消除直接左递归:

A→(aAc|d)A' A'→bcA'|ε

或者

经过推导(替换),文法变为
B→aA|Bcb|db

消除直接左递归:

B→(aA|db)B' B'→cbB'|ε

18.3 提取左因子

        通过改写产生式来推迟决定,等读入足够多的输入,获得足够信息再做出正确的选择

将S → aB1|aB2|aB3|aB4|...|aBn|y变成

S → aS'|y
S'→ B1|B2|B3|...|Bn

例如:

        S →aAd|aBe

        A →c

        B →b

提取左因子之后

        S →aS'

        S' →Ad|Be

        A →c

        B →b

19 语法分析--LL(1) 文法

        S_文法:简单的确定性文法

        预测分析法的工作过程:从文法的开始符号出发,在每一步推导过程中根据当前句型的最左非终结符A和当前输入符号a,选择正确的A-产生式、为保证分析的正确性,选出的候选式必须是一的。

        为满足这个要求,S_文法应该满足:每个产生式的右边都以终结符开始;同一个非终结符的各个候选式的首终结符都不同;S_文法不包含ε产生式

        什么时候使ε产生式:当前非终结符A与当前输入符不匹配时,若存在A →ε,可以通过检查a是否可以出现在A的后面,来决定是否使用A →ε(若文法中无A →ε,则应报错)

        串首终结符:串首的第一个符号,简称首终结符

        LL(1):第一个L表示从左向右扫描,第二个L表示产生最左推导,1表示在每一步中只需要向前看一个输入符号来决定语法分析动作

20 语法分析--构造预测分析表

17-20 例题

        如果文法G是无二义的,则它的任何句子最左推导和最右推导的语法树必定相同

        识别上下文无关语言的自动机是下推自动机        

        一个文法G,若G的LL(1)分析表不含多重定义的条目,则称它是LL(1)文法

        语法分析器的输入是Token序列

        在递归子程序中,若文法存在左递归,则会使分析程序产生无限循环

         LL(1)的1目的是确定使用哪一个产生式进行展开

 21下推自动机

        

22 预测分析中的错误检测

两种情况可以检测到错误:

        1.栈顶的终结符和当前的输入符号不匹配

        2.栈顶非终结符与当前的输入符号在预测分析表对应项目为空

错误恢复:

        恐慌模式

        

重点难点解析

如何实现自顶向下:

        递归下降分析法

什么样的文法能够实现确定的自顶向下分析

        LL(1)文法

自顶向下的步骤:

        消除歧义(二义性),文法改造(消除左递归、提取左因子),LL(1)文法判定(确定性)

无二义性文法的判定:

        对于任意一个上下文无关文法,不存在一个算法,判定它是无二义性的,但能给出一组充分条件,满足这组充分条件的文法是无二义性的。(不满足,不一定具有二义性)

如何实现确定的自顶向下分析

        递归的方式:基于预测分析表对递归下降分析法进行扩展 

        非递归的方式      

语法分析的任务:

        识别句子,确定句子的类型。(对于不同类型的语句,后续的语义分析将执行不同的语义动作)

语法分析技术分类(前提是CFG无二义性):

        自顶向下、自底向上

        FIRST、FOLLOW集合均是终结符集

        FOLLOW集、SELECT集合中不能有空,FIRST集可以有   

        在编译时遇到错误时候,应该跳过错误所在的语法单位继续分析下去       

23 语法分析--自底向上的语法分析

        从分析树的底部(叶节点)向顶部(根节点)方向构造分析树,是将输入串规约为开始符号的过程。

        自顶向下的语法分析采用最左推导方式,自底向上的语法分析采用最左规约方式(反向构造最右推导)

        自底向上语法分析发通用框架:移入-规约分析

        栈内符号+剩余输入=规范句型(上图的线隔开的每一块就是一个规范句型)

24 语法分析--LR分析法概述

        LR文法是最大的、可以构造出相应移入-规约的语法分析器的文法类

        L:对输入进行从左到右的扫描

        R:反向构造出一个最右推导序列

        LR(k)分析:需要向前查看k个输入符号的LR分析;K=0和k=1这两种情况最具有实践意义,当省略k时,表示k=1

        自底向上分析的关键问题是:如何正确识别句柄

        句柄是逐步形成的,用“状态”来表示句柄识别的进展程度

25 语法分析--LR分析表

        LR(0)分析

        SLR分析

        LR(1)分析        

        LALR分析

25.1 LR(0)分析

        

25.2 SLR分析

(下面的 T->aBd 是I5) 

25.3 LR(1) 分析

25.4 LALR分析

重难点解析

自顶向下分析:

        通用框架:递归下降分析 

        主要问题:候选式的选择

        关键问题:如何正确选择候选式

自底向上分析:

        通用框架:移入-规约分析

        主要问题:冲突(归约-移进、归约-归约)

        关键问题:寻找句柄

        句柄是最左直接短语

如何正确识别句柄--LR分析法

        基本原理:句柄是逐步形成的,用“状态”表示句柄的拓展程度

        项目描述了句柄识别的状态

        LR分析器基于这样一些状态构造自动机进行句柄的识别

        以等价项目集作为状态构造自动机(等价项目)

        ACTION的s表示移进,r表示归约

26 二义性文法的LR分析

        每个二义性的文法都不是LR的

        某些类型的二义性文法在语言的描述和实现中很有用

        二义性文法的使用:应该保守的使用二义性文法,并且必须在严格控制之下使用,因为稍有不慎就会导致语法分析器所识别的语言出现偏差

27 LR的错误处理 

重点难点

         句柄都是相对于一个句型而言的

        LR(0)分析只关心构成某个成分A的各个自称分是否都已出现(如果出现就归约),但并没有考虑这个成分A是否是待分析句子中的一个成分。事实上,如果A不是待分析句子的一个成分,那么即使把它归约出来也是徒劳的,在后续分析中迟早会发现进行不下去

        因此应该把句柄的识别放在句型这样一个上下文环境中考虑

        受技术限制,考虑正规上下文实现比较困难,因此LR(1)分析只考虑成分A下文的第一个(终结)符号

        各种LR分析表构造方法的不同之处在于归约项目的处理上

        一个LR(1)文法合并同心集后若不是LALR(1)文法,则可能存在归约/归约冲突;同心集合并可能存在归约/归约冲突

        LR(1)文法都是无二义性但可能是左递归        

        在LR(0)的ACTION表中方中,如果某行有Rj,改行必定填满Rj,但是在其他分析法不一定填满

LR(0) 最右推导,不考虑后面输入进来是个啥,只看当前点的位置,所以没有有移进规约冲突和规约规约冲突时候才能用,才能被称为LR(0)文法
SLR(1) 不存在规约、移进冲突
LR(1) 不存在规约、规约冲突
LALR(1) 能合并,不冲突 

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

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

相关文章

气流流型烟雾模型研究相关法规要求及拍摄注意事项

气流模式可视化提供制药设施中实际气流模型的视觉记录。它是目前最广泛接受的、证明关键工艺区域的气流模型满足监管期望的方法。此外,气流模型可视化允许多个职能组织发现气流设计和功能的有效性和意义,特别是在关键领域。 与气流模型相关的法规指南要求…

数据处理神器Elasticsearch_Pipeline:原理、配置与实战指南

文章目录 📑引言一、Elasticsearch Pipeline的原理二、Elasticsearch Pipeline的使用2.1 创建 Pipeline2.2 使用 Pipeline 进行索引2.3 常用的 Processor 三、实际应用场景3.1 日志数据处理3.2 数据清洗和标准化3.3 数据增强 四、最佳实践4.1 性能优化4.2 错误处理4…

晶方科技:台积电吃饱,封装迎春?

半导体产业链掀起涨价潮,先进封装迎接利好。 这里我们来聊国内先进封装企业——晶方科技。 近期,由于产能供不应求,台积电决定上调先进封装产品价格,还表示订单已经排到2026年。 大哥吃不下了,剩下的订单全都是空间。…

GMSB文章四:微生物组多样性分析

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2 介绍 Alpha多样性主要关注的是样品内部的多样性,即一个特定区域或生态系统内的物种丰…

加油卡APP系统开发,优惠加油!

在当下的社会生活中,汽车已经成为了家家户户必备的出行工具,骑车加油也成为了居民生活中不可或缺的事情。为了让大众更加优惠加油,在线加油卡系统成为了一个重要的加油渠道! 在线加油卡系统是一个移动应用程序,用户可…

记一次elementui时间线的实现

实现效果 点击展开,每次累加五条数据进行展示 实现思路 起始本质上就是一个分页查询,只不过按新的形式展示,然后也不统计总数,每次只展示固定的5条数据点击加载更多,就展示下一页,页的页数进行1&#xff…

回购注销高管减持,东软集团的“大手笔”有意义吗?

文:互联网江湖 作者:刘致呈 作为老牌软件巨头,东软集团这两年的业绩着实有些不够看。 看财报数据,22年东软集团营收94.66亿,净亏损3.47亿,扣非净利利润-5.30亿。23年,集团营收105.44亿&#x…

玩个游戏 找以下2个wordpress外贸主题的不同 你几找到几处

Aitken艾特肯wordpress外贸主题 适合中国产品出海的蓝色风格wordpress外贸主题,产品多图展示、可自定义显示产品详细参数。 https://www.jianzhanpress.com/?p7060 Ultra奥创工业装备公司wordpress主题 蓝色风格wordpress主题,适合装备制造、工业设备…

使用Spring Boot构建RESTful API:从理论到实践

文章目录 引言第一章 RESTful API基础知识1.1 什么是RESTful API1.2 RESTful API的优势 第二章 Spring Boot基础知识2.1 什么是Spring Boot2.2 Spring Boot的主要特性 第三章 使用Spring Boot构建RESTful API3.1 项目初始化3.2 构建基础结构3.3 定义实体类3.4 创建Repository接…

虚拟化技术(一)

目录 一、虚拟化技术简介二、服务器虚拟化(一)服务器虚拟化的层次(二)服务器虚拟化的底层实现(三)虚拟机迁移(四)隔离技术(五)案例分析 一、虚拟化技术简介 虚…

【十六】【QT开发应用】Menu菜单,contextMenuEvent,setContextMenuPolicy,addAction

在 Qt 框架中,QMenu 类用于创建和管理菜单。菜单是用户界面的一部分,可以包含多个选项或动作,用户可以选择这些选项来执行特定的功能。菜单通常显示在菜单栏、上下文菜单(右键菜单)或工具栏中。 基本用法 创建菜单对象…

# Kafka_深入探秘者(5):kafka 分区

Kafka_深入探秘者(5):kafka 分区 一、kafka 副本机制 1、Kafka 可以将主题划分为多个分区(Partition),会根据分区规则选择把消息存储到哪个分区中,只要如果分区规则设置的合理,那么所有的消息将会被均匀的…

边缘混合计算智慧矿山视频智能综合管理方案:矿山安全生产智能转型升级之路

一、智慧矿山方案介绍 智慧矿山是以矿山数字化、信息化为前提和基础,通过物联网、人工智能等技术进行主动感知、自动分析、快速处理,实现安全矿山、高效矿山的矿山智能化建设。旭帆科技TSINGSEE青犀基于图像的前端计算、边缘计算技术,结合煤…

u盘插到另一台电脑上数据丢失怎么办?提供实用的解决方案

在现代数字化生活中,U盘作为一种便携式存储设备,承载着我们重要的数据和信息。然而,有时当我们将U盘插入另一台电脑时,可能会遇到数据丢失的棘手问题。这可能是由于多种原因造成的,那么,U盘插到另一台电脑上…

使用隐式事件执行控制图

什么是隐式事件? 隐式事件是图表执行时发生的内置事件: 图表唤醒 进入一个状态 退出状态 分配给内部数据对象的值 这些事件是隐式的,因为您没有显式地定义或触发它们。隐式事件是它们发生的图表的子级,仅在父图表中可见。 隐式事…

png格式快速压缩该怎么做?在电脑压缩png图片的方法

png格式的图片如何快速压缩变小呢?现在网络的不断发展,图片是日常用来分享展示内容的一种常用手段,其中使用最多的一种图片格式就是png,png格式具有无损压缩支持透明底的特性,在很多的场景下都会使用。 现在图片的清晰…

笔记-python reduce 函数

reduce() 函数在 python 2 是内置函数, 从python 3 开始移到了 functools 模块。 官方文档是这样介绍的 reduce(...) reduce(function, sequence[, initial]) -> valueApply a function of two arguments cumulatively to the items of a sequence, from left …

健身房管理系统

摘 要 随着人们健康意识的增强,健身房作为一种提供健身服务的场所,受到越来越多人的关注和喜爱。然而,传统的健身房管理方式存在诸多问题,如信息管理不便捷、会员管理不规范等。为了解决这些问题,本文设计并实现了一款…

分享一套基于SSM的九宫格日志网站(源码+文档+部署)

大家好,今天给大家分享一套基于SSM的九宫格日志网站 开发语言:Java 数据库:MySQL 技术:SpringSpringMvcMyBatis 工具:IDEA/Ecilpse、Navicat、Maven 博主介绍: 一名Java全栈工程师,专注于Java全…

AI大模型日报#0626:首款大模型芯片挑战英伟达、面壁智能李大海专访、大模型测试题爆火LeCun点赞

导读:AI大模型日报,爬虫LLM自动生成,一文览尽每日AI大模型要点资讯!目前采用“文心一言”(ERNIE-4.0-8K-latest)生成了今日要点以及每条资讯的摘要。欢迎阅读!《AI大模型日报》今日要点&#xf…