文法存储(编译原理)

合集下载

编译原理习题答案

编译原理习题答案

编译原理习题答案

1、正规文法又称DA、0型文法B、1型文法C、2型文法D、3型文法

2、对于无二义性的文法,规范归约是BA.最左推导B.最右推导的逆过程

C.最左归约的逆过程

D.最右归约的逆过程。

3、扫描器的任务是从源程序中识别出一个个单词符号

4、程序所需的数据空间在程序运行前就可确定,称为A管理技术。

A静态存储B动态存储C栈式存储D堆式存储5、编译过程中,语法分析器的任务是(B)。

①分析单词是怎样构成的

②分析单词串是如何构成语句和说明的③分析语句和说明是如何构成程序的④分析程序的结构

A、②③

B、②③④

C、①②③

D、①②③④

6、文法G:E→E+T|TT→T某P|PP→(E)|i

则句型P+T+i的句柄和最左素短语分别为B

A.指示器

B.临时变量

C.符号表

D.程序变量

8、程序语言的单词符号一般可以分为保留字、标识符、常数、运算符、界符等等。

9、下列B优化方法是针对循环优化进行的。

A.删除多余运算B.删除归纳变量C.合并已知量D.复写传播10、若文法G定义的语言是无限集,则文法必然是AA、递归的B、前后文无关的C、二义性的D、无二义性的

11、文法G产生的D的全体是该文法描述的语言。

A、句型

B、终结符集

C、非终结符集

D、句子

12、Chomky定义的四种形式语言文法中,0型文法又称为A文法;1型文法又称为C文法。

A.短语文法

B.上下文无关文法

C.上下文有关文法

D.正规文法A.短语文法B.上下文无关文法C.上下文有关文法D.正规文法13、语法分析最常用的两类方法是自顶向下和自底向上分析法。

14、一个确定的有穷自动机DFA是一个A

编译原理概念 名词解释

编译原理概念 名词解释

编译过程的六个阶段:词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成

解释程序:把某种语言的源程序转换成等价的另一种语言程序——目标语言程序,然后再执行目标程序。

解释方式是接受某高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这句的执

行结果,然后再接受下一句。

编译程序:就是指这样一种程序,通过它能够将用高级语言编写的源程序转换成与之在逻辑上等价的低级语言形式的目标程序(机器语言程序或汇编语言程序)。

解释程序和编译程序的根本区别:是否生成目标代码

句子的二义性(这里的二义性是指语法结构上的。):文法G[S]的一个句子如果能找到两种不同的最左推导(或最右推导),或者存在两棵不同的语法树,则称这个句子是二义性的。

文法的二义性:一个文法如果包含二义性的句子,则这个文法是二义文法,否则是无二义文法。

LL(1)的含义:(LL(1)文法是无二义的; LL(1)文法不含左递归)

第1个L:从左到右扫描输入串第2个L:生成的是最左推导

1:向右看1个输入符号便可决定选择哪个产生式

某些非LL(1)文法到LL(1)文法的等价变换: 1. 提取公因子 2. 消除左递归

文法符号的属性:单词的含义,即与文法符号相关的一些信息。如,类型、值、存储地址等。

一个属性文法(attribute grammar)是一个三元组A=(G, V, F)

G:上下文无关文法。

V:属性的有穷集。每个属性与文法的一个终结符或非终结符相连。属性与变量一样,可以进行计算和传递。

F:关于属性的断言或谓词(一组属性的计算规则)的有穷集。断言或语义规则与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性。

编译原理及实现课后答案

编译原理及实现课后答案

5.1 考虑以下的文法:

S→S;T|T

T→a

(1)为这个文法构造LR(0)的项目集规范族。

(2)这个文法是不是LR(0)文法?如果是,则构造LR(0)分析表。

(3)对输入串“a;a”进行分析。

解:

(1)拓广文法G[S’]:

0:S’→S

1:S→S;T

2:S→T

3:T→a

构造LR(0)项目集规范族

(2)该文法不存在“归约-归约”和“归约-移进”冲突,因此是LR(0)文法。LR(0)分析表如下:

(3)对输入串“a;a”进行分析如下:

5.2 证明下面文法是SLR(1)文法,但不是LR(0)文法。S→A

A→Ab|bBa

B→aAc|a|aAb

解:文法G[S]:

0:S→A

1:A→Ab

2:A→bBa

3:B→aAc

4:B→a

5:B→aAb

状态5存在“归约-移进”冲突,状态9存在“归约-归约”冲突,因此该文法不是LR(0)文法。

状态5:

FOLLOW(B)={a},因此,FOLLOW(B)∩{b}=Φ

状态9:

FOLLOW(B)={a},FOLLOW(A)={#,b,c},因此FOLLOW(B)∩FOLLOW(A)=Φ

该SLR(1)分析表无重定义,因此该文法是SLR(1)文法,不是LR(0)文法。

5.3 证明下面文法是LR(1)文法,但不是SLR(1)文法。

S→AaAb|BbBa

A→ε

B→ε

解:拓广文法G[S’]:

0:S’→S

1:S→AaAb

2:S→BbBa

3:A→ε

4:B→ε

={a,b},即FOLLOW(A)∩FOLLOW(B)={a,b}≠Φ,所以该文法不是SLR(1)文法。

构造LR(1)项目集规范族:

编译原理第三版课后答案王生原

编译原理第三版课后答案王生原

编译原理第三版课后答案王生原

编译原理第三版课后答案王生原

【篇一:编译原理课后答案(第三版蒋立源康慕宁编)】

class=txt>第一章习题解答

1解:源程序是指以某种程序设计语言所编写的程序。目标程序是指编译程序(或解

释程序)将源程序处理加工而得的另一种语言(目标语言)的程序。翻译程序是将某种语

言翻译成另一种语言的程序的统称。编译程序与解释程序均为翻译程序,但二者工作方法

不同。解释程序的特点是并不先将高级语言程序全部翻译成机器代码,而是每读入一条高

级语言程序语句,就用解释程序将其翻译成一段机器指令并执行之,然后再读入下一条语

句继续进行解释、执行,如此反复。即边解释边执行,翻译所得的指令序列并不保存。编

译程序的特点是先将高级语言程序翻译成机器语言程序,将其保存到指定的空间中,在用

户需要时再执行之。即先翻译、后执行。 2解:一般说来,编译程序主要由词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、信息表管理程序、错误检查处理程序组成。

3解:c语言的关键字有:auto break case char constcontinue default do double else enum extern float for goto if int long register return short

signed sizeof static struct switch typedef union unsigned void volatile while。上述关键字在c语言中均为保留字。

编译原理文法类型介绍

编译原理文法类型介绍

编译原理文法类型介绍

辽宁师范大学 王 欣

自1956年,乔姆斯基建立了形式语言的描述,使得形式语言的

理论发展得十分迅速。形式语言的理论不仅对计算机科学有着深远

的影响,也对编译方法、程序设计语言的设计等方面有着更重大的

作用。乔姆斯基将文法分为0型,1型,2型,3型,本文重点介绍这

四种文法的分类与判别条件。

1 文法说明

文法G定义为一个四元组(V N,V T,P,S)(肖军模,程序设

计语言编译方法:大连理工大学出版社,1991;何炎祥,伍春香,

计算机专业不需要编译原理课程吗:计算机教育,2009):

V N表示非终结符集合,非终结符集合包括大写字母、语法实

体、变量、小写的斜体字符串及用字母表示的开始符号等。

V T表示终结符集合,终极符包括小写英文字母、数字及不用尖

括号括起来的是终极符。

P表示为产生式(α→β)的集合,满足条件且其中至

少要包含一个非终结符,,其中(α→β)的意义为α定义

为β。

S是一个终极符,作为文法的开始符号,又称作标识符,要求S

至少要作为P其中一条产生式的左部出现。

要求V N,V T,P都为非空的有穷集合(冯博琴,编译原理辅助

教程:西安交通大学出版社,1995)。

2 文法类型介绍

2.1 0型文法

2.1.1 0型文法定义

设文

法,若文法中的每一个产生式都满足

条件并且其中至少要包含一个非终结符,同时满足,那么可判定G为一个0型文法(张志红,朱晨光,编译原理中的文法及二义性研究:河南科技,2009)。

例如:

2.1.2 0型文法说明

0型文法又可被称为短语文法,0型文法的充分必要条件为递归可枚举集必然是一个0型文法。图灵机等价于0型文法。

编译原理语法分析

编译原理语法分析

编译原理语法分析

编译原理语法分析的目的在于实现用户指令与计算机程序之间

的转换,实现自然语言指令到机器语言的转换。语法分析是编译过程中非常重要的一部分,它可以将输入源程序分解成词法单元,并根据规定的语法规则把它们组合起来,构成一个或多个语句。

编译原理语法分析是基于形式化的文法。一个文法定义了正确的句子,并使用若干规则表达句子的结构,而这些规则又组成了合法的用户指令集。文法由语法规则(归纳规则)和终结符(终结符号)组成,其中语法规则是一些由终结符组成的语句,它们表示句子的结构,而终结符号则表示句子本身。

编译原理语法分析过程主要分为四个阶段:词法分析阶段,LL(1)分析阶段,LR(1)分析阶段,以及语义分析阶段。

首先是词法分析阶段,词法分析阶段的目的是将源代码文件识别成有意义的单词,即词法单元。词法分析的方法有多种,常用的方法有DFAs(有穷自动机)和正则表达式。经过词法分析,可以得到所有的词法单元,其中可以将部分语法结构(如句子终结符)进行简单分析。

紧接着是LL(1)分析阶段。LL(1)分析阶段是一种简单的分析过程,它以词法单元为基础,将输入句子划分成文法中规定的终结符号和非终结符号,最终将句子分解成语法规则所定义的结构单元。

接下来是LR(1)分析阶段,LR(1)分析阶段也是一种基于产生式的分析过程,它利用文法产生式来将句子分解成更复杂的结构单元,

它能够更有效地分析句子中的嵌套结构。

最后是语义分析阶段,它是一种更深入的分析,它将句子中的结构单元转换成机器能够理解的有意义的指令,以实现自然语言指令到计算机程序的转换。

编译原理 文法

编译原理 文法
a必须在某句型中出现即有sa其中属于v上下文无关文法中某些规则可具有形式a称这种规则为规则因为规则会使得有关文法的一些讨论和证明变得复杂有时会限制这种规则的出现文法构思的启示是要找出语言的有穷描述而如果语言l有一个有穷的描述则ll也同样有一个有穷的描述并且可以证明若l是上下文有关语言上下文无关语言或正规语言则l和l分别是上下文有关语言上下文无关语言和正规语言
文法的直观概念和语言概述
表述一种语言时,无非是说明这种语言的句子,
如果语言只含有有穷多个句子,则只需列出句子
的有穷集就行了,对于含有无穷句子的语言,存
在着如何给出它的有穷表示的问题。
自然语言无法列出全部句子,但可以给出一些 规则,用这些规则来说明(或者定义)句子的组成 结构,用EBNF来表示这种句子的构成规则:
18
文法和语言的形式定义
如何来描述一种语言? 如果语言是有穷的(只含有有穷多个句子),可 以将句子逐一列出来表示 如果语言是无穷的,找出语言的有穷表示。语言 的有穷表示有两个途经:
生成方式
(文法):语言中的每个句子可以用严格定 义的规则来构造。 识别方式(自动机):用一个过程,当输入的一任意 串属于语言时,该过程经有限次计算后就会停止并回 答“是”,若不属于,要麽能停止并回答“不是”, (要麽永远继续下去。)
6
语言概述
每种语言具有两个可识别的特性,即语言的形式

编译原理-课程简介

编译原理-课程简介

05
CATALOGUE
编ቤተ መጻሕፍቲ ባይዱ器实现技术
词法分析器实现方法
基于正则表达式的词法分析
01
利用正则表达式描述词法单元的模式,通过模式匹配进行词法
分析。
基于状态机的词法分析
02
根据词法单元的规则构建状态机,通过状态转移进行词法分析

手工编写的词法分析器
03
根据语言规范,手动编写代码实现词法分析器。
语法分析器实现方法
• 向量化技术的实现方法:向量化技术的实现方法包括自动向量化和手动向量化 两种。自动向量化是指编译器自动将程序中的循环结构转换为向量运算;而手 动向量化则需要程序员手动编写向量运算的代码。在实现向量化技术时,需要 注意处理器的向量长度、数据对齐等问题。
04
CATALOGUE
运行时环境支持
存储管理策略及实现
• 循环优化的概念和作用:循环优化是编译器优化中针对循环结构的一种特殊优 化技术,它可以显著提高循环程序的性能。
• 循环优化的方法:常见的循环优化方法包括循环展开、循环合并、循环交换等 。这些方法可以减少循环次数、消除循环中的冗余计算和提高循环的并行度。
• 向量化技术的概念和作用:向量化技术是一种利用现代处理器中的向量运算单 元来提高程序性能的优化技术。通过向量化技术,编译器可以将多个标量运算 转换为单个向量运算,从而显著提高程序的运算速度。

编译原理课后习题答案(陈火旺+第三版)

编译原理课后习题答案(陈火旺+第三版)

编译原理课后习题答案(陈火旺+第三版)

第二章

P36-6

(1)

L G ()

1是0~9组成的数字串

(2) 最左推导:

N ND NDD NDDD DDDD DDD DD D N ND DD D N ND NDD DDD DD D ⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒0010120127334

556568

最右推导:

N ND N ND N ND N D N ND N D N ND N ND N D ⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒77272712712701274434

886868568

P36-7

G(S)

O N O D N S O AO A AD N

→→→→→1357924680|||||||||||

P36-8

文法:

E T E T E T T

F T F T F F E i

→+-→→|||*|/()|

最左推导:

E E T T T

F T i T i T F i F F i i F i i i E T T F F F i F i E i E T i T T i F T i i T i i F i i i ⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒⇒⇒⇒⇒⇒+⇒+⇒+⇒+⇒+⇒+********()*()*()*()*()*()*()

最右推导:

E E T E T

F E T i E F i E i i T i i F i i i i i E T F T F F F E F E T F E F F E i F T i F F i F i i i i i ⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒⇒⇒⇒⇒+⇒+⇒+⇒+⇒+⇒+⇒+**********()*()*()*()

编译原理概念总结

编译原理概念总结

编译原理概念总结

编译原理是计算机科学中的一个重要领域,研究如何将高级语言程序

翻译成计算机能理解和执行的目标代码。它涉及到词法分析、语法分析、

语义分析、中间代码生成、代码优化和目标代码生成等各个阶段。

编译原理的核心目标是实现高效可靠地将高级语言程序转换为等价的

机器代码,并能在目标机器上正确运行。编译器是实现这一目标的关键工具,它将高级语言程序的源代码作为输入,经过多个阶段的处理,最终生

成可执行的目标代码。

在编译原理中,词法分析是第一个阶段,它将源代码分解为若干个词

法单元,如标识符、关键字、运算符等。词法分析器通过使用正则表达式

和有限自动机等方法,辨别不同的词法单元,为后续的语法分析提供输入。

语法分析是编译过程的第二个阶段,它将词法单元组织成按照语法规

则形成的语法结构。语法分析器使用上下文无关文法描述语言的语法规则,并通过构建语法树或语法分析表等数据结构来表示和分析各种语法结构。

语义分析是编译过程的第三个阶段,它对语法结构进行语义检查和解释,确保程序在语义上是正确的。语义分析器会对数据类型、作用域、类

型转换等进行检查,并生成中间代码以供后续的代码生成和优化。

中间代码生成是编译过程的第四个阶段,它将源代码转换为与机器无

关的中间代码表示形式。中间代码是一种类似于汇编语言的抽象表示形式,它包含了源代码的各种高级结构,如条件语句、循环语句等,但与具体的

机器架构无关。

代码优化是编译过程的第五个阶段,它通过对中间代码进行重写和重组,以提高程序的执行效率。代码优化器会检测和消除冗余的计算、减少

内存访问次数、提前计算常量表达式等,从而减少程序的执行时间和空间

编译原理 两个文法 取并集

编译原理 两个文法 取并集

编译原理两个文法取并集

引言

编译原理是计算机科学中重要的一门课程,它涉及到程序的编写、翻译和执行等方面。在编译原理中,文法是一个核心概念,它用于描述程序语言的语法规则。本文将探讨编译原理中的两个文法如何进行取并集的操作。

文法概述

文法是形式语言中描述语法的规则集合。在编译原理中,文法用于定义程序语言的语法结构。一个文法由四个部分组成:终结符集合、非终结符集合、产生式集合和一个起始符号。终结符是文法中最基本的符号,它表示语法中不可再分的最小单位,例如数字、运算符等。非终结符是由终结符和其他非终结符组成的符号,表示可以进一步扩展的语言单元。产生式描述了如何将一个符号替换为一串符号的规则。起始符号是文法的入口符号,表示一切从此开始。

文法的表示方法

文法可以使用多种方式进行表示,包括BNF(巴科斯-诺尔范式)和EBNF(扩展巴

科斯-诺尔范式)等。BNF是一种用于描述语法的形式化表示方法,它使用产生式

指定如何从一个符号推导出另一个符号。EBNF是BNF的扩展版本,它引入了更多

的语法元素和约定,使得文法的表示更加灵活和简洁。

两个文法的例子

为了更好地说明文法取并集的概念,我们将使用两个简单的文法作为例子进行讨论。

文法一

E -> E + T | T

T -> T * F | F

F -> ( E ) | id

文法二

S -> a S b | ε

在这两个文法中,终结符集合包括’+‘,’*‘,’(‘,’)‘, ’id’, ‘a’和’b’,非终结符集合包括’E’, ‘T’, ‘F’和’S’。产生式集合则给出了不同符号的替换规则。

编译原理 第二版 第三章课后答案

编译原理 第二版 第三章课后答案

第三章作业

第三章作业答案P47 练习

1、文法G=({A,B,S},{a,b,c},P,S),其中P为:

S->Ac|aB A->ab B->bc

写出L(G [S])的全部元素。

S=>Ac=>abc

或S=>aB=>abc

所以L(G[S])={abc}

2、文法G[N]为:

N->D|ND

D->0|1|2|3|4|5|6|7|8|9

G[N]的语言是什么?

【解】

N=>ND=>NDD.... =>NDDDD...D=>D......D

G[N]的语言是V+。V={0,1,2,3,4,5,6,7,8,9}

或:

解: N ND n-1

D n

{0,1,3,4,5,6,7,8,9}+

∴L(G[N])= {0,1,3,4,5,6,7,8,9}+

5.写一文法,使其语言是偶正数的集合。

要求:

(1)允许0打头

(2)不允许0打头

【解】

(1)允许0开头的偶正整数集合的文法

E->NT|G|SFM

T->NT|G

N->D|1|3|5|7|9

D->0|G

G->2|4|6|8

S->NS|ε

F->1|3|5|7|9|G

M->M0|0

(2)不允许0开头的偶正整数集合的文法

E->NT|D

T->FT|G

N->D|1|3|5|7|9

D->2|4|6|8

F->N|0

G->D|0

9.考虑下面上下文无关文法:

S→SS*|SS+|a

(1) 表明通过此文法如何生成串aa+a*,并为该串构造推导树。

编译原理_文法范文

编译原理_文法范文

编译原理_文法范文

编译原理是计算机科学与技术中的一门重要课程,它主要研究如何将高级语言编写的程序转换为机器语言,并最终执行在计算机上。编译原理中的一个重要概念就是文法,本文将详细介绍什么是文法以及文法的相关概念和应用。

文法是一种形式化的描述语言结构的数学模型。在编译原理中,文法被用来描述一种编程语言的语法结构,即编程语言的合法的、可被解析和执行的语句和表达式。文法可以看作是一种对语言结构的抽象描述,它定义了语言的语法规则和语法结构。

一个文法通常由四个部分组成:终结符集、非终结符集、产生式和开始符号。

1.终结符集:终结符是文法中的最基本的符号,代表了语言中的实际元素,例如关键字、操作符等等。终结符可以通过正则表达式进行描述。

2.非终结符集:非终结符是用来描述语句或表达式的结构的符号,它可以展开成一系列的终结符和/或非终结符。非终结符通常用大写字母表示。

3.产生式:产生式是文法中的一个基本规则,用来定义非终结符如何展开成终结符和/或非终结符的组合。产生式通常由两部分组成,左部是一个非终结符,右部是一个终结符和/或非终结符的序列。产生式可以用形如“非终结符->终结符/非终结符”的格式表示。

4.开始符号:开始符号是文法中唯一一个用来开始生成语言中有效句子的非终结符。

文法可以用来描述一种编程语言的语法结构,通过对语法规则的定义,运用合适的算法可以将源程序转为一个语法树。语法树是一个以文法产生

式为边的有向树,它描述了源程序的语法结构。

语法分析是编译原理中的一个重要阶段,它用来分析源程序的语法结构,并生成语法树。语法分析有两种主要的方法:自顶向下分析和自底向

《编译原理》第2章 编译基础-形式语言与有穷自动机

《编译原理》第2章 编译基础-形式语言与有穷自动机
整理课件
第三节 文法的形式定义 一、几个概念 1、非终结符—语法变量 2、终结符—单词 3、产生式—规则
整理课件
二、文法的定义 文法是一个四元组,表示为:
G=(VN,VT,P,S) 其中: VN ---非终结符集合
VT ---终结符集合 P---产生式集合 S---开始符号
整理课件
P:α→β α∈V+ ,β∈ V*
L(G)={ambncp/m,n,p≥1}
最小句子:abc
P:A →aB A →aA B →bB B →bC
C →cC C →c
整理课件
2. 写出产生语言L(G)的正规文法
例1:写出产生语言L(G)={ambcn/m,n≥0} 的正规文法
解:文法 G=(VN,VT,P,S)
其中: VN={A,C} VT={a,b} S=A
二、有穷自动机
正规文法产生的正规语言用有穷自动机 来识别 根据文法---写程序
----编译时用有穷自动机识别
整理课件
二、有穷自动机 1、特点:接收离散输入,状态有穷,只 需考虑当前输入和当前内部状态
2、原理:有穷自动机控制器读头自左向 右逐个扫描并读入输入符号,并且根据 控制器的当前状态和当前输入符号控制 转入下一个状态
整理课件
第四节 正规文法与有穷自动机 1、正规文法 产生的语言的推导 例:文法 G=(VN,VT,P,S) 其中: VN={A,B,C}

编译原理的基本知识

编译原理的基本知识

编译原理的基本知识

编译原理是计算机科学中非常重要的一门学科,它研究的是计

算机程序的编写、编译和执行过程。作为一名程序员,了解编译

原理的基本知识非常重要,因为只有了解了编译原理的基本知识,我们才能够更好地编写高效、安全、可靠的程序。在本文中,我

们将介绍编译原理的基本知识,包括编译的过程、词法分析、语

法分析、语义分析、优化和代码生成等方面。

一、编译的过程

编译的过程可以分为四个阶段,分别是预处理、词法分析、语

法分析和代码生成。

预处理的主要作用是对源代码进行一些替换和重定向。例如,

预处理器可以把代码中的宏定义替换成它所代表的部分,还可以

把头文件的内容加入到源文件中。预处理的结果是一个新的源文件,这个新的源文件中已经包含了所有的宏定义和头文件。

词法分析的作用是将源代码分解成一个个的词法单元,也就是

经过语法分析器处理后表示意义的最小元素。词法分析器会识别

出特定的记号,例如变量名、关键字、运算符等等。词法分析器

的输出是一系列的词法单元。

语法分析的作用是判断所生成的词法单元是否符合语法规则,

如果不符合语法规则,就会产生一个语法错误。语法分析器会使

用语法规则进行语法检查,同时生成一个语法树。语法树是一个

树形结构,它反映了程序中各个语法单位之间的层次关系。

语义分析的主要作用是判断程序是否符合语义规则。例如,一

个整型变量不能赋值为字符串类型。语义分析器会使用语义规则

进行语义检查,同时生成一个中间代码。

优化的作用是对中间代码进行优化,使得程序的执行效率更高、占用的空间更小。通常,优化器会从减少代码行数、减小代码路

编译原理实验二:LL(1)语法分析器

编译原理实验二:LL(1)语法分析器

编译原理实验⼆:LL(1)语法分析器

⼀、实验要求

1. 提取左公因⼦或消除左递归(实现了消除左递归)

2. 递归求First集和Follow集

其它的只要按照课本上的步骤顺序写下来就好(但是代码量超多...),下⾯我贴出实验的⼀些关键代码和算法思想。

⼆、基于预测分析表法的语法分析

2.1 代码结构

2.1.1 Grammar类

功能:主要⽤来处理输⼊的⽂法,包括将⽂法中的终结符和⾮终结符分别存储,检测直接左递归和左公因⼦,消除直接左递归,获得所有⾮终结符的First集,Follow集以及产⽣式的Select集。

#ifndef GRAMMAR_H

#define GRAMMAR_H

#include <string>

#include <cstring>

#include <iostream>

#include <vector>

#include <set>

#include <iomanip>

#include <algorithm>

using namespace std;

const int maxn = 110;

//产⽣式结构体

struct EXP{

char left; //左部

string right; //右部

};

class Grammar

{

public:

Grammar(); //构造函数

bool isNotTer(char x); //判断是否是终结符

int getTer(char x); //获取终结符下标

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include

#define Maxrule 6

#define Maxright 4

#define MaxVn 3

#define MaxVt 5

typedef struct

{

int left;

int right[Maxright];

int rightlength;

}Ruletype;

Ruletype G[Maxrule+1];

char Vn[MaxVn+1];

char Vt[MaxVt+1];

main()

{

int i,k;

Vn[1]='E'; Vn[2]='T'; Vn[3]='F';

Vt[1]='+'; Vt[2]='*'; Vt[3]='('; Vt[4]=')'; Vt[5]='i';

G[1].left=101;

G[1].right[1]=101;

G[1].right[2]=1;

G[1].right[3]=102;

G[1].rightlength=3;

G[2].left=101;

G[2].right[1]=102;

G[2].rightlength=1;

G[3].left=102;

G[3].right[1]=102;

G[3].right[2]=2;

G[3].right[3]=103;

G[3].rightlength=3;

G[4].left=102;

G[4].right[1]=103;

G[4].rightlength=1;

G[5].left=103;

G[5].right[1]=3;

G[5].right[2]=101;

G[5].right[3]=4;

G[5].rightlength=3;

G[6].left=103;

G[6].right[1]=5;

G[6].rightlength=1;

printf("·ÇÖÕ½á·ûºÅ:");

for(i=1;i

{

printf("%C\t",Vn[i]);

}

printf("\n");

printf("ÖÕ½á·ûºÅ:");

for(i=1;i

{

printf("%C\t",Vt[i]);

}

printf("\n");

printf("ÎÄ·¨ÈçÏ£º\n");

for(i=1;i<=Maxrule;i++)

{

printf("%c::=",Vn[G[i].left-100]);

for(k=1;k<=G[i].rightlength;k++)

{

if(G[i].right[k]>100)

{

printf("%c",Vn[G[i].right[k]-100]);

}

else

{

printf("%c",Vt[G[i].right[k]]);

}

}

printf("\n");

}

return 0;

}

相关文档
最新文档