编译原理课程设计LL1语法分析器的构造.docx

上传人:b****6 文档编号:8319229 上传时间:2023-01-30 格式:DOCX 页数:45 大小:404.97KB
下载 相关 举报
编译原理课程设计LL1语法分析器的构造.docx_第1页
第1页 / 共45页
编译原理课程设计LL1语法分析器的构造.docx_第2页
第2页 / 共45页
编译原理课程设计LL1语法分析器的构造.docx_第3页
第3页 / 共45页
编译原理课程设计LL1语法分析器的构造.docx_第4页
第4页 / 共45页
编译原理课程设计LL1语法分析器的构造.docx_第5页
第5页 / 共45页
点击查看更多>>
下载资源
资源描述

编译原理课程设计LL1语法分析器的构造.docx

《编译原理课程设计LL1语法分析器的构造.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计LL1语法分析器的构造.docx(45页珍藏版)》请在冰豆网上搜索。

编译原理课程设计LL1语法分析器的构造.docx

编译原理课程设计LL1语法分析器的构造

LL

(1)语法分析器的构造

摘要

语法分析的主要任务是接收词法分析程序识别出来的单词符由某种号串,判断它们是否语言的文法产生,即判断被识别的符号串是否为某语法部分。

一般语法分析常用自顶向下方法中的LL分析法,采用种方法时,语法分程序将按自左向右的顺序扫描输入的的符号串,并在此过程中产生一个句子的最左推导,即LL是指自左向右扫描,自左向右分析和匹配输入串。

经过分析,我们使用VC++作为前端开发工具,在分析语法成分时比较方便直观,更便于操作。

运行程序的同时不断修正改进程序,直至的到最优源程序。

 

关键字

语法分析文法自顶向下分析LL

(1)分析最左推导

Abstract

Grammaticalanalysisofthemaintaskswastoreceivelexicalanalysisproceduretoidentifythewordsfromawebsite,string,andjudgewhethertheyhaveagrammarofthelanguage,thatis,judgingbytheseriesofsymbolstoidentifywhetheragrammarpart.Generalsyntaxanalysiscommonlyusedtop-downmethodsofLLanalysis,usingmethods,Grammarhourswillbefromtheproceduresoftheorderleft-to-rightscanninginputstringofsymbols,andintheprocessproducedoneofthemostleftthesentenceisderived,LLisscannedfromlefttoright,Fromlefttorightanalysisandmatchinginputstrings.Afteranalysis,weuseVC++asafront-enddevelopmenttoolfortheanalysisofsyntaxingredientsmoreconvenientvisual,moreeasytooperate.Operationalproceduresatthesametimeconstantlyimprovingprocedures,untilthesourceofoptimal

.

KeyWords

GrammaticalanalysisgrammarTop-downanalysisLL

(1)Analysis

MostleftDerivation

 

摘要…………………………………………………………………………….1

引言……………………………………………………………………………..3

第一章设计目的………………………………………………………………4

第二章设计的内容和要求……………………………………………………5

2.1设计内容……………………………………………………………….5

2.2设计要求……………………………………………………………….5

2.3设计实现的功能……………………………………………………….5

第三章设计任务的组织和分工………………………………........................6

3.1小组的任务分工……………………………………………………….6

3.2本人主要工作………………………………………………………….6

第四章系统设计……………………………………………………………..9

4.1总体设计……………………………………………………………...9

4.2详细设计……………………………………………………………...9

第五章运行与测试结果…………………………………….……………….22

5.1一组测试数据………………………………………………………...22

5.2界面实现情况………………………………………………………...23

第六章结论…………………………………………………………………..27

课程设计心得……..…………………………………………………………..28

参考文献………………………………………………………………………29

致谢……………………………………………………………………………30

附录(核心代码清单)……………………………………………………….31

引言

编译器的构造工具是根据用户输入的语言的文法,编译器的构造工具可以生成程序来处理以用户输入的文法书写的文本。

随着计算机应用范围的扩大,在软件自动生成,文档处理,特定专业的语言等领域,编译器的构造工具这一技术显得越来越重要。

一个编译程序在对某个源程序完成了词法分析工作之后,就进入语法分析阶段,分析检查源程序是否是语法上正确的程序,并生成相应的内部中间表示供下一阶段使用。

程序设计语言是一般形式语言的特例,程序语法正确性的检查正是语法句子的识别,语法分析问题也就是句型识别问题。

按照识别句子时语法树建立的方式,有自顶向下与自底向上两大类分析技术。

本课程设计讨论自顶向下的情况。

本次课程设计所做的工作是用VC要建立一个针对LL

(1)文法的编译器的编译器。

本文既可以以定义好的文法书写的文件作为输入,其中包括语法及语义动作,鉴于输入文件的所用的文法可以用LL

(1)分析,于是对输入的文件用递归下降的分析方法在内存中建立它的存储结构,然后分别计算所输入的文法的非终结符号是否可以生成空,每个非终结符号的first集合,每个非终结符号的follow集合,以及每个规则的predict集合,接着判断任意一个非终结符号的任意两个规则的Predict集的交集是不是都为空,如果是则输入文法可以用递归下降法分析,否则不可以,用户应该对所输入的文法作适当的修改,使其满足LL

(1)文法分析的要求,。

如果所输入的文法可以用递归下降法分析,生成相应文法的语法分析程序。

也可以自行添加文法,本课程设计有根据相应文法自动生成分析表和语法树,并将分析信息和结果保存到一个外部文件中的的功能,能灵活实现语法编译器的相应功能。

 

第一章设计目的

一、通过本次课程设计,加深了我对编译原理这门课程的理解和掌握,是我明白了分析器的原理、构造及其实现方法。

基本掌握了LL

(1)分析法的原理和使用方法。

本次课程设计主要任务是根据LL

(1)分析表,求句子的预测分析过程,实现编译器的构造。

此次设计需使用电子文档的格式,为加深即将迎来的毕业设计做准备,使我们提前熟悉写毕业设计的基本格式、流程和方法。

二、课程设计实践的主要是为巩固我们所学基础专业课程知识、进行编译系统基本技能训练、培养实践动手能力,从而掌握编译系统的基本工作原理、基本方法和基本开发技术,最终达到具有一定的编译系统的实际开发能力有重要意义。

概括来说课程设计主要为实现一下目的:

1.帮助我们深入理解编译原理的有关理论和巩固编译原理相关知识。

2.巩固我们学习的编译原理、程序设计语言、数据结构等课程的基础知识,训练学生分析和解决编译系统的相关问题的能力,提高学生的综合素质。

3.从软件工程的角度来看,《编译原理》课程设计是一个很好的实例,可以训练我们软件设计的能力以及编码调试能力。

 

第二章设计的内容和要求

2.1设计内容

1、构造LL

(1)分析表

2、求句子的预测分析过程

2.2设计要求

1、提交一份课程设计电子文档;

2、通过该课程设计要学会用消除左递归的方法来使文法满足进行确定自顶向下分析的条件。

3、学会用C/C++高级程序设计语言来设计一个LL

(1)分析法的语法分析器;

4、通过该课程设计,加深对语法分析理论的理解,培养动手实践的能力。

2.3设计实现的功能

本次课程设计主要实现语法分析器的构造,该语法分析器能够分析词法分析器的结果,即单词二元式。

在输入单词二元式后,能输出分析的结果。

 

第三章设计任务的组织和分工

3.1小组任务分工

学好

姓名

职务

任务

组长

判断输入表达式id和num的字串是否超过最大长度

 

3.2本人主要工作

我的主要工作是判断LL

(1)语法分析器中分析器构造当中的输入表达式中的id(字母)和num(数字)的字串是否超过最大长度。

本课程设计共用时一周。

第一天领题目,第二天与组员讨论课题,分配任务、查找资料。

第三天算法的编写,第四天编码和模块的测试,第五天参与文档的编写。

我所有的工作中不是本组中最难的,但是我的工作室确保表达式长度的正确范围,这是整个课程设计中的必不可少的一个关键步骤。

我们在网上查了大量资料,也阅读了大量的参考书,但是关于表达式的长度范围的判断都是一笔带过,很笼统,讲的不详细,没有具体讲到方法,所以实现起来有点小困难。

表达式长度范围的判断虽不是主要的功能,却也是实现过程中的一个关键。

判断输入表达式中id(字母)和num(数字)的字串是否超过最大长度的实现过程:

一、首先定义一些变量和常量

(1)定义整型变量:

ip,bp,width

(2)定义字符变量:

a

(3)标记flag1,flag2为常量

(4)过长标记为:

toolong=FALSE

二、说明

(1)、a=str[ip]

表示用一维数组存储表达式,当ip=0时,表示为表达式的第一个字符。

三、判断表达式长度的流程图

 

 

 

 

 

接下一页循环

接下一页图

 

接上一页图

 

 

 

 

四、判断字符ch是否为构成id的字母的流程图

 

 

 

 

 

四、判断字符ch是否为构成num的数字的流程图

 

本系统的基本设计思想(包括语法树的构造):

首先通过下面的例子来看如何分析语法树的基本构造方法和步骤,应用自顶向下分析技术,并由此考察本次系统设计的基本思想。

   设有文法G[S]:

     S->aBC

B->ib︳b

C->DE︳FG︳c

D->d

E->eh

F->de

G->t

假定输入符号串为x=abdet。

按自顶向下分析技术,让识别符号S为根结点,试图从它出发向下构造语法树。

让一个指针指向第一个输入符号a,并从S向下分支,有语法树如图3-1所示。

期望S的子结点符号串与输入符号串相匹配。

S的最左第一个子结点为a,与指针指向的输入符号相匹配,因此,指针调整到指向第二个输入符号,让S的第二个子结点B与输入符号串相匹配。

由于B是非终结符,从B引出分支。

关于B的规则有两个,排除人的因素,先按第一选择做分支消去匹配输入符号串,得到图3-2所示的语法树。

B的最左子结点i与指针指向的输入符号b不匹配,删去所做分支,而按第二选择重做分支去匹配符号串,这时语法树如图3-3所示。

现在B的唯一子结点与指针指向的输入符号b正相匹配。

让指针调整到指向下一输入符号(b),并让S的第三个子结点C去与其余输入符号(det)进行匹配。

既可按C的第一选择DE作分支,又可按照第一子结点D做分支,他的子结点正好与指针指向的输入符号串d相匹配,指针右移,并对E做分支。

所得语法树如图3-4所示。

显然当进行到E的第二子结点h时与指针最终所指向的t不相匹配,D可匹配,但E不匹配,也即C当前选择是错误的,应回头选择其他选择。

为此抹去从C所做的这一分支,且指针退回到原来正待与C去匹配的哪个输入符号(d)的位置,这正是试探C的选择时的初始位置。

现在C的第二选择FG从C从做分支。

类似与前述步骤,重新让C的各子结点去与输入符号串的其他部分(det)相匹配,最终可画出如图3-5所示的语法树。

F的两个子结点与输入符号d和e相匹配,而G的子结点与其余的唯一输入符号t相匹配,因此,C完成了与输入符号串的其余部分det的匹配。

这时发现指针已指向最右输入符号,S也再无子结点,所以完成了输入符号串x的语法树的构造,表明x是文法G[S]的句子。

图3-1字符串语法树

 

图3-2分支消去匹配符号串语法树

图3-3第二选择语法树

图3-4对e做分支语法树

图3-5最终语法树

以上主要为讲述语法树的构造思想,由于要笼统讲述所有文法对应句子的语法树确实存在一定的困难,所以希望以点铺面,其他文法句子的语法树可以根据该思想而设计出。

构造语法树在本系统中是隐含在句子的分析过程中,构造句子的语法树就相应的写出来句子的分析过程。

 

第四章系统设计

4.1总体设计

图4-1总体设计框图

 

4.2详细设计

一.系统设计框图及主要函数说明

本系统主要实现的功能是构造LL

(1)预测分析表,并根据其分析句子的分析过程。

而其中关联的FIRST、FOLLOW的构造只是隐含的分析过程,不需要具体实现,通过他们来建立预测分析表,这是本次课程设计需要重点实现的。

(1)构造分析表模块说明

函数名main()

功能:

(1)调用函数grammer()读入文法;

(2)调用函数ll1判断LL

(1)文法

(3)调用函数MM()构造分析表

与之相关的模块名:

读入文法模块,LL

(1)文法模块,构造分析表模块

(2)读入文法模块说明

函数名grammer()

功能:

(1)调用函数recur()分解含有左递归的产生式

(2)调用函数non-re()分解不含有左递归的产生式

(3)调用函数merge()将字符串合并

(3)句子分析即总控程序模块

函数名:

Analyze()

功能:

调用函数MM()构造的分析表

与之相关的模块名

求读入文法模块,LL

(1)文法模块,构造分析表模块

图4-2系统设计框图

二、系统模块设计

1、LL

(1)预测分析表的构造

(1)、相关理论介绍

预测分析方法是自顶向下分析的另一种方法,有叫LL

(1)文法。

一个预测分析器是由三部分组成:

A、预测分析程序

B、先进后出栈

C、预测分析表

其中只有预测分析表与文法有关,而分析表又可用一个矩阵M(或称二维数组)表示。

矩阵M[A,a]中的下标A表示非终结符,a为终结符或句子括号“#”,矩阵元素M[A,a]中的内容是一条关于A的产生式,表明当用非终结符A向下推导时,面临输入符a时,所应采取的候选产生式,当元素内容物产生式时则表明用A为左部向下推导时遇到了不该遇到的符号,因此元素内容为转向出错处理的信息。

(2)算法描述及流程图

在构造完文法的FIRST集、FOLLOW集和SELECT后构造预测分析表:

对每个终结符或“#”号用a表示。

若a属于SELECT(A->a),则把A->a放入M[A,a]标上出错标记。

A、构造预测分析表的流程图

图4-3预测分析表构造流程图

B、现以表达式文法为例构造预测分析表:

表达式文法为:

E->E+T|T

T->T*F|F

F->i|(E)

通过求解该文法的FIRST集和FOLLOW集得到SELECT集合如下:

SELECT(E->TE’)={(,i}

SELECT(E’->+TE’)={+}

SELECT(E’->^)={),#}

SELECT(T->FT’)={(,i}

SELECT(T’->*FT’)={*}

SELECT(T->^)={+,),#}

SELECT(F->(E))={(}

SELECT(F->i)={i}

此例的预测分析表如下表4.1:

表4.1表达式文法的预测分析表

i

+

*

#

E

->TE’

->TE’

E’

->+TE’

->^

->^

T

->FT’

->FT’

T’

->^

->*FT’

->^

->^

F

->i

->(E)

 

(3)实验代码

构造预测分析表的过程核心算法框架如下:

MM()

{

for(i=0;i<=19;i++)

for(j=0;j<=19;j++)

M[i][j]=-1;

i=strlen(termin);

termin[i]='#';/*将#加入终结符数组*/

termin[i+1]='\0';

for(i=0;i<=count-1;i++)

{

for(m=0;;m++)

if(non_ter[m]==left[i])

break;/*m为产生式左部非终结符的序号*/

for(j=0;j<=strlen(select[i])-1;j++)

{

if(in(select[i][j],termin)==1)

{

for(k=0;;k++)

if(termin[k]==select[i][j])

break;/*k为产生式右部终结符的序号*/

M[m][k]=i;

}

}

}

}

2、文法读入模块

(1)相关理论知识介绍

文法的读入主要要注意文法的格式的正确性,在该模块中主要要实现对基本输入格式正误的判断。

(2)算法描述及流程图(见图4-4)

本模块主要为实现从键盘读入文法,系统实现该读入文法的正误进行判断。

下图是该模块实现的相应程序的流程图:

 

 

(接下页的图)

图4-4判断读入文法正误流程图

 

(3)实现代码

judge()

{

inti,j;

for(i=0;i<=count-1;i++)

{

if(in(left[i],non_ter)==0)

{/*若左部不在非终结符中,报错*/

printf("\nerror1!

");

validity=0;

return(0);

}

for(j=0;j<=strlen(right[i])-1;j++)

{

if(in(right[i][j],non_ter)==0&&in(right[i][j],termin)==0&&right[i][j]!

='^')

{/*若右部某一符号不在非终结符、终结符中且不为‘^’,报错*/

printf("\nerror2!

");

validity=0;

return(0);

}

}

}

return

(1);

}

3.句型句子分析过程模块

(1)、相关理论知识介绍

所谓LL

(1)分析法,就是指从左到右扫描输入串(源程序),同时采用最左推导,且对每次直接推导只需向前看一个输入符号,便可确定当前所应当选择的规则。

实现LL

(1)分析的程序又称为LL

(1)分析程序或LL1

(1)分析器。

我们知道一个文法要能进行LL

(1)分析,那么这个文法应该满足:

无二义性,无左递归,无左公因子。

当文法满足条件后,再分别构造文法每个非终结符的FIRST和FOLLOW集合,然后根据FIRST和FOLLOW集合构造LL

(1)分析表,最后利用分析表,根据LL

(1)语法分析构造一个分析器。

LL

(1)的语法分析程序包含了三个部分,总控程序,预测分析表函数,先进先出的语法分析栈,本程序也是采用了同样的方法进行语法分析。

(2)算法描述及相关流程图

在前面两个模块中基本实现了预测分析表的构造,在本模块中主要是实现根据预测分析表,构造句子的预测分析过程。

逻辑框图如下:

图4-5系统逻辑框图

LL

(1)预测分析程序的总控程序在任何时候都是按STACK栈顶符号X和当前的输入符号a做哪种过程的。

对于任何(X,a),总控程序每次都执行下述三种可能的动作之一:

(1)若X=a=‘#’,则宣布分析成功,停止分析过程。

(2)若X=a

‘#’,则把X从STACK栈顶弹出,让a指向下一个输入符号。

(3)若X是一个非终结符,则查看预测分析表M。

若M[A,a]中存放着关于X的一个产生式,那么,首先把X弹出STACK栈顶,然后,把产生式的右部符号串按反序一一弹出STACK栈(若右部符号为ε,则不推什么东西进STACK栈)。

若M[A,a]中存放着“出错标志”,则调用出错诊断程序ERROR。

事实上,LL

(1)的分析是根据文法构造的,它反映了相应文法所定义的语言的固定特征,因此在LL

(1)分析器中,实际上是以LL

(1)分析表代替相应方法来进行分析的。

(2)算法描述和流程图

A、算法描述

实现LL

(1)的一种有效方法是使用一张分析表和一个栈进行联合控制。

如果前面已经设计好了分析表和栈的话,那么现在就开始具体实现这个LL

(1)分析程序了。

LL

(1)分析程序的算法的描述如下:

BEGIN

首先把‘#’然后把文法开始符号推进STACK分析栈;

把第一个输入符号读进a;

FLAG=TURE;

WHILEFLAGDO

BEGIN

把STACK栈顶符号上托出去并放在X中;

IFX∈VTTHEN

IFX==aTHEN把下一个输入符号读进a

ELSEERROR

ELSEIFX==‘#’THEN

IFX==aTHENFLAG=FALSE

ELSEERROR

ELSEIFM[A,a]={X→X1X2……Xk}THEN

把Xk,Xk-1,……X1,一一推进STACK栈

/*若X1X2……Xk=ε,不推进什么进栈*/

ELSEERROR

ENDOFWHILE

STOP/*分析成功*/

END

 

B、构造句子的分析过程是预测分析器主要要实现的功能,它设计到前面所有的设计,是整个设计的主体部分.。

下面是预测分析的总框图

图4-6预测分析程序流程图

C、对句子进行分析

利用构造分析表模块中的例子文法分析符号窜i+i*i#进行分析,得到如下分析过程如下表:

 

表4-2例句分析过程表

步骤

分析栈

剩余输入串

推导所用产生式或匹配

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#E

#E’T

#E’T’F

#E’T’i

#E’T’

#E’

#E’T+

#E’T

#E’T’F

#E’T’i

#E’T’

#E’T’F*

#E’T’F

#E’T’i

#E’T’

#E’

#

i+i*i#

i+i*i#

i+i*i#

i+i*i#

+i*i#

+i*i#

+i*i#

i*i#

i*i#

i*i#

*i#

*i#

i#

i#

#

#

i#

E->TE’

T->FT’

F->i

“i”匹配

T’->^

E’->+TE’

“+”匹配

T->FT’

F->i

“i”匹配

T’->*FT’

“*”匹配

F->i

“i”匹配

T’->^

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 预防医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1