语法分析器实验报告.docx

上传人:b****5 文档编号:3228674 上传时间:2022-11-20 格式:DOCX 页数:49 大小:426.21KB
下载 相关 举报
语法分析器实验报告.docx_第1页
第1页 / 共49页
语法分析器实验报告.docx_第2页
第2页 / 共49页
语法分析器实验报告.docx_第3页
第3页 / 共49页
语法分析器实验报告.docx_第4页
第4页 / 共49页
语法分析器实验报告.docx_第5页
第5页 / 共49页
点击查看更多>>
下载资源
资源描述

语法分析器实验报告.docx

《语法分析器实验报告.docx》由会员分享,可在线阅读,更多相关《语法分析器实验报告.docx(49页珍藏版)》请在冰豆网上搜索。

语法分析器实验报告.docx

语法分析器实验报告

语法分析器

一.需求分析

1.1题目背景描述

编译器实现技术是一大宝库,一方面以编译器的实现为背景可以实践几乎全部在数据结构与算法分析课程中学到的主要数据结构与算法;另一方面,编译器设计中使用的问题求解方法、处理问题的思路被广泛地用于自动数据处理(转换)及其它一些新的研究领域。

没有编译器的出现就没有现代数字计算机的发展。

本次课设即以“语法规则的存储与显示”、“句子的生成”、“语法(分析)树的建立”等等这些编译器中的一些基本功能的实现为题,对高级程序设计语言在计算机中的表达和相关的处理有一个初步认识,提前领略“数据的自动转换与处理”这一计算机问题求解的核心技术。

尽管这些功能的实现并不涉及较深入的编译技术,但也需要带着问题预先学习、掌握有关形式语言、编译原理与技术的若干基本概念。

1.2课程设计任务

给定若干描述某种高级程序设计语言组成部分的语法规则及测试用例:

1、设计恰当的数据结构实现语法规则的计算机存储并加以显示;

2、对于给定语法规则的句子,能动态显示“句子的生成”;

3、对于给定语法规则的句子(或句型),完成该句子(句型)的“语法(分析)树的建立”,并用图形界面显示;

1.3输入形式

本程序用到的输入形式有键盘、鼠标和文件。

各输入说明及输入值范围说明如下:

1.3.1键盘输入

可在“建立推导”窗口通过键盘输入任意句子建立推导,两符号间需要空格。

1.3.2鼠标输入

可在“文法管理系统”界面通过鼠标点击任意菜单选项,实现对应功能。

当文法或推导过长时,点击对应文本域滚动滚轮可查看余下全文。

1.3.3文件输入

可输入任意存储了正确文法的txt文件,默认有Pascal风格的文法和C语言风格的文法,格式如下:

Pascal风格:

St:

:

=Assign|IfS|WhS

Assign:

:

=id:

=E

E:

:

=E+E|E-E|E*E|E/E|(E)|id

IfS:

:

=ifBEthenSt|ifBEthenStelseSt

BE:

:

=id>id|id==id|id

WhS:

:

=whileBEdoSt

C语言风格:

S:

:

=assignS|ifS|whileS

assignS:

:

=id=E|id+=E|id-=E

E:

:

=E+T|E-T|T

T:

:

=T*F|T/F|F

F:

:

=id|(E)

ifS:

:

=ifBES|ifBESelseS

BE:

:

=E>E|E==E|E=E|E!

=E|E<=E

whileS:

:

=whileBES

1.4输出形式

输出到显示器。

“文法管理系统”界面左侧文本域输出文件中存储的文法。

右侧文本域输出文法的终结符集、非终结符集,产生式集合或输出句子的推导过程。

点击“显示语法分析树”菜单选项在新窗口输出语法分析树。

1.5课设的功能

“文法管理系统”可输入任意存储了正确文法的txt文件。

文法G应为一个四元组:

G=(VT,VN,P,S),其中VT表示终结符集。

VN表示非终结符集,VT∩VN=Φ。

S表示开始符号,S∈VN。

P表示产生式集合,α→β,被称为产生式。

其中α∈(VT∪VN)+,且α中至少有VN中元素的一个出现。

β∈(VT∪VN)*。

α称为产生式α→β的左部,β称为产生式α→β的右部。

在此以题目要求中给出的算术表达式文法G[E]为例说明其主要功能。

1.5.1存储文法并显示

新建一个文本文档,在文档中输入文法G[E](两语句间需要换行,两符号间需要空格):

E:

:

=E+T|E-T|T

T:

:

=T*F|T/F|F

F:

:

=id|(E)

点击“输入文法”菜单中的“打开文法”,弹出文件选择器,找到文件所在位置并打开。

左侧文本域直接输出文件内容:

系统自动存储其终结符(7个)、非终结符(3个),产生式规则(8个),并以在右侧文本域输出:

1.5.2建立推导并显示句子的生成

点击“建立推导”菜单中的“建立推导”,弹出对话框,用户在“请输入”下的文本框输入句子如“a*b/c”(两符号间需要空格)。

点击确定或按下回车后,系统自动按照G[E]的产生式规则推导出句子、计算出推导用时并在右侧文本域动态显示“句子的生成”:

之后系统自动构造并存储该推导对应的语法分析树。

若用户没有打开文法,右侧文本域不会有任何显示。

若句子无法被推导出来,右侧文本域显示没有(正确的)推导过程:

用户可以点击“输入文法”菜单中的“显示文法”或“建立推导”菜单中的“显示推导”切换右侧文本域输出的内容。

1.5.3构造语法分析树并用图形界面显示

点击“构造语法分析树”菜单中的“显示语法分析树”。

弹出新窗口显示推导对应的语法分析树:

1.5.4判断二义性

点击“建立推导”菜单中的“判断二义性”,对于有二义性的句子,系统弹出消息框:

之后右侧文本域输出新的推导过程。

点击“构造语法分析树”菜单中的“显示语法分析树”。

会弹出新窗口显示新的的语法分析树。

若句子没有二义性,则弹出消息框:

二.概要设计

本次课设使用Java语言编程,这是一个纯的面向对象的程序设计语言。

将eclipse作为java集成开发环境(IDE)来使用,大大提高了编程的效率。

2.1抽象数据类型定义

2.1.1主界面类(Form.java)

“文法管理系统”界面。

主要设置全局字体、切换文本域输出内容以及联系其它类。

2.1.2文法类(Grammar.java)

存储文法的识别符号、终结符、非终结符,产生式规则。

记录一个非终结符最多有几条产生式规则用于建立推导。

2.1.3推导类(Derivation.java)

存储推导过程,计算出推导时间。

记录推导的步骤数和句子的标识符用于构造语法分析树。

判断句子的二义性。

2.1.4建树类(GrammarTree.java)

构造语法分析树,其根节点用于画数。

2.1.5画树类(PaintTree.java)

画出语法分析树。

2.1.6菜单类(GrammarMenu.java)

“文法管理系统”菜单,主要实现各个菜单选项的功能。

2.1.7过滤器类(TFileFilter)

在“打开文法”菜单选项弹出的文件选择器中过滤txt文件。

2.2主要程序流程图

2.2.1存储文法流程图

2.2.2推导句子流程图

2.2.3建树流程图

2.3UML图

三、详细设计

3.1抽象数据结构中的基本操作

3.1.1主界面类(Form.java)

classFormextendsJFrame

{

Grammarg;//文法类

Derivationd;//推导类

GrammarTreet;//建树类

JTextAreaagrammar=newJTextArea();//左侧文本域

JTextAreaatext=newJTextArea();//右侧文本域

JScrollPanescrollgrammar=newJScrollPane(agrammar);//左侧滚动条

JScrollPanescrolltext=newJScrollPane(atext);//右侧滚动条

JPanelp=newJPanel();//新窗口

publicForm()//构造函数

publicvoidinitGrammar(String[]input)//“打开文法”菜单选项调用

publicvoidswitchGra()//“显示文法”菜单选项调用

publicvoidswitchDer()//“显示推导”菜单选项调用

publicvoidshowPaintTree()//“显示语法分析树”菜单选项调用

publicvoidinitDerivation(Stringinput)//“建立推导”菜单选项调用

publicvoidinitTree()//建立语法分析树

publicstaticvoidinitGlobalFontSetting(Fontfont)//设置全局字体

classTreeFormextendsJFrame//新窗口显示语法分析树

}

3.1.2文法类(Grammar.java)

classGrammarNode//文法产生式规则

{

Stringleft;//:

:

=左侧非终结符

String[]right;//:

:

=右侧产生式规则

}

classGrammar

{

GrammarNode[]grammar=newGrammarNode[100];//存储产生式规则

String[]VN=newString[50];//存储非终结符

String[]VT=newString[50];//存储终结符

introw=0,vn=0,vt=0,maxrule=0;//产生式规则个数非终结符个数终结符个数最多产生式规则数

publicGrammar(Stringinput[])//构造函数存储文法

publicStringgetGrammar()//输出文法

}

3.1.3推导类(Derivation.java)

classDerivationNode//推导

{

String[]str;//存储推导

intstrlength,pos;//推导符号个数最左非终结符号位置

DerivationNode(String[]s,intl,intp)//用于构造derivation[0]

DerivationNode(DerivationNoden)//拷贝构造函数

booleanequaltoStart(StringIDtarget[])//判断之前的推导是否正确

booleannext(Grammarg,intrule)//根据产生式规则进行变换变换失败返回false

}

classDerivation

{

Grammarg;//用户给定文法

DerivationNode[]derivation;//存储推导过程

String[]ID;//标识符数组

intinputlength,step,idcount;//句子长度推导步骤数记录标识符数组个数用于建树

privateString[]target,IDtarget;//输入句子规范化输入

privatebooleanfinnish,reverse;//推导是否完成是否改变产生式规则的顺序

privatelongstarttime;//推导开始时间

privatelongendtime;//推导结束时间

publicDerivation(GrammarG)//构造函数

privatebooleanisID(Stringtemp)//判断是否为标识符

publicvoidleftDerivation(Stringinput)//最左推导

privatevoidLeftDerivation(inti,booleanreverse)//最左推导调用的递归函数

publicStringgetDerivati

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

当前位置:首页 > 小学教育 > 英语

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

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