编译原理-各章典型题型+思路求解

news2024/11/28 2:35:28

第2章文法和语言习题

基础知识:

思路:


基础知识:

思路:


基础知识:

编译原理之 短语&直接短语&句柄 定义与区分_编译原理短语,直接短语,句柄-CSDN博客

思路:


题目:

基础解释: 

 简单来说:

上下文无关文法就是这个文法中所有的产生式左边只有一个非终结:

例如:S->Abc

上下文无关文法就是第一个产生式左边有不止一个符号

例如:Sa->Abc

 思路:


编译原理 —— 正规式、正规集和正则定义-CSDN博客

【20200401】编译原理课程课业打卡十二之求解正规文法对应正规式_正规式s=(o|10)*-CSDN博客

思路:

第3章词法分析习题

基础解释: 

思路:


 思路:


基础解释:

正规式->最小化DFA说明 - 知乎 (zhihu.com)

思路:


基础知识:

思路:

先写出满足条件的正规式,由正规式构造NFA,再把NFA确定化和最小化

对于正规式的构造:

题目给定为字符表有0、1两种字符,则我们可以得到(0|1)*的正规式。

又由于每一个1后面都有一个0,故每次出现1必然为10的形式

故得到正规式:(0|10)*

(答案给的正规式差不多,我们最终也可以得到化简的答案,因为)

第4章自顶向下语法分析习题 

基础知识:

对于不带回溯:采用提取公共因子的方法,即让候选首符号集变成两两不相交,不会出现读取一个一个符号后发现下一个符号不匹配又要回到上一个读取位置的情况。

推荐博客:

编译原理第四章总结_不带回溯的递归子程序是什么意思-CSDN博客

思路:

注意:

这里的第2问,笔者书写并不规范,因为当一个文法满足LL(1)条件的时候,我们才能构造一个不带回溯的递归子程序。故在第2问中应先判断改写后的文法G是不是LL(1)型文法,然后再书写不带回溯的递归子程序。


【20200415】编译原理课程课业打卡十五之求解预测分析表&分析输入串是否为文法句子_对文法g,进行改写,然后对每个非终结符写出不带回溯的递归子程序-CSDN博客


基础知识:

对于LL(1)文法的判断:

故对于LL(1)文法的判断流程为:先看文法是否存在左递归

构建非终结符的FIRST集和FOLLOW集

然后检查各个产生式SELECT集两两不相交

从定义上可以看出SELECT集不存在空集

对于第3点解释:当空串属于a的FIRST集的时候,如果a处于空串这种状态的时候,那么它的FOLLOW集此时也等价于为它的FIRST集。
注意:

关于FIRST集中的空串。简而言之,符号串必须广义推导成一个“纯纯的”空串。此时才将空串放入首符号集中。


总结:

这节的主要内容为给定文法,对它进行一系列的操作。(以下为粗略的总结,仅仅作为复习,详细细节还需要找到对应定义)

1.对于最左推导:

记住每次都是在保证正确的情况下,从最左边开始匹配即可

2.自上而下分析法:

从文法的开始符号出发,反复使用各种产生式,寻找与输入符号匹配的推导。

3.目前来说,我们改写文法主要有两种手段:

 消除直接左递归:为了防止从左边开始进行产生式匹配时出现一直左递归的情况,因为该方式的左边最终一定为一个终结符,故将终结符提前直接表示,重复递归的过程放到右边,方便对于自上而下分析法进行符号匹配(间接左递归:去环即可)

提取左因子:为了防止有多个产生候选式,选择了错误的候选式,导致会出现回溯问题的解决方案。解决方案:反复提取相同的公共左因子,构成新的非终结符,使每个非终结符的所有候选首符号集变成两两不相交

4.FIRST集和FOLLOW集:

FIRST集:

定义:FIRST集为当前非终结符推导出的第一个终结符号所构成的集合,也就是所有的第一个终结符号组合的集合。

构造过程:简单来说就是找第一个终结符,要注意的是对于空串的加入,一定要广义上全部推出为空(即最后推出来的结果,就是一个空集),才能加入。

作用:能够在后面进行预测分析表的时候,直接将表达式写入。简单可以理解为在读取字符进行输入的时候能够通过给定的字符快速的定位到需要用哪一个产生式(即通过第一个非终结符,找到所使用的产生式)。

FOLLOW集:

定义:FOLLOW集为当前非终结符后面的第一个终结符所构成的集合,也就是所有的它后面的第一个终结符的集合。

构造过程:首先需要将终结符放入到开始符号S中(把开始符号S看作一个整体那么该需要读入的字符串就可以看作($S$)),然后依次对于每一个非终结符,将它的第一个终结符放入到集合中。

作用:能够在后面进行预测分析表的时候,直接将表达式写入。简单可以理解为在读取字符进行输入的时候能够通过给定的字符快速的定位到需要用哪一个产生式(即通过第一个非终结符,找到所使用的产生式)。

作用其实和FIRST差不多,但要注意的是在预测分析表中,FOLLOW集只会在FIRST集存在空的时候,才会将FOLLOW集写入(我们可以这样理解:产生式为空,那么我们要根据的第一个字符串定位就等同于FOLLOW集,即该空产生式后面的第一个终结符)

5.SELECT集:

定义:产生式A→α的可选集是指可以选用该产生式进行推导时对应的输入符号的集合,记为SELECT( A→α )

如果 ε not∈ FIRST(α),  那么SELECT(A→α)= FIRST(α) 如果 ε ∈ FIRST(α), 那么SELECT(A→α)=( FIRST(α)-{ε} )∪FOLLOW(A)

作用:可以用于判断文法是否LL(1)文法(即判断下文LL(1)文法的满足条件的2、3条)

判断过程如下:

解释:简单来说,SELECT集即为该产生式能够推导产生的第一个终结符的所有集合。 通过SELECT交集的判断,就能判断是否存在相同首终结符的情况,进而判断是否为LL(1)文法

6.LL(1)文法:

LL(1)文字解释:

第一个L表示从左到右去扫描输入串

第二个L表示采用最左推导的方式(这是为什么我们要去掉直接左递归的原因,防止出现一直递推的问题)

1表示分析时,每一步只需要向前看一步即可(这也是为什么我们要提取左因子的原因,让我们能够直接对应表中的值进行推导,其具有唯一对应的关系)

满足条件:

⑴文法不含左递归

⑵文法中每个非终结符A的各个产生式的首终结符集两两不相交,即,若 A→ α1| α 2 |…| α n则      FIRST(αi )∩FIRST(αj )=φ

⑶文法中每个非终结符A若其首字符集中含有ε,则FIRST(αi )∩FOLLOW(A)= φ

7.预测分析表的构建:

对于A->a

首先对产生式右边构造FIRST(a)集,当FIRST(a)集中存在空集的时候,接下来就构造产生式左边非终结符的FOLLOW(A)集,然后根据以上两个集合去在预测分析表中书写对应位置的产生式。

注意这里的为什么要构造FOLLOW(A)集解释一下,当FIRST(a)集广义上都为空的时候,这个时候FOLLOW(A)集就等价于第一个非终结符。(因为我们的分析表就是根据第一个非终结符进行判断)

8.预测分析的过程:

设栈顶符号x和输入符号a

1.当x=a= $ 时,则表示分析成功,停止分析

2.当x=a not= $时,把X从STACK栈顶弹出,a指向下一个输入符号。这里的意思表示a之前指向的字符已经匹配,开始匹配下一个字符。

3.当x为非终结符的时候,查看分析表,找到对应位置的产生式,把x弹出栈顶,把产生式的右部符号,反向进栈(若为空,则不推入东西进栈)。这一步的意思就是通过预测分析表,从当前产生式的起点位置出发,因为当前文法为LL(1)文法,其保证分析时只需要向前看一步,故我们可以采用该方式进行推导。


 第5章算符优先分析习题

基础知识:

编译原理------语法分析(二)自下而上的归约(算符优先,LR分析)_待约项目和归约项目-CSDN博客

注意:注意算符优先关系表的拓广文法:S'->$S$,可以通过该文法,蒋终结符与$的关系写入算符优先关系表中。


总结:

1.语法分析的方法:

简单来说:

自上而下即从开始符号开始,根据给定的字符串,判断要用什么产生式去推导,然后逐步推导出结果。主要包括递归下降分析法【即通过代码的方式表现出来】和 LL(1)预测分析法【通过消除左递归,消除回溯 计算FIRST、FOLLOW集合,构造预测分析表,然后根据预测分析表对于输入串进行判定】

自下而上是从输入串开始,对字符串进行读入,并根据给定的字符串,判断要用什么产生式去归约,最后逐步规约出结果。主要包括算法优先分析法【计算FIRSTVT和LASTVT集合 构造算符优先关系表,通过最左素短语进行规约】、规范规约【边输入单词符号,边进行规约】、LR分析法

2.短语与直接短语:

3.优先关系:

4.算符文法:

5.算符优先文法:

6.FIRSTVT集与LASTVT集:

简单来说
FIRSTVT集就是 一个终结符的优先级小于 后面所有非终结符 第一层递归 里面的 第一个终结符

LASTVT集就是 一个终结符的优先级大于 前面所有非终结符 第一层递归 里面的 第一个终结符

该两个集合的核心都是 对于在非终结符里面的终结符 大于 与非终结符相邻的终结符,大家可以理解成递归,非终结符就是一个递归程序,我们程序运行的时候肯定是先把最深处递归的内容处理好后,再网上递归,这样就最深处的递归程序里面的内容优先级比上一级的要大。

7.最左素短语:

最左素短语用于算符优先算法进行分析的归约操作。

第6章LR 分析习题(持续更新中)

 

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

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

相关文章

Javase.认识异常

认识异常 【本章目标】1. 异常的概念与体系结构1.1 异常的概念1.2 异常的体系结构1.3 异常的分类 2. 异常的处理2.1 防御式编程2.2 异常的抛出2.3 异常的捕获2.3.2 try-catch捕获并处理2.3.3 finally2.4 异常的处理流程 3. 自定义异常类 【本章目标】 异常概念与体系结构异常的…

04-echarts-立体柱状图扩展

柱状图扩展 一、前言二、思路1、新增面①、在drawShape方法中,新增一个实际左侧面,②、 在drawShape方法中,新增一个实际右侧面,③ 绘制 2、新增series对象① 添加实际值的左侧面和右侧面 三、效果图 一、前言 事情是这样子的&am…

java技术专家面试指南50问【java学习+面试宝典】(十)

ConcurrentHashMap实现原理 JDK1.7 : 【数组(Segment) 数组(HashEntry) 链表(HashEntry节点)】 ConcurrentHashMap(分段锁) 对整个桶数组进行了分割分段(Segment),每一…

IDEA集成Docker实现快捷部署

本文已收录于专栏 《运维》 目录 背景介绍优势特点操作步骤一、修改Docker配置二、配置Docker插件三、编写Maven插件四、构建Docker镜像五、创建Docker容器 总结提升 背景介绍 在我们手动通过Docker部署项目的时候,都是通过把打包好的jar包放到服务器上并且在服务器…

AI穿戴设备是未来手机的终结者?中国AI商业化的未来预测

AI技术的发展正处于商业化应用的关键阶段,而中国在互联网时代已凭借商业化应用逆袭。AI算法大模型虽强大,但真正普惠民众需与设备深度结合。穿戴式智能设备就成为了新战场,AI算法与穿戴设备结合能释放更大工作效率。私人助理AI将成趋势&#…

南卡、漫步者和Oladance开放式哪家强?无广避坑测评!

现在市面上的开放式耳机种类非常多,在购买的时候大多数人都没有非常确定的目标,这主要是因为大多数人对开放式耳机的认识程度不够。 作为一个有着多年数码产品测评经验的测评员,我刚好对开放式耳机也有比较深刻的理解,也借着大家…

【Splitpanes】Vue.js 靠谱、简单并支持触摸的窗格分割器/调整器。

【Splitpanes】Vue.js 靠谱、简单并支持触摸的窗格分割器/调整器。 介绍安装使用示例与文档 介绍 Vue.js 靠谱、简单并支持触摸的窗格分割器/调整器。用于实现可调节窗口,支持Vue2、Vue3。 安装 Vue3 npm install splitpanesVue2 npm install splitpaneslegac…

一文读懂数据仓库ODS层

数据仓库一般分为三层,分别为数据贴源层(ODS,Operation Data Store)、数据公共层(CDM,Common Data Model)和数据应用层(ADS,Application Data Service)。其中…

小巧悦耳的百元耳机,也有纯净的音乐享受,西圣AVA2体验

无论是居家休闲还是出门在外,音乐成为了许多人生活中不可或缺的一部分。特别是在拥有一款既经济又好听的蓝牙耳机之后,我们就可以在通勤路上和办公室里,隔绝外界干扰,找回属于自己的天地,提升生活品质。目前我用的是一…

[巨详细]使用HBuilder-X新建uniapp项目教程

文章目录 安装HBuilder-X启动uniapp项目其他:下载预览浏览器下载终端插件想用uni-ui 安装HBuilder-X 详细步骤可看上文》》 启动uniapp项目 先打开HBuilder-X 点击新建项目 选择uniapp侧边栏,mian中的点击浏览 选择已经安装到本地的uniapp项目&#…

web版的数字孪生,选择three.js、unity3D、还是UE4

数字孪生分为客户端版和web端版,开发引擎多种多用,本文重点分析web端版采用哪种引擎最合适, 贝格前端工场结合实际经验和网上主流说法,为您讲解。 一、数字孪生的web版和桌面版 数字孪生的Web版和桌面版是数字孪生技术在不同平台…

分享由AI制定一个商城网站的开发计划及推荐的开发语言

商城网站开发计划 一、项目概述 本商城网站开发计划旨在创建一个功能齐全、用户友好的在线购物平台,为顾客提供商品浏览、搜索、购物车管理、订单跟踪、在线支付等服务。商城将支持多种商品分类,包括但不限于电子产品、家居用品、服饰鞋帽等。 二、开…

张大哥笔记:5种信息差赚钱模式

从古至今,赚钱最快的路子就一个,而且从未改变,那就是信息差!在商业活动中,信息不对称现象普遍存在,如果你善于利用这些信息差的话,就可以赚到钱! 1、价格的信息差 商品价格在不同地…

倍思突破氮化镓快充技术,为用户带来安全舒适体验

氮化镓,这个化学式为GaN的化合物,其高热稳定性和化学稳定性使其在多种极端环境中都能保持优良的性能,从而为其在电子器件领域的应用奠定了坚实的基础。 2018年前后开始,氮化镓快充充电器进入国内市场。作为第三代半导体材料的代表,氮化镓具有宽禁带的特性,其禁带宽度远大于传统…

数据库讲解---(数据库保护)【下】

目录 一.并发控制 1.1并发操作引发的问题 1.1.1丢失修改 1.1.2不可重复读 1.1.3读”脏“数据 1.2调度及其可串行化 1.3事务的隔离性级别 1.4封锁技术【重要】 1.4.1排他锁 1.4.2共享锁 1.5封锁协议 1.5.1一级封锁协议 1.5.2二级封锁协议 1.5.3三级封锁协议 1.5.…

【STM32】SysTick系统滴答定时器

1.SysTick简介 CM4内核的处理和CM3一样,内部都包含了一个SysTick定时器,SysTick 是一个24 位的倒计数定时器,当计到0 时 ,将 从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除&#xf…

使用Python发送电子邮件:轻松实现自动化沟通

哈喽,大家好,我是木头左! 1. 为什么使用Python发送电子邮件? 在当今这个信息爆炸的时代,电子邮件已经成为了日常生活中不可或缺的一部分。无论是工作还是生活,都可能需要通过电子邮件与他人进行沟通。而Py…

springboot项目mapper无法自动装配,未找到 ‘userMapper‘ 类型的Bean解决办法.

一开始我看到了这个回答:springboot项目mapper无法自动装配,未找到 ‘userMapper‘ 类型的 Bean解决办法(含报错原因)_无法自动装配。找不到 usermapper 类型的 bean。-CSDN博客 mapper无法自动装配,未找到 ‘userMap…

Open WebUI的SearXNG网络搜索配置【403报错解决方法】

1.拉取SearXNG镜像 docker pull searxng/searxng 2.在Docker Desktop的Images界面中启动searxng容器 3.查看searxng是否部署成功 在Docker Desktop的Containers界面中,查看searxgn暴露的端口。 http://localhost:31292/ 4.修改settings.yml配置参数 在Docker De…

python如何判断图片是否为空

如下所示: import cv2im cv2.imread(2.jpg) if im is None:print("图像为空") # cv2.imshow("ss", im) # cv2.waitKey(0)