导航:首页 > 源码编译 > 编译原理产生式的消除化简

编译原理产生式的消除化简

发布时间:2023-04-17 07:51:20

‘壹’ 编译原理-LL1文法详细讲解

我们知道2型文法( CFG ),它的每个产生式类型都是 α→β ,其中 α ∈ VN , β ∈ (VN∪VT)*。

例如, 一个表达式的文法:

最终推导出 id + (id + id) 的句子,那么它的推导过程就会构成一颗树,即 CFG 分析树:

从分析树可以看出,我们从文法开始符号起,不断地利用产生式的右部替换产生式左部的非终结符,最终推导出我们想要的句子。这种方式我们称为自顶向下分析法。

从文法开始符号起,不断用非终结符的候选式(即产生式)替换当前句型中的非终结符,最终得到相应的句子。
在每一步推导过程中,我们需要做两个选择:

因为一个句型中,可能存在多个非终结符,我们就不确定选择那一个非终结符进行替换。
对于这种情况,我们就需要做强制规定,每次都选择句型中第一个非终结符进行替换(或者每次都选择句型中最后一个非终结符进行替换)。

自顶向下的语法分析采用最左推导方式,即总是选择每个句型的最左非终结符进行替换。

最终的结果是要推导出一个特定句子(例如 id + (id + id) )。
我们将特定句子看成一个输入字符串,而每一个非终结符对应一个处理方法,这个处理方法用来匹配输入字符串的部分,算法如下:

方法解析:

这种方式称为递归下降分析( Recursive-Descent Parsing ):

当选择的候选式不正确,就需要回溯( backtracking ),重新选择候选式,进行下一次尝试匹配。因为要不断的回溯,导致分析效率比较低。

这种方式叫做预测分析( Predictive Parsing ):

要实现预测分析,我们必须保证从文法开始符号起,每一个推导过程中,当前句型最左非终结符 A 对于当前输入字符 a ,只能得到唯一的 A 候选式。

根据上面的解决方法,我们首先想到,如果非终结符 A 的候选式只有一个以终结符 a 开头候选式不就行了么。
进而我们可以得出,如果一个非终结符 A ,它的候选式都是以终结符开头,并且这些终结符都各不相同,那么本身就符合预测分析了。

这就是S_文法,满足下面两个条件:

例子:

这就是一个典型的S_文法,它的每一个非终结符遇到任一终结符得到候选式是确定的。如 S -> aA | bAB , 只有遇到终结符 a 和 b 的时候,才能返回 S 的候选式,遇到其他终结符时,直接报错,匹配不成功。

虽然S_文法可以实现预测分析,但是从它的定义上看,S_文法不支持空产生式(ε产生式),极大地限制了它的应用。

什么是空产生式(ε产生式)?

例子

这里 A 有了空产生式,那么 S 的产生式组 S -> aA | bAB ,就可以是 a | bB ,这样 a , bb , bc 就变成这个文法 G 的新句子了。

根据预测分析的定义,非终结符对于任一终结符得到的产生式是确定的,要么能获取唯一的产生式,要么不匹配直接报错。

那么空产生式何时被选择呢?

由此可以引入非终结符 A 的后继符号集的概念:
定义: 由文法 G 推导出来的所有句型,可以出现在非终结符 A 后边的终结符 a 的集合,就是这个非终结符 A 的后继符号集,记为 FOLLOW(A) 。

因此对于 A -> ε 空产生式,只要遇到非终结符 A 的后继符号集中的字符,可以选择这个空产生式。
那么对于 A -> a 这样的产生式,只要遇到终结符 a 就可以选择了。

由此我们引入的产生式可选集概念:
定义: 在进行推导时,选用非终结符 A 一个产生式 A→β 对应的输入符号的集合,记为 SELECT(A→β)

因为预测分析要求非终结符 A 对于输入字符 a ,只能得到唯一的 A 候选式。
那么对于一个文法 G 的所有产生式组,要求有相同左部的产生式,它们的可选集不相交。

在 S_文法基础上,我们允许有空产生式,但是要做限制:

将上面例子中的文法改造:

但是q_文法的产生式不能是非终结符打头,这就限制了其应用,因此引入LL(1)文法。

LL(1)文法允许产生式的右部首字符是非终结符,那么怎么得到这个产生式可选集。
我们知道对于产生式:

定义: 给定一个文法符号串 α , α 的 串首终结符集 FIRST(α) 被定义为可以从 α 推导出的所有串首终结符构成的集合。

定义已经了解清楚了,那么该如何求呢?
例如一个文法符号串 BCDe , 其中 B C D 都是非终结符, e 是终结符。

因此对于一个文法符号串 X1X2 … Xn ,求解 串首终结符集 FIRST(X1X2 … Xn) 算法:

但是这里有一个关键点,如何求非终结符的串首终结符集?

因此对于一个非终结符 A , 求解 串首终结符集 FIRST(A) 算法:

这里大家可能有个疑惑,怎么能将 FIRST(Bβ) 添加到 FIRST(A) 中,如果问文法符号串 Bβ 中包含非终结符 A ,就产生了循环调用的情况,该怎么办?

对于 串首终结符集 ,我想大家疑惑的点就是,串首终结符集到底是针对 文法符号串 的,还是针对 非终结符 的,这个容易弄混。
其实我们应该知道, 非终结符 本身就属于一个特殊的 文法符号串
而求解 文法符号串 的串首终结符集,其实就是要知道文法符号串中每个字符的串首终结符集:

上面章节我们知道了,对于非终结符 A 的 后继符号集 :
就是由文法 G 推导出来的所有句型,可以出现在非终结符 A 后边的终结符的集合,记为 FOLLOW(A) 。

仔细想一下,什么样的终结符可以出现在非终结符 A 后面,应该是在产生式中就位于 A 后面的终结符。例如 S -> Aa ,那么终结符 a 肯定属于 FOLLOW(A) 。

因此求非终结符 A 的 后继符号集 算法:

如果非终结符 A 是产生式结尾,那么说明这个产生式左部非终结符后面能出现的终结符,也都可以出现在非终结符 A 后面。

我们可以求出 LL(1) 文法中每个产生式可选集:

根据产生式可选集,我们可以构建一个预测分析表,表中的每一行都是一个非终结符,表中的每一列都是一个终结符,包括结束符号 $ ,而表中的值就是产生式。
这样进行语法推导的时候,非终结符遇到当前输入字符,就可以从预测分析表中获取对应的产生式了。

有了预测分析表,我们就可以进行预测分析了,具体流程:

可以这么理解:

我们知道要实现预测分析,要求相同左部的产生式,它们的可选集是不相交。
但是有的文法结构不符合这个要求,要进行改造。

如果相同左部的多个产生式有共同前缀,那么它们的可选集必然相交。
例如:

那么如何进行改造呢?
其实很简单,进行如下转换:

如此文法的相同左部的产生式,它们的可选集是不相交,符合现预测分析。

这种改造方法称为 提取公因子算法

当我们自顶向下的语法分析时,就需要采用最左推导方式。
而这个时候,如果产生式左部和产生式右部首字符一样(即A→Aα),那么推导就可能陷入无限循环。
例如:

因此对于:

文法中不能包含这两种形式,不然最左推导就没办法进行。

例如:

它能够推导出如下:

你会惊奇的发现,它能推导出 b 和 (a)* (即由 0 个 a 或者无数个 a 生成的文法符号串)。其实就可以改造成:

因此消除 直接左递归 算法的一般形式:

例如:

消除间接左递归的方法就是直接带入消除,即

消除间接左递归算法:

这个算法看起来描述很多,其实理解起来很简单:

思考 : 我们通过 Ai -> Ajβ 来判断是不是间接左递归,那如果有产生式 Ai -> BAjβ 且 B -> ε ,那么它是不是间接左递归呢?
间接地我们可以推出如果一个产生式 Ai -> αAjβ 且 FIRST(α) 包括空串ε,那么这个产生式是不是间接左递归。

‘贰’ 编译原理笔记9:语法分析树、语法树、二义性的消除

语法分析树和语法树不是一种东西 。习惯上,我们把前者叫做“具体语法树”,其能够体现推导的过程;后者叫做“抽象语法树”,其不体现过程,只关心最后的结果。

语法分析树是语言推导过程的图形化表示方法。这种表示方法反映了语言的实质以及语言的推导过程。

定义:对于 CFG G 的句型,分析树被定义为具有下述性质的一棵树:

推导,有最左推导和最右推导,这两种推导方式在推导过程中的分析树可能不同,但因最终得到的句子是相同的,所以最终的分析树是一样的。

分析树能反映句型的推导过程,也能反映句型的结构。然而实际上,我们往往不关心推导的过程,而只关心推导的结果。因此,我们要对 分析树 进行改造,得到 语法树 。语法树中全是终结符,没有非终结符。而且语法树中没有括号

定义:

说白了,语法树这玩意,就一句话: 叶子全是操作数,内部全是操作符 ,树里没有非终结符也不能有括号。

语法树要表达的东西,是操作符(运算)作用于操作数(运算对象)

举俩例子吧:

【例】: -(id+id) 的语法树:

【例】:-id+id 的语法树:

显然,我们从上面这两个语法树中,直接就能观察出来它们的运算顺序。

【例】:句型 if C then s1 else s2

二义性问题:一个句子可能对应多于一棵语法树。

【例】: 设文法 G: E → E+E | E*E | (E) | -E | id

则,句子 id+id*id、id+id+id 可能的分析树有:

在该例中,虽然 id+id+id 的 “+” 的结合性无论左右都不会影响结果。但万一,万一“+”的含义变成了“减法”,那么左结合和右结合就会引起很大的问题了。

我们在这里讲的“二义性”的“义”并非语义——我们现在在学习的内容是“语法分析器”,尚未到需要研究语言背后含义的阶段。

我们现在讲的“二义性”指的是一个句子对应多种分析树。

二义性的体现,是文法对同一句子有不止一棵分析树。这种问题由【句子产生过程中的某些推导有多于一种选择】引起。悬空 else 问题就可以很好地体现这种【超过一种选择】带来的二义性问题,示例如下。

看下面这么个例子。。

(其实,我感觉这个其实比较像是“说话大喘气”带来的理解歧义问题。。。)上面的产生式中并没体现出来该咋算分一块,所以两种完全不同的句子结构都是合法的。

二义性问题是有救的,大概有以下这三种办法:

这些办法的核心,其实都是将优先级和结合性说明白。

核心:把优先级和结合性说明白

既然要说明白,那就不能让一个非终结符可以直接在当次推导中能推出会带来优先级和结合性歧义的东西。(对分析树的一个内部节点,不会有出现在其下面的分支是相同的非终结符的情况。如果有得选,那就有得歧义了。没得选才能确定地一路走到黑)

改写为非二义文法的二义文法大概有下面这几个特点:

改写的关键步骤:

【例】改写下面的二义文法为非二义文法。图右侧是要达成的优先级和结合性

改写的核心其实就两句话:

所以能够得到非终结符与运算的对应关系(因为不同的运算有不同的优先级,我们想要引入多个优先级就要引入多个新的非终结符。这样每个非终结符就可以负责一个优先级的运算符号,也就是说新的非终结符是与运算有关系的了。因此这里搞出来了“对应关系”四个字)如下:

优先级由低到高分别是 +、 、-,而距离开始符号越近,优先级越低。因此在这里的排序也可以+ -顺序。每个符号对应一层的非终结符。根据所需要的结合性,则可确定是左递归还是右递归,以确定新的产生式长什么样子

【例】:规定优先级和结合性,写出改写的非二义文法

我们已经掌握了一种叫做【改写】的工具,能让我们消除二义性。接下来我们就要用这个工具来尝试搞搞悬空 else 问题!

悬空 else 问题出现的原因是 then 数量多于 else,让 else 有多个可以结合的 then。在二义文法中,由于选哪两个 then、else 配对都可以,故会引起出现二义的情况。在这里,我们规定 else 右结合,即与左边最靠近的 then 结合。

为改写此文法,可以将 S 分为完全匹配(MS)和不完全匹配(UMS)两类。在 MS 中体现 then、else 个数相等即匹配且右结合;在UMS 中 then、else 不匹配,体现 else 右结合。

【例】:用改写后的文法写一个条件语句

经过检查,无法再根据文法写出其他分析树,故已经消除了二义性

虽然二义文法会导致二义性,但是其并非一无是处。其有两个显着的优点:

在 Yacc 中,我们可以直接指定优先级、结合性而无需自己重写文法。

left 表示左结合,right 表示右结合。越往下的算符优先级越高。

嗯就这么简单。。。

我们其实可以把语言本身定义成没有优先级和结合性的。。然后所有的优先、结合都交由括号进行控制,哪个先算就加括号。把一个过程的结束用明确的标志标记出来。

比如在 Ada 中:

在 Pascal 中,给表达式加括号:

‘叁’ 编译原理问题,求解决

去问下医生是怎么回事吧

‘肆’ 编译原理中文法变换的特殊方法有哪些

说明方法
常见的说明方法
常见的说明方法有举事例、分类别、列数据、作比较、画图表、下定义、作诠释、打比方、摹状貌、引资料等10种。写说明文要根据说明对象的特点及写作目的,选用最佳方法。下面分别加以说明。

(1)举例子。举出实际事例来说明事物,使所要说明的事物具体化,以便读者理解,这种说明方法叫举例法。如:

一般人总以为,年龄稍大,记忆能力就一定要差,其实不然,请看实验结果:国际语言学会曾对9至18岁的青年与35岁以上的成年人学习世界语作过一个比较,发现前者就不如后者的记忆力好。这是因为成年人的知识、经验比较丰富,容易在已有的知识基础上,建立广泛的联系。这种联系,心理学上称为“联想”。人的记忆就是以联想为基础的,知识经验越丰富,越容易建立联想,记忆力就会相应提高。马克思五十多岁时开始学俄文,六个月后,他就能津津有味地阅读着名诗人与作家普希金、果戈里和谢德林等人的原文着作了。这是由于语言知识丰富,能够通晓很多现代和古代的语言的缘故。

这段文章要说明的是:年龄稍大,记忆力不一定就差。为了说明这一点,作者先提供了实验结果,又分析了原因。到此为止,未尝不可,但不够具体,也缺乏说服力,于是,又举出了一个实例:马克思在五十多岁的时候,只用六个月时间便精通了俄语。这样一来,内容具体了,说服力增强了。

说明文中的举事例的说明方法和议论文中的例证法,都可以起到使内容具体、加强说服力的作用。但二者又有区别。议论文中的事例,是用来证明观点的,说明文的事例,是用来介绍知识的。

运用举事例的说明方法说明事物或事理,一要注意例子的代表性,二要注意例子的适量性。

(2)分类别。将被说明的对象,按照一定的标准划分成不同的类别,一类一类地加以说明,这种说明方法,叫分类别。

分类别是将复杂的事物说清楚的重要方法。

运用分类别方法要注意分类的标准,一次分类只能用同一个标准,以免产生重叠交叉的现象。例如:“图书馆的藏书有中国的、古典的、外国的、科技的、文学的、现代的以及政治经济方面的等。”这里用了不只一个标准,所以表达不清。正确的说法应该是:

图书馆的藏书,按国别分,有中国的、外国的;按时代分,有古典的、现代的;按性质分,有科技的、文学的以及政治经济方面的等。

这样,每次分类只用一个标准,就眉目清楚了。

有的事物的特征、本质需要分成几点或几个方面来说,也属于分类别。

注意,运用分类别方法,所列举的种类不能有遗漏。

(3)列数据。为了使所要说明的事物具体化,还可以采用列数据的方法,以便读者理解。需要注意的是,引用的数字,一定要准确无误,不准确的数字绝对不能用,即使是估计的数字,也要有可靠的根据,并力求近似。

(4)作比较。说明某些抽象的或者是人们比较陌生的事物,可以用具体的或者大家已经熟悉的事物和它比较,使读者通过比较得到具体而鲜明的印象。事物的特征也往往在比较中显现出来。

在作比较的时候,可以是同类相比,也可以是异类相比,可以对事物进行“横比”,也可以对事物进行“纵比”。

(5)画图表。为了把复杂的事物说清楚,还可以采用图表法,来弥补单用文字表达的缺欠,对有些事物解说更直接、更具体。

(6)下定义。用简明的语言对某一概念的本质特征作规定性的说明叫下定义。下定义能准确揭示事物的本质,是科技说明文常用的方法。

下定义的时候,可以根据说明的目的需要,从不同的角度考虑。有的着重说明特性,如关于“人”的定义;有的着重说明作用,如关于“肥料”的定义;有的既说明特性又说明作用,如关于“统筹方法”和“应用科学”的定义。

①人是能制造工具并使用工具进行劳动的高级动物。

②肥料是能供给养分使植物生长的物质。

③统筹方法,是一种安排工作进程的数学方法。

④工程技术的科学叫做应用科学,它是应用自然科学的基础理论来解决生产实践中出现的问题的学问。

无论从什么角度考虑,无论采用什么方式,只要是下定义,就必须揭示事物的本质,只有这样的定义才是科学的。比如,有人说:“人是两足直立的动物。”这个定义就是不科学的,因为它没能揭示事物的本质。“人是能制造工具并使用工具进行劳动的高级动物。”这才是科学的定义,因为它揭示了人的本质。

(7)作诠释。从一个侧面,就事物的某一个特点做些解释,这种方法叫诠释法。

定义法和诠释法常采用“某某是什么”的语言形式。形式相同,如何区分呢?一般来说,“是”字两边的话能够互换,就是定义;如果不能互换,就是诠释。

例如,“人是能制造工具并使用工具进行劳动的高级动物”这句话,改成“能制造工具并使用工具进行劳动的高级动物是人”,意思不变。“雪是在云中形成的一种固态降水物”这句话,如果改为“云中形成的固态降水物是雪”就不成。由此可以辨别,前一句是定义说明,后一句是诠释说明。

(8)打比方。利用两种不同事物之间的相似之处作比较,以突出事物的性状特点,增强说明的形象性和生动性的说明方法叫做打比方。

说明文中的打比方的说明方法,同修辞格上的比喻是一致的。不同的是,比喻修辞有明喻、暗喻、和借喻,而说明多用明喻和暗喻,借喻则不宜使用。

(9)摹状貌。为了使被说明对象更形象、具体,可以进行状貌摹写,这种说明方法叫摹状貌。

(10)引资料。为了使说明的内容更充实具体,可以引资料说明。引资料的范围很广,可以是经典着作,名家名言,公式定律,典故谚语等。

一篇说明文单用一种说明方法很少,往往综合运用多种说明方法。采用什么说明方法,一方面服从内容的需要,另一方面作者有选择的自由。是采用一种说明方法,还是采用多种说明方法,是采用这种说明方法,还是那种说明方法,可以灵活,不是一成不变的。
参考资料:http://ke..com/view/118461.html

‘伍’ 用C/C++语言编写方法的化简和改造程序,实现以下功能:无用符号和无用产生式的删除

又是作业呀。。。。自己做呗!有问题再求教!

‘陆’ 编译原理正则表达式化简

你好,语言L={a}{a,b}∗({ϵ}∪({.,_}{a,b}{a,b}∗))L={a}{a,b}

({ϵ}∪({.,_}{a,b}{a,b}

))
这个语言是指,由a开头,后接任意长度的a、b串,然后再接空串(代表结束)。或者是接以.或_开头的,后接长度大于等于1的a、b串。

正则表达式(Regular Expression, RE)是一种用来描述正则语言的更紧凑的表示方法。

‘柒’ 编译原理 LR0文法的判定

设G1、G2是两个文法,若L(G1)=L(G2)
,则称G1与G2等价,记作G1≡G2。
即:文法的等价性是指他们所定义的语言是一样的。
文法的化简是指消除如下无用产生式:

删除
A->A
形式数橡的产生式(自定己);

删除不能从其推导出终结符串的产生式(不终结差旦);

删除在推导中永不使用的产生式(不可用虚毕扰)。

‘捌’ 请教编译原理中的产生式的含义

这个问题中的一个产生式E’→+TE’|e,应该是E->+TE’|ε这样吧!否则不可能获得如此结果.关于求follow集合,龙书中说得很清楚,依据三条规则即可:1、任何FOLLOW(S)都包含输入终止符号,其中S是开始符号.适用该条,因此FOLLOW(E’)中包含终止符号#.2、如果存在产生式,A->αBβ,则将FIRST(β)中除ε以外的符号都放入FOLLOW(B)中.该条不适用,因为在上述所有产生式中不存在形如E‘->αE’β这样的产生式.3、如果存在产生式,A->αB,或A->αBβ,其中FIRST(β)中包含ε,则将FOLLOW(A)中的所有符号都放入FOLLOW(B)中.适用该条,因为存在这样的产生式E->+TE’,使得FOLLOW(E’)=FOLLOW(E)成立.而FOLLOW(E)适用上述第二条,根据产生式F→(E)可求得为FOLLOW(E)={#,)}.综上,FOLLOW(E’)=FOLLOW(E)={#,)}.

‘玖’ 编译原理左递归消除

这些题很难啊!!!
都有间接左递归。要先变成直接左递归,然后消除掉。
--------------------
G3.1
S->SA|Ab|b|c
A->Bc|a
B->Sb|b
--------------------
间接左递归转直接左递归
B代入A:A ->(Sb|b)c|a -> Sbc|bc|a
A代入S:S -> S(Sbc|bc|a)|(Sbc|bc|a)b|b|c -> SSbc|Sbc|Sa|Sbcb|bcb|ab|b|c
消除直接左递归
S->bcbS'|abS'|bS'|cS'
S'->SbcS'|bcS'|aS'|bcbS'|ε
S'还是有直接左递归,继续消除
S'->bcS'T|aS'T|bcbS'T
T->bcS'T|ε
最后,这题答案就是S,S',T的产生式

--------------------
下面两题更难了,上一题反复代入还能把其他非终结符消掉,下面两个文法都是最后代入还剩下两个非终结符反复迭代,佛了!
G3.2
E->ET+|T

T->TF*|F

F->E|i
--------------------
F代入T: T->T(E|i)*|(E|i)->TE*|Ti*|E|i
T代入E:

--------------------
G3.3
S->V_1

V_1->V_2|V_1 2 V_2

V_2->V_3|V_2 + V_3
V_3->V_1 * |(
这些字母我都不认识了,换一下
S->A|SiA
A->B|A+B
B->S*|(
--------------------
B代入A:A->(S*|()|A+(S*|()->S*|(|A+S*|A+(
A代入S:

--------------------

‘拾’ 编译原理 题目

习题一、单项选择题
1、将编译程序分成若干个“遍”是为了 。
a.提高程序的执行效率
b.使程序的结构更加清晰
c.利用有限的机器内存并提高机器的执行效率
d.利用有限的机器内存但降低了机器的执行效率
2、构造编译程序应掌握 。
a.源程序 b.目标语言
c.编译方法 d.以上三项都是
3、变量应当 。
a.持有左值 b.持有右值
c.既持有左值又持有右值 d.既不持有左值也不持有右值
4、编译程序绝大多数时间花在 上。
a.出错处理 b.词法分析
c.目标代码生成 d.管理表格
5、 不可能是目标代码。
a.汇编指令代码 b.可重定位指令代码
c.绝对指令代码 d.中间代码
6、使用 可以定义一个程序的意义。
a.语义规则 b.词法规则
c.产生规则 d.词法规则
7、词法分析器的输入是 。
a.单词符号串 b.源程序
c.语法单位 d.目标程序
8、中间代码生成时所遵循的是- 。
a.语法规则 b.词法规则
c.语义规则 d.等价变换规则
9、编译程序是对 。
a.汇编程序的翻译 b.高级语言程序的解释执行
c.机器语言的执行 d.高级语言的翻译
10、语法分析应遵循 。
a.语义规则 b.语法规则
c.构词规则 d.等价变换规则
解答
1、将编译程序分成若干个“遍”是为了使编译程序的结构更加清晰,故选b。
2、构造编译程序应掌握源程序、目标语言及编译方法等三方面的知识,故选d。
3、对编译而言,变量既持有左值又持有右值,故选c。
4、编译程序打交道最多的就是各种表格,因此选d。
5、目标代码包括汇编指令代码、可重定位指令代码和绝对指令代码3种,因此不是目标代码的只能选d。
6、词法分析遵循的是构词规则,语法分析遵循的是语法规则,中间代码生成遵循的是语义规则,并且语义规则可以定义一个程序的意义。因此选a。
7、b 8、c 9、d 10、c
二、多项选择题
1、编译程序各阶段的工作都涉及到 。
a.语法分析 b.表格管理 c.出错处理
d.语义分析 e.词法分析
2、编译程序工作时,通常有 阶段。
a.词法分析 b.语法分析 c.中间代码生成
d.语义检查 e.目标代码生成
解答
1.b、c 2. a、b、c、e
三、填空题
1、解释程序和编译程序的区别在于 。
2、编译过程通常可分为5个阶段,分别是 、语法分析 、代码优化和目标代码生成。 3、编译程序工作过程中,第一段输入是 ,最后阶段的输出为 程序。
4、编译程序是指将 程序翻译成 程序的程序。 解答
是否生成目标程序 2、词法分析 中间代码生成 3、源程序 目标代码生成 4、源程序 目标语言
一、单项选择题
1、文法G:S→xSx|y所识别的语言是 。
a. xyx b. (xyx)* c. xnyxn(n≥0) d. x*yx*
2、文法G描述的语言L(G)是指 。
a. L(G)={α|S+ ⇒α , α∈VT*} b. L(G)={α|S*⇒α, α∈VT*}
c. L(G)={α|S*⇒α,α∈(VT∪VN*)} d. L(G)={α|S+ ⇒α, α∈(VT∪VN*)}
3、有限状态自动机能识别 。
a. 上下文无关文法 b. 上下文有关文法
c.正规文法 d. 短语文法
4、设G为算符优先文法,G的任意终结符对a、b有以下关系成立 。
a. 若f(a)>g(b),则a>b b.若f(a)<g(b),则a<b
c. a~b都不一定成立 d. a~b一定成立
5、如果文法G是无二义的,则它的任何句子α 。
a. 最左推导和最右推导对应的语法树必定相同
b. 最左推导和最右推导对应的语法树可能不同
c. 最左推导和最右推导必定相同
d. 可能存在两个不同的最左推导,但它们对应的语法树相同
6、由文法的开始符经0步或多步推导产生的文法符号序列是 。
a. 短语 b.句柄 c. 句型 d. 句子
7、文法G:E→E+T|T
T→T*P|P
P→(E)|I
则句型P+T+i的句柄和最左素短语为 。
a.P+T和i b. P和P+T c. i和P+T+i d.P和T
8、设文法为:S→SA|A
A→a|b
则对句子aba,下面 是规范推导。
a. SÞSAÞSAAÞAAAÞaAAÞabAÞaba
b. SÞSAÞSAAÞAAAÞAAaÞAbaÞaba
c. SÞSAÞSAAÞSAaÞSbaÞAbaÞaba
d. SÞSAÞSaÞSAaÞSbaÞAbaÞaba
9、文法G:S→b|∧(T)
T→T,S|S
则FIRSTVT(T) 。
a. {b,∧,(} b. {b,∧,)} c.{b,∧,(,,} d.{b,∧,),,}
10、产生正规语言的文法为 。
a. 0型 b. 1型 c. 2型 d. 3型
11、采用自上而下分析,必须 。
a. 消除左递归 b. 消除右递归 c. 消除回溯 d. 提取公共左因子
12、在规范归约中,用 来刻画可归约串。
a. 直接短语 b. 句柄 c. 最左素短语 d. 素短语
13、有文法G:E→E*T|T
T→T+i|i
句子1+2*8+6按该文法G归约,其值为 。
a. 23 B. 42 c. 30 d. 17
14、规范归约指 。
a. 最左推导的逆过程 b. 最右推导的逆过程
c. 规范推导 d. 最左归约的逆过程
[解答]
1、选c。
2、选a。
3、选c。
4、虽然a与b没有优先关系,但构造优先函数后,a与b就一定存在优先关系了。所以,由f(a)>g)(b)或f(a)<g(b)并不能判定原来的a与b之间是否存在优先关系:故选c。
5、如果文法G无二义性,则最左推导是先生长右边的枝叶:对于d,如果有两个不同的是了左推导,则必然有二义性。故选a。
6、选c。
7、由图2-8-1的语法树和优先关系可以看出应选b。

8、规范推导是最左推导,故选d。
9、由T→T,…和T→(… 得FIRSTVT(T))={(,,)};
由T→S得FIRSTVT(S)⊂FIRSTVT(T),而FIRSTVT(S)={b,∧,(};即
FIRSTVT(T)={b,∧,(,,}; 因此选c。
10、d 11、c 12、b 13、b 14、b
二、多项选择题
1、下面哪些说法是错误的 。
a. 有向图是一个状态转换图 b. 状态转换图是一个有向图
c.有向图是一个DFA d.DFA可以用状态转换图表示
2、对无二义性文法来说,一棵语法树往往代表了 。
a. 多种推导过程 b. 多种最左推导过程 c.一种最左推导过程
d.仅一种推导过程 e.一种最左推导过程
3、如果文法G存在一个句子,满足下列条件 之一时,则称该文法是二义文法。
a. 该句子的最左推导与最右推导相同
b. 该句子有两个不同的最左推导
c. 该句子有两棵不同的最右推导
d. 该句子有两棵不同的语法树
e.该句子的语法树只有一个
4、有一文法G:S→AB
A→aAb|ε
B→cBd|ε
它不产生下面 集合。
a. {anbmcndm|n,m≥0} b. {anbncmdm|n,m>0}
c. {anbmcmdn|n,m≥0} d. {anbncmdm|n,m≥0}
e. {anbncndn|n≥0}
5、自下而上的语法分析中,应从 开始分析。
a. 句型 b. 句子 c. 以单词为单位的程序
d. 文法的开始符 e. 句柄
6、对正规文法描述的语言,以下 有能力描述它。
a.0型文法 b.1型文法 c.上下文无关文法 d.右线性文法 e.左线性文法
解答 1、e、a、c 2、a、c、e 3、b、c、d 4、a、c 5、b、c 6、a、b、c、d、e
三、填空题
1、文法中的终结符和非终结符的交集是 。词法分析器交给语法分析器的文法符号一定是 ,它一定只出现在产生式的 部。
2、最左推导是指每次都对句型中的 非终结符进行扩展。
3、在语法分析中,最常见的两种方法一定是 分析法,另一是 分析法。
4、采用 语法分析时,必须消除文法的左递归。
5、 树代表推导过程, 树代表归约过程。
6、自下而上分析法采用 、归约、错误处理、 等四种操作。
7、Chomsky把文法分为 种类型,编译器构造中采用 和 文法,它们分别产生 和 语言,并分别用 和 自动机识别所产生的语言。
解答 1、空集 终结符 右
2、最左
3、自上而上 自下而上
4、自上而上
5、语法 分析
6、移进 接受
7、4 2 型 3型 上下文无关语言 正规语言 下推自动机 有限
四、判断题
1、文法 S→aS|bR|ε描述的语言是(a|bc)* ( )
R→cS
2、在自下而上的语法分析中,语法树与分析树一定相同。 ( )
3、二义文法不是上下文无关文法。 ( )
4、语法分析时必须先消除文法中的左递归。 ( )
5、规范归约和规范推导是互逆的两个过程。 ( )
6、一个文法所有句型的集合形成该文法所能接受的语言。 ( )
解答 1、对 2、错 3、错 4、错 5、错 6、错
五、简答题
1、句柄 2、素短语 3、语法树 4、归约 5、推导
[解答]
1、句柄:一个句型的最左直接短语称为该句型的句柄。
2、素短语:至少含有一个终结符的素短语,并且除它自身之外不再含任何更小的素短语。
3、语法树:满足下面4个条件的树称之为文法G[S]的一棵语法树。
①每一终结均有一标记,此标记为VN∪VT中的一个符号;
②树的根结点以文法G[S]的开始符S标记;
③若一结点至少有一个直接后继,则此结点上的标记为VN中的一个符号;
④若一个以A为标记的结点有K个直接后继,且按从左至右的顺序,这些结点的标记分别为X1,X2,…,XK,则A→X1,X2,…,XK,必然是G的一个产生式。
4、归约:我们称αγβ直接归约出αAβ,仅当A→γ 是一个产生式,且α、β∈(VN∪VT)*。归约过程就是从输入串开始,反复用产生式右部的符号替换成产生式左部符号,直至文法开始符。
5、推导:我们称αAβ直接推出αγβ,即αAβÞαγβ,仅当A→ γ 是一个产生式,且α、β∈(VN∪VT)*。如果α1Þα2Þ…Þαn,则我们称这个序列是从α1至α2的一个推导。若存在一个从α1αn的推导,则称α1可推导出αn。推导是归约的逆过程。
六、问答题
1、给出上下文无关文法的定义。
[解答]
一个上下文无关文法G是一个四元式(VT,VN,S, P),其中:
●VT是一个非空有限集,它的每个元素称为终结符号;
●VN是一个非空有限集,它的每个元素称为非终结符号,VT∩VN=Φ;
●S是一个非终结符号,称为开始符号;
●P是一个产生式集合(有限),每个产生式的形式是P→α,其中,P∈VN,
α∈(VT∪VN)*。开始符号S至少必须在某个产生式的左部出现一次。
2、文法G[S]:
S→aSPQ|abQ
QP→PQ
bP→bb
bQ→bc
cQ→cc
(1)它是Chomsky哪一型文法?
(2)它生成的语言是什么?
[解答]
(1)由于产生式左部存在终结符号,且所有产生式左部符号的长度均小于等于产生式右部的符号长度,所以文法G[S]是Chomsky1型文法,即上下文有关文法。
(2)按产生式出现的顺序规定优先级由高到低(否则无法推出句子),我们可以得到:
SÞabQÞabc
SÞaSPQÞaabQPQÞaabPQQÞaabbQQÞaabbcQÞaabbcc
SÞaSPQÞaaSPQPQÞaaabQPQPQÞaaabPQQPQÞaaabPQPQQÞaaaPPQQQÞ
aaabbPqqqÞaaabbQQQÞaaabbbcQQÞaaabbbccQÞaaabbbccc
……
于是得到文法G[S]生成的语言L={anbncn|n≥1}
3、按指定类型,给出语言的文法。
L={aibj|j>i≥1}的上下文无关文法。
【解答】
(1)由L={aibj|j>i≥1}知,所求该语言对应的上下文无关文法首先应有S→aSb型产生式,以保证b的个数不少于a的个数;其次,还需有S→Sb或S→bS型的产生式,用以保证b的个数多于a的个数;也即所求上下文无关文法G[S]为:
G[S]:S→aSb|Sb|b
4、有文法G:S→aAcB|Bd
A→AaB|c
B→bScA|b
(1)试求句型aAaBcbbdcc和aAcbBdcc的句柄;
(2)写出句子acabcbbdcc的最左推导过程。
【解答】(1)分别画出对应两句型的语法树,如图2-8-2所示
句柄:AaB Bd

图2-8-2 语法树
(2)句子acabcbbdcc的最左推导如下:
SÞaAcBÞaAaBcBÞacaBcBÞacabcBÞacabcbScAÞacabcbBdcA
ÞacabcbbdcAÞacabcbbdcc
5、对于文法G[S]:
S→(L)|aS|a L→L, S|S
(1)画出句型(S,(a))的语法树。(2)写出上述句型的所有短语、直接短语、句柄和素短语。
【解答】
(1)句型(S,(a))的语法树如图2-8-3所示

(2)由图2-8-3可知:
①短语:S、a、(a)、S,(a)、(S,(a));
②直接短语:a、S;
③句柄:S;
④素短语:素短语可由图2-8-3中相邻终结符之间的优先关系求得,即;

因此素短语为a。
6、考虑文法G[T]:
T→T*F|F
F→F↑P|P
P→(T)|i
证明T*P↑(T*F)是该文法的一个句型,并指出直接短语和句柄。
【解答】
首先构造T*P↑(T*F)的语法树如图2-8-4所示。

由图2-8-4可知,T*P↑(T*F)是文法G[T]的一个句型。
直接短语有两个,即P和T*F;句柄为P。

一、单项选择题
1、词法分析所依据的是 。
a. 语义规则 b. 构词规则 c. 语法规则 d. 等价变换规则
2、词法分析器的输出结果是 。
a. 单词的种别编码 b. 单词在符号表中的位置
c. 单词的种别编码和自身值 d. 单词自身值
3、正规式M1和M2等价是指 。
a. M1和M2的状态数相等 b. M1和M2的有向弧条数相等
c. M1和M2所识别的语言集相等 d. M1和M2状态数和有向弧条数相等
4、状态转换图(见图3-6-1)接受的字集为 。

a. 以 0开头的二进制数组成的集合 b. 以0结尾的二进制数组成的集合
c. 含奇数个0的二进制数组成的集合 d. 含偶数个0的二进制数组成的集合
5、词法分析器作为独立的阶段使整个编译程序结构更加简洁、明确,因此, 。
a. 词法分析器应作为独立的一遍 b. 词法分析器作为子程序较好
c. 词法分析器分解为多个过程,由语法分析器选择使用 d. 词法分析器并不作为一个独立的阶段
解答 1、b 2、c 3、c 4、d 5、b
二、多项选择题
1、在词法分析中,能识别出 。
a. 基本字 b. 四元式 c. 运算符
d. 逆波兰式 e. 常数
2、令∑={a,b},则∑上所有以b开头,后跟若干个ab的字的全体对应的正规式为 。
a. b(ab)* b. b(ab)+ c.(ba)*b
d. (ba)+b e. b(a|b)
解答 1、a、c、e 2、a、b、d
三、填空题
1、确定有限自动机DFA是 的一个特例。
2、若二个正规式所表示的 相同,则认为二者是等价的。
3、一个字集是正规的,当且仅当它可由 所 。
解答 1、NFA 2、正规集 3、DFA(NFA)所识别
四、判断题
1、一个有限状态自动机中,有且仅有一个唯一终态。 ( )
2、设r和s分别是正规式,则有L(r|s)=L(r)|L(s)。 ( )
3、自动机M和M′的状态数不同,则二者必不等价。 ( )
4、确定的自动机以及不确定的自动机都能正确地识别正规集。 ( )
5、对任意一个右线性文法G,都存在一个NFA M,满足L(G)=L(M)。 ( )
6、对任意一个右线性文法G,都存在一个DFA M,满足L(G)=L(M)。 ( )
7、对任何正规表达式e,都存在一个NFA M,满足L(G)=L(e)。 ( )
8、对任何正规表达式e,都存在一个DFA M,满足L(G)=L(e)。 ( )
解答 1 、2、3、错 4、5、6、7、8、正确
五、基本题
1、设M=({x,y}, {a,b}, f,x,{y})为一非确定的有限自动机,其中f定义如下:
f(x,a)={x,y} f(x,b)={y}
f(y,a)=φ f(y,b)={x,y}
试构造相应的确定有限自动机M′。
解答:对照自动机的定义M=(S,Σ,f,S0,Z),由f的定义可知f(x,a)、f(y,b)均为多值函数,所以是一非确定有限自动机,先画出NFA M相应的状态图,如图3-6-2所示。

用子集法构造状态转换矩阵表3-6-3所示。
I Ia Ib
{x} {x,y} {y}
{y} — {x,y}
{x,y} {x,y} {x,y}
将转换矩阵中的所有子集重新命名而形成表3-6-4所示的状态转换矩阵。
表3-6-4 状态转换矩阵
a b
0 2 1
1 — 2
2 2 2
即得到M′=({0,1,2}, {a,b}, f,0, {1,2}),其状态转换图如图3-6-5所示。

将图3-6-5的DFA M′最小化。首先,将M′的状态分成终态组{1,2}与非终态组{0};其次,考察{1,2}。由于{1,2}a={1,2}b={2}⊂{1,2},所以不再将其划分了,也即整个划分只有两组{0},{1,2}:令状态1代表{1,2},即把原来到达2的弧都导向1,并删除状态2。最后,得到如图3-6-6所示化简DFA M′。

2、对给定正规式b*(d|ad)(b|ab)+,构造其NFA M;
解答:首先用A+=AA*改造正规式得:b*(d|ad)(b|ab)(b|ab)*;其次,构造该正规式的NFA M,如图3-6-7所示。
求采纳为满意回答。
希望能解决您的问题。

阅读全文

与编译原理产生式的消除化简相关的资料

热点内容
android平滑滚动效果 浏览:841
什么是编译器指令 浏览:219
微控制器逻辑命令使用什么总线 浏览:885
程序员在学校里是学什么的 浏览:601
oraclejava数据类型 浏览:890
程序员考注册会计师 浏览:957
怎么使用access的命令按钮 浏览:899
有点钱app在哪里下载 浏览:832
博途v15解压后无法安装 浏览:205
什么是根服务器主机 浏览:438
安卓手游怎么申请退款 浏览:555
安卓系统如何分享网页 浏览:278
ad如何编译pcb工程 浏览:414
除了滴滴app哪里还能用滴滴 浏览:399
截图怎么保存文件夹然后压缩 浏览:8
幻影服务器怎么样 浏览:28
具体哪些广东公司招程序员 浏览:870
嵌入式编译器教程 浏览:307
ssl数据加密传输 浏览:87
51单片机定时器方式2 浏览:332