c语言编译原理消除回溯,编译原理消除回溯.ppt-程序员宅基地

技术标签: c语言编译原理消除回溯  

编译原理,主讲教师:于永彦,计算机科学与技术专业最重要的学科基础课程,淮阴工学院,电话: 15996198961 信箱: [email protected],2/20,FIRST集合,引入FIRST集概念是为了在当前输入的条件下,观察哪个产生式的右部能够导出输入符号,进而决定采用哪个产生式来进行推导。 显然,我们关心的是产生式右部符号串的FIRST集,即文法符号串的FIRST。这个符号串可以是任意的终结符和非终结符的组合。,3/20,FIRST集合,【定义】 假定是文法G的任一符号串,即(VN∪VT)*,则的首符号集定义为: 可见,所谓符号串的FIRST,就是指的所有可能推导的开头终结符或的集合。 由定义,不难得出下面的结论: 若 ,则 ; 若=aA,其中A代表非终结符,则 ; 若=Aa,则 ; 若 ,则 。,,4/20,FIRST集合,一、关系图法求解FIRST 【例】已知文法G[S]如下: S→AB|bC A→b|ε B→aD|ε C→AD|b D→aS|c 求所有非终结符的FIRST。 【解】关系图法求解FIRST集,分为三步进行。 (1)求出能推出ε的非终结符 首先建立一个以文法非终结符为元素的一维数组X,对应每个非终结符设置一个标志位,以记录能否推出ε。其值有三种情况:“未定”、“是”、“否”。 其次,按下述步骤逐步更新标志位:,5/20,FIRST集合,① 依次扫描文法每一条产生式 I.删除所有右部含终结符的产生式。若使得以某非终结符为左部的所有产生式都被删除,则置该非终结符的标记为“否”,例“D”。 II.若某非终结符存在一条右部为ε的产生式,则置该非终结符的标志为“是”,并删除该非终结符的所有产生式,如“A”、“B”。见表的第2行。 ② 扫描产生式右部的每一符号 I.若某非终结符标志为“是”,则删去该非终结符,若进而使得某产生式右部为空,则置该式左部的非终结符标志为“是”,并删除该非终结符为左部的所有产生式,如“S”。 II.若某非终结符标志为“否”,则删去该产生式,若使得左部为该非终结符的产生式都被删去,则置该非终结符标志为“否”,例如“C”。 ③ 重复上述步骤,直到扫描完一遍文法的产生式,非终结符标志位不再改变为止。,6/20,FIRST集合,结合本例,由①中(I)、(II)得知例中对应非终结符D的标志改为“否”,对应非终结符A、B的标志改为“是”。经过①中(I)、(II)两步后文法中的产生式只剩下:S→AB和C→AD,也就是只剩下右部全是非终结符串的产生式。再由②中的(I)步扫描到产生式S→AB时,在数组中A、B对应的标志都为“是”,删去后S的右部变为空,所以S对应标志置为“是”。最后由②中的(II)扫描到产生式C→AD时,其中A对应的标志为“是”,D对应的标志是“否”,删去该产生式后,再无左部为C的产生式,所以C的对应标志改为“否”。结果如下表。,7/20,FIRST集合,(2)绘制文法关系图 按下述步骤绘制文法关系图。 ① 每个文法符号对应图中一个结点,对应终结符的结点时用符号本身标记,对应非终结符A的结点用其FIRST(A)标记。 ② 若有产生式A→αXβ,且α ε,则从对应A的结点到对应X的结点连一条箭弧。,8/20,FIRST集合,(3)求解FIRST 按下述步骤从关系图求解FIRST。 ① 凡是从FIRST(A)结点有路径可到达的终结符点所标记的终结符为FIRST(A)的成员。 ② 若某非终结符能够 ε,则将ε加入该非终结符的FIRST集中。 至此,可以求得本例的结果: FIRST(S)={b,a,ε} FIRST(A)={b,ε} FIRST(B)={a,ε} FIRST(C)={a,b,c} FIRST(D)={a,c},,9/20,FIRST集合,二、根据通用算法构造FIRST (1)文法符号的FIRST 对于文法中的每一个符号X(VN∪VT),构造FIRST(X)时,只要连续使用下列步骤,直至FIRST集不再扩大为止。 步骤1.若XVT,则FIRST(X)={X}; 步骤2.若XVN,则考查以X为左部的每一条产生式: ① 若X→是一条产生式,则FIRST(X); ② 若X→Y1Y2…Yn是产生式: (I) 若Y1, …, Yi-1都VN且都能 (其中1≤i≤n),则FIRST(Y1)-{},FIRST(Y2)-{},…,FIRST(Yi-1)-{}和FIRST(Yi)都包含在FIRST(X)中; (II) 若所有的FIRST(Yi)均能 ,i=1, 2, …, k,则把加到FIRST(X)中。,10/20,FIRST集合,,11/20,FIRST集合,【例】已知文法G[S]如下: S→aAd A→BC B→b |ε C→c |ε 求各个非终结符的FIRST集。 【解】由上述算法,容易求各个FIRST集: FIRST(S)={a} FIRST(B)={b,ε} FIRST(C)={c,ε} FIRST(A)={b,c,ε},12/20,FIRST集合,(2)文法符号串的FIRST 对文法G的任一符号串,可按下图所示的步骤构造FIRST ()。,再看上例G[S],求产生式右部的符号串的FIRST集。 【解】由上图,容易求各个FIRST集: FIRST(aAd)={a} FIRST(BC)={b,c,ε} FIRST(b)={b} FIRST(c)={c},13/20,FIRST集合,注意:在使用通用算法法求解FIRST的时候,如果求解过程中存在递归循环现象,将使求解过程陷入无限循环中。 【例】若文法G[S]为: S→BCc | gDB B→ε| bCDE C→DSB | cS D→ε| dD E→gSf | c 容易看出: FIRST(S) =(FIRST(B)-{ε})∪FIRST(C)∪{g} =(FIRST(B)-{ε})∪(FIRST(D)-{ε})∪FIRST(S)∪{c}∪{g} 很明显,存在循环求解过程,求FIRST(S)时,需要先求FIRST(C),而若求解FIRST(C)又需要先求FIRST(S)。所以,此文法不适宜应用通用算法。,14/20,FIRST集合,【结论】 对于所有形如A→1|2|…|n的产生式,若存在 FIRST(i)∩FIRST(j)= (ij) 则能够根据不同输入符号唯一确定候选式i,即不存在回溯。此时,当要求使用A去匹配输入串时,能够根据输入符号a准确指派某一个候选式前去执行任务,这个候选式就是FIRST中含a的那个i。,15/20,实例分析,【例】已知文法G[S]定义如下: S→Ap|Bq A→a|cA B→b|dB 考查输入串w=ccap是否合法。 【解】所谓考查输入串ccap是否合法,就是看能否由文法开始符号导出符号串。 首先,可由上面介绍的方法求得文法的各个符号(串的)FIRST。 文法符号的FIRST: FIRST(S)={a,c,b,d} FIRST(A)={a,c} FIRST(B)={b,d} FIRST(p)={p} FIRST(q)={q} FIRST(a)={a} FIRST(c)={c} FIRST(b)={b} FIRST(d)={d},16/20,FIRST集合,文法符号串的FIRST: FIRST(Ap)={a,c} FIRST(Bq)={b,d} FIRST(a)={a} FIRST(cA)={c} FIRST(b)={b} FIRST(dB)={d} 显然,各个候选式的FIRST互不相交,符合要求: FIRST(Ap)∩FIRST(Bq) = {a,c}∩{b,d} = FIRST(a) ∩FIRST(cA) = {a}∩{c} = FIRST(b) ∩FIRST(dB) = {b}∩{d} = 因此,可以很容易得到符号串w=ccap的推导过程: S  Ap  cAp  ccAp  ccap,不存在回溯现象!,17/20,提取左公共因子,不过,有时候一个文法并不一定能满足“候选式的首符号集并非两两不相交。” 譬如下面的例子。 【例】已知文法G[A]定义如下: A→ad …………① A→Bc …………② B→aA …………③ B→bB …………④,18/20,提取左公共因子,【解】利用上述算法,不难求得各个符号串的FIRST: FIRST(ad)={a} FIRST(Bc)={a,b} FIRST(aA)={a} FIRST(bB)={b} 不难看出,存在候选式的FIRST相交的情况: FIRST(ad)∩FIRST(Bc) = {a}∩{a,b} ={a} 所以,本文法存在回溯现象,不适于应用确定的自顶向下分析法。那么,有没有什么办法能够对文法进行一定的预处理,从而达到所有候选式的FIRST集两两不相交呢?答案是肯定的,通过提取左公共因子即能实现此目的!,19/20,提取左公共因子,所谓左公共因子,是指形如A→B和A→C的产生式。 假定关于A的规则是: A→1| 2 |……| n 那么,可以把上述规则改写为下面的形式,以提取左公共因子: A→A′ A′→ 1| 2 |……|n 经过反复提取左公共因子,就能够把每个非终结符的所有候选式的FIRST变成两两不相交的。,20/20,提取左公共因子,例如,对于上例中的文法G[A],将③、④代入②,就可得 A→ad|aAc …………存在左公共因子a A→bBc B→aA|bB 因此,提取左公共因子后的文法G′[A]消除了回溯: A→aA′ A′→d| Ac A→bBc B→aA|bB,

展开阅读全文

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39658966/article/details/117100557

智能推荐

基于springboot+vue的奶茶店在线管理系统_spring boot+vue线上奶茶订单-程序员宅基地

文章浏览阅读840次,点赞15次,收藏17次。管理员可以通过选择商品管理,管理相关的商品信息记录,比如进行查看商品信息标题,修改商品信息来源等操作,商品管理界面设计如图5-2所示。_spring boot+vue线上奶茶订单

c++变长数组实现学生成绩最大最小平均值统计_可变长模板求平均值-程序员宅基地

文章浏览阅读550次。友元函数标准输入输出重载,变长数组主要是尝新体验了一把vector,各种碰壁,尤其越界问题。时间长没写代码好多细节问题。假期多练习吧。具体细节都在注释里整体思路就是设计学生类包含姓名和成绩。输入和输出用重载。计算部分用普通函数。储存用vector,用指针传递。代码简单,注意细节即可。#include<iostream>#include <string>#include<vector>using namespace std;class Student_可变长模板求平均值

@DateTimeFormat和@JsonFormat使用详解及注意事项_java 实体类 @jsonformat-程序员宅基地

文章浏览阅读434次。DateTimeFormat适用于get请求方式且参数传递方式为路径请求参数的方式和forn表单的方式。而@JsonFormat适用于post方式的参数传递。@DateTimeFormat的pattern不会实际影响转化后的Date的实际格式。而@JsonFormat会。@DateTimeFormat要求传递的参数格式必须和接收指定的格式一致。_java 实体类 @jsonformat

Android多线程:IntentService用法&源码分析_开启子线程的服务:intentservice-程序员宅基地

文章浏览阅读200次。前言多线程的应用在Android开发中是非常常见的,常用方法主要有:继承Thread类实现Runnable接口AsyncTaskHandlerHandlerThreadIntentService今天,我将全面解析多线程其中一种常见用法:IntentService目录1. 定义IntentService是Android里_开启子线程的服务:intentservice

电子海图开发第十五篇 墨卡托海图投影(共一百篇)_电子海图 二次开发 核心问题-程序员宅基地

文章浏览阅读2.2k次。一、墨卡托投影墨卡托投影,又称正轴等角圆柱投影,由荷兰地图学家墨卡托(G.Mercator)于1569年创拟。假设地球被套在一个圆柱中,赤道与圆柱相切,然后在地球中心放一盏灯,把球面上的图形投影到圆柱体上,再把圆柱体展开,就形成以一幅墨卡托投影的世界地图(如下图)。因其等角特性,广泛应用与航空、航海中。墨卡托投影,是正轴等角圆柱投影,圆柱投影的一种,为地图投影方法中影响最大的投影。假设地球被围在一中空的圆柱里,其基准纬线(赤道)与圆柱相切,然后再假想地球中心有一盏灯,把球面上的图形投影到..._电子海图 二次开发 核心问题

Junit - 断言方法(Assert Methods)_junit断言-程序员宅基地

文章浏览阅读6.8k次,点赞7次,收藏33次。Junit 4 断言方法允许检查测试方法的期望结果值和真实返回值。Junit的org.junit.Assert类提供了各种断言方法来写junit测试。这些方法被用来检查方法的真实结果值和期望值。下列一些有用的断言方法列表:Junit 4 Assert Methods Method Description assertNull(java.lang.Object object) ..._junit断言

随便推点

bootstrap gutter 详解_bootstrap gutters-程序员宅基地

文章浏览阅读3k次。1.首先 gutter 是针对的是padding 他是grid 的封装当我们一拿到这样的代码的时候,在row里面,我们一定会存在一些的疑问,那就是这是啥。px-lg-2 这是什么 mx-lg-2这是什么。1.p对应的是padding2.m对应的是marginx和y 分辨对应是左右 上下 不同dom的设置对应它自己,lg 就是视图的大小目前对于5.0中的g*开头的,4.5中是没有的详细的教程请查看https://www.orchome.com/..._bootstrap gutters

VC项目配置基础 VC6.0-VC2005_项目属性-》配置属性-》c/c++-》预处理器-》预处理器定义中添加have_remote-程序员宅基地

文章浏览阅读703次。摘自 范晓特ID:phunxm一.预处理宏1. 通用宏VC6.0 中:Project Setting -> C/C++ -> Preprocessor definitionsVC2005 中:项目属性 -> 配置属性 -> C/C++ -> 预处理器定义 WIN32 :指明是 Window 32 位系统的编译器,一般用作平台识别。_MBCS/_UNICODE_项目属性-》配置属性-》c/c++-》预处理器-》预处理器定义中添加have_remote

HbuilderX安装及应用插件_hbuilder x截图插件-程序员宅基地

文章浏览阅读3.1k次,点赞5次,收藏6次。uni-app开发初步,HBuliderX的安装_hbuilder x截图插件

CDH6官方文档中文系列(3)----Cloudera安装指南(安装CM和CDH)_cloudera devsh_student_erercisemanual-程序员宅基地

文章浏览阅读1.4k次。Cloudera安装指南最近在学习cdh6的官方文档,网上也比较难找到中文的文档。其实官方英文文档的阅读难度其实并不是很高,所以在这里在学习官方文档的过程中,把它翻译成中文,在翻译的过程中加深学习了解,并分享出来和大家一起学习。中文内容是本人的渣渣英文水平结合有道词典,谷歌翻译的结果,文中部分词语可能翻译的并不准确,希望大家多多提出意见,共同进步。cdh6的官方中文文档系列长期更新,最后目标整理成gitbook,同大家交流学习。最后,如果你觉得本文对你有用,希望点个赞给作者一点鼓励哈。与其感_cloudera devsh_student_erercisemanual

字节序有大端和小端之分_字节序有没有可能是大端和小端-程序员宅基地

文章浏览阅读4.1k次。(1)对于位域结构中的变量来说,其长度不能跨越字节,也就是说不能超过8位。当然如果设置空白位(无名变量,仅仅用作占位的)是没有这个限制的。如果一个字节剩下的位长度不够一个位域,那么从下个字节开始,也可有意置某个位域从下个字节开始。例如:struct bits4_5{ //一个从到小的存放顺序结构体 unsigned : 10; //从位15向下跳到位5 unsigned_字节序有没有可能是大端和小端

IAP内购破解原理_ios内购插件时怎样实现中间人攻击的-程序员宅基地

文章浏览阅读7.4k次。今年3月初写过一篇《iO平台游戏安全小议》,到现今已有7个月了。在这段时间内,iOS平台上的安全问题也产生了不小的变化。从作弊方式来说,从以前稍有门槛的手工操作(命令行操作)发展成了傻瓜式的只需要点击按钮的今年3月初写过一篇《iO平台游戏安全小议》,到现今已有7个月了。在这段时间内,iOS平台上的安全问题也产生了不小的变化。从作弊方式来说,从以前稍有门槛的手工操作(命令行操作)发展_ios内购插件时怎样实现中间人攻击的

推荐文章

热门文章

相关标签